首页 > 编程语言 >浅析Spring IoC源码(七)浅谈BeanFactory和FactoryBean

浅析Spring IoC源码(七)浅谈BeanFactory和FactoryBean

时间:2023-11-08 17:34:16浏览次数:28  
标签:11 factorybean return 浅谈 class 浅析 源码 org public



这一节我们就简单的介绍一下FactoryBean,知道这个接口的作用和意义,方便我们refresh()这个方法的理解

照旧,我们依旧先看源码,从源码中查看一下他的作用吧~

浅析Spring IoC源码(七)浅谈BeanFactory和FactoryBean_java

这次就不一句句翻译了(太多了),还是稍微大概的讲一下意思吧:FactoryBean是一个接口,任何一个Bean可以实现这个接口,那么这个bean将成为一个Factory,这个Factory将一些对象暴露出去,这些对象不一定是它们自己,返回的是一个Object对象,这个对象将通过getObject()暴露出去,并且支持单例和prototypes


这个接口有多重要?

浅析Spring IoC源码(七)浅谈BeanFactory和FactoryBean_spring_02

看看这段:这个接口在spring自己的框架中被大篇幅的运用到,举例来说,AOP中link org.springframework.aop.framework.ProxyFactoryBean和org.springframework.jndi.JndiObjectFactoryBean


但是他在非底层代码建设之外并不常见~



好了,看了官方的注释,还是有点模糊的吧,不过我们可以再看看ProxyFactoryBean这个官方的代码,其实看名字,“代理”,这个接口可以用于代理,想想也是,“任何bean实现了BeanFactory都可以通过getObject()这个方法去返回一个Object类型的bean,这个就很重要了”


接下来,还是老规矩,我们举个例子,来具体说明这个接口的作用,我们也做一个Proxy,通过切换注入数据库的名字,切换给出的数据库操作,如果我们注入MySQL我们就可以操作数据到mysql,如果注入Redis我们可以操作数据到redis


首先定义一个数据库操作接口

DBOperation.Java


1. <span style="color:#000000;">package org.study.spring.factorybean;  
2.   
3. /**
4.  * 
5.  * 数据库操作对象
6.  */  
7. public interface DBOperation<T extends DBEntity> {  
8.       
9. int save(T t);  
10.       
11. int update(T t);  
12.       
13. int delete(T t);  
14.       
15.     T select(Integer id);  
16.       
17.   
18. }</span>


DBEntity.java


1. <span style="color:#000000;">package org.study.spring.factorybean;  
2.   
3. /**
4.  * 
5.  * 数据库保存对象
6.  *
7.  */  
8. public class DBEntity {  
9.       
10. private Integer id;  
11.   
12. public Integer getId() {  
13. return id;  
14.     }  
15.   
16. public void setId(Integer id) {  
17. this.id = id;  
18.     }  
19.       
20.   
21. }</span>


MysqlDB.java


1. <span style="color:#000000;">package org.study.spring.factorybean;  
2.   
3. /**
4.  * mysql数据操作
5.  * @author
6.  *
7.  */  
8. public class MysqlDB implements DBOperation<MysqlDBEntity>{  
9.   
10. public int save(MysqlDBEntity t) {  
11. "save object to mysql");  
12. return 1;  
13.     }  
14.   
15. public int update(MysqlDBEntity t) {  
16. "update object to mysql");  
17. return 0;  
18.     }  
19.   
20. public int delete(MysqlDBEntity t) {  
21. "delete object from mysql");  
22. return 0;  
23.     }  
24.   
25. public MysqlDBEntity select(Integer id) {  
26. return new MysqlDBEntity();  
27.     }  
28. }</span>

RedisDB.java



1. <span style="color:#000000;">package org.study.spring.factorybean;  
2.   
3.   
4. /**
5.  * 
6.  * redis数据库操作
7.  *
8.  */  
9. public class RedisDB implements DBOperation<RedisDBEntity>{  
10.   
11. public int save(RedisDBEntity t) {  
12. "save this object"+t.getJsonStr());  
13. return 1;  
14.     }  
15.   
16. public int update(RedisDBEntity t) {  
17. "update this object"+t.getJsonStr());  
18. return 0;  
19.     }  
20.   
21. public int delete(RedisDBEntity t) {  
22. "delete this object"+t.getJsonStr());  
23. return 1;  
24.     }  
25.   
26. public RedisDBEntity select(Integer id) {  
27. "select this object by id "+id);  
28. return new RedisDBEntity();  
29.     }  
30.       
31.   
32. }</span>


MysqlDBEntity.java




1. <span style="color:#000000;">package org.study.spring.factorybean;  
2.   
3.   
4. public class MysqlDBEntity extends DBEntity{  
5.       
6. private String attribute;  
7.   
8. public String getAttribute() {  
9. return attribute;  
10.     }  
11.   
12. public void setAttribute(String attribute) {  
13. this.attribute = attribute;  
14.     }  
15.   
16. }</span>


RedisDBEntity.java




1. <span style="color:#000000;">package org.study.spring.factorybean;  
2.   
3. public class RedisDBEntity extends DBEntity {  
4.       
5. private String jsonStr;  
6.   
7. public String getJsonStr() {  
8. return jsonStr;  
9.     }  
10.   
11. public void setJsonStr(String jsonStr) {  
12. this.jsonStr = jsonStr;  
13.     }  
14.       
15.   
16. }</span>


ProxyDBObject.java


1. <span style="color:#000000;">package org.study.spring.factorybean;  
2.   
3. import org.springframework.beans.factory.FactoryBean;  
4.   
5.   
6. /**
7.  * 
8.  * DB代理,根据用户注入数据库的名称,自动返回对应的数据库操作给用户
9.  *
10.  */  
11. public class ProxyDBObject implements FactoryBean<Object>{  
12.       
13. private String currentDB;  
14.       
15.   
16. public String getCurrentDB() {  
17. return currentDB;  
18.     }  
19.   
20. public void setCurrentDB(String currentDB) {  
21. this.currentDB = currentDB;  
22.     }  
23.   
24. public Object getObject() throws Exception {  
25. if("mysql".equals(currentDB)){  
26. return new MysqlDB();  
27.         }  
28. return new RedisDB();  
29.     }  
30.   
31. public Class<?> getObjectType() {  
32. if("mysql".equals(currentDB)){  
33. return MysqlDB.class;  
34.         }  
35. return RedisDB.class;  
36.     }  
37.   
38. public boolean isSingleton() {  
39. return false;  
40.     }  
41.   
42.        
43.        
44.   
45. }</span>


factory-bean.xml


1. <?xml version="1.0" encoding="UTF-8"?>  
2. <beans xmlns="http://www.springframework.org/schema/beans"  
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
4. xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"  
5. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jee="http://www.springframework.org/schema/jee"  
6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
7.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd  
8.         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd  
9.         http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd  
10. >  
11.    
12.       
13.             
14. <bean id="proxyDB" class="org.study.spring.factorybean.ProxyDBObject">  
15. <property name="currentDB" value="mysql"/>  
16. </bean>  
17.   
18. </beans>

ProxyDBObjectTest.java


当配置currentDB为“mysql”时,运行结果是:

1. package org.study.spring.factorybean;  
2.   
3. import org.junit.Test;  
4. import org.springframework.context.ApplicationContext;  
5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
6.   
7. public class ProxyDBObjectTest{  
8.       
9.       
10. @Test  
11. public void test2() throws Exception{  
12. new ClassPathXmlApplicationContext("factory-bean.xml");  
13. "proxyDB",DBOperation.class);  
14. new MysqlDBEntity();  
15.          dBoperation.save(dbEntity);  
16.     }  
17.   
18. }

浅析Spring IoC源码(七)浅谈BeanFactory和FactoryBean_sql_03

切换到redis会报错,因为我们保存的对象是mysqlDBEntity,转换异常

真实开发环境中,可以有2个开发人员,一个写mysql的保存,一个写redis的保存~

举了这么一个例子,其实就只是帮助大家稍微理解一下factoryBean干嘛的,相当于beanfactory.getbean这个返回的bean就是factorybean中getObject中返回的对象

那我们怎么才能够通过beanfactory获取factorybean呢,嘿嘿,其实beanfactory源码中已经有了说明:

浅析Spring IoC源码(七)浅谈BeanFactory和FactoryBean_spring_04

通过前缀引用来区分本身和factoryBean,举例说明,如果一个bean叫做myJndiObject,那么getBean("myJndiObject")将获取该bean,如果getBean("&myJndiObject")将获取FactoryBean

修改上面的ProxyDBObjectTest.java


1. <span style="color:#000000;">package org.study.spring.factorybean;  
2.   
3. import org.junit.Test;  
4. import org.springframework.beans.factory.FactoryBean;  
5. import org.springframework.context.ApplicationContext;  
6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
7.   
8. public class ProxyDBObjectTest{  
9.       
10.       
11. @Test  
12. public void test2() throws Exception{  
13. new ClassPathXmlApplicationContext("factory-bean.xml");  
14. "&proxyDB",FactoryBean.class);  
15.          DBOperation db = (DBOperation)factoryBean.getObject();  
16. new MysqlDBEntity();  
17.          db.save(dbEntity);  
18.     }  
19.   
20. }</span>


"&"符号可以获取本身,其实吧,BeanFactory和FactoryBean根本没有本质的关联,而且他们都是根接口,没有紧密的关系

关于FactoryBean在Aop中的运用,我们到了AOP再说,我们还是先分析IoC吧~


标签:11,factorybean,return,浅谈,class,浅析,源码,org,public
From: https://blog.51cto.com/u_809530/8256938

相关文章

  • geonetwork源码编译与开发入门说明
    本文介绍geonetwork源码编译及简单的开发修改。本文包括源码调试的细节,主要给没怎么接触过java又想调试修改部分java代码的提供一定帮助,比如控制器或修改业务逻辑中的增删改操作等本文使用环境:操作系统:Windows11JDK版本:jdk-8u381-windows-x64.exeMaven版本:apache-maven-3.9.......
  • 多语言企业网站源码可以获得吗?saas建站系统源码
    作为一个企业,建立自己的网站是必不可少的。而随着全球化的趋势,多语言企业网站的需求也越来越大。因此,寻找一套适合自己企业的多语言企业网站源码变得十分重要。多语言企业网站源码的意义现代企业需要一个具备多语言功能的网站,这样可以拓展市场,提高企业知名度,并且可以更好地满足不同......
  • B/S架构医院HIS绩效考核系统源码
    医院HIS绩效考核系统是一种以人力资源管理为基础,选用适合医院组织机构属性的绩效理论和方法,基于医院管理目标,构建全方位的绩效考评体系,在科学、合理的绩效管理体系基础上,采用科学管理的方法,如平衡计分卡的管理理念与方法,选取关键指标,对目标的执行进行管理、考核、分析、评价,最终结......
  • app直播源码,uniapp随机数生成签名
    app直播源码,uniapp随机数生成签名1、首先,需要引入node.js内置模块crypto,它提供了一些加密相关的函数和方法。可以在项目的common文件夹下新建一个js文件,例如utils.js,并在其中定义一个生成随机串的方法,例如: //引入node.js内置模块cryptoconstcrypto=require('cr......
  • java一体化医疗信息管理系统源码:云HIS、云病历、云LIS
    基于云计算技术的B/S架构的HIS系统,为医疗机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。系统利用云计算平台的技术优势,建立统一的云HIS、云病历、云LIS,有效实现实现协同门诊、住院、药房药库管理、双向转诊转......
  • 医院HIS手术麻醉临床信息管理系统源码 实现术前、术中、术后全流程管理
    手术麻醉系统是一套以数字形式与医院信息系统(如HIS、EMR、LIS、PACS等)和医疗设备等软、硬件集成并获取围手术期相关信息的计算机系统,其核心是对围手术期患者信息自动采集、储存、分析并呈现。该系统通过整合围手术期中病人信息、人员信息、手术信息、物品信息等内容,可提供全套标准......
  • 学生毕业管理系统-计算机毕业设计源码+LW文档
    摘 要对学生毕业管理的流程进行科学整理、归纳和功能的精简,通过软件工程的研究方法,结合当下流行的互联网技术,最终设计并实现了一个简单、易操作的学生毕业管理小程序。内容包括系统的设计思路、系统模块和实现方法。系统使用过程主要涉及到管理员,教师和学生三种角色,主要包含系统......
  • 农业电商服务系统-计算机毕业设计源码+LW文档
    摘要时代在飞速进步,每个行业都在努力发展先进技术,通过这些先进的技术来提高自己的水平和优势,农业电商服务系统当然不能排除在外。农业电商服务系统是在实际应用和软件工程的开发原理之上,运用Java语言以及ssm框架进行开发。首先要进行需求分析,分析出农业电商服务系统的主要功能,然......
  • 使命召唤游戏助手的设计与实现-计算机毕业设计源码+LW文档
    摘 要近年来,随着互联网的蓬勃发展,游戏公司对信息的管理提出了更高的要求。传统的管理方式已无法满足现代人们的需求。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,随着各行业的不断发展,使命召唤游戏助手建设也逐渐进入了信息化的进程。这个系统的设计主要包括系统......
  • 微信小程序的图书管理系统-计算机毕业设计源码+LW文档
    摘 要对图书管理的流程进行科学整理、归纳和功能的精简,通过软件工程的研究方法,结合当下流行的互联网技术,最终设计并实现了一个简单、易操作的图书管理小程序。内容包括系统的设计思路、系统模块和实现方法。系统使用过程主要涉及到管理员和用户两种角色,主要包含个人信息修改,用户......