今天主要从以下两方面来介绍一下FactoryBean
FactoryBean是什么
FactoryBean使用演示
在读这篇文章之前推荐阅读以下两篇文章,可能连贯性会好点
推荐
1,FactoryBean是什么
FactoryBean从名字来看以bean结尾那应该就是一个bean吧,没错它确实是一个bean,不同于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,请在id前面加一个&符号来获取
2,FactoryBean使用演示
首先咱们一起来看下FactoryBean的源代码如下:
public interface FactoryBean{ /** * 获取bean对应的实例对象 * @return * @throws Exception */ T getObject() throws Exception; /** * 获取factoryBean获取到的实例类型 * @return */ Class getObjectType(); /** * factoryBean创建的实例是否是单实例 * @return */ boolean isSingleton(); }
可以发现FactoryBean是一个接口主要有3个方法,每个方法的意思代码中都有注释这个就不重复了
下面我们通过FactoryBean来创建一个图形Circular的bean,代码如下:
/** * 创建一个自定义的spring的FactoryBean * * @author zhangqh * @date 2018年5月2日 */ public class MyFactoryBean implements FactoryBean{ public Circular getObject() throws Exception { return new Circular(); } public Class getObjectType() { return Circular.class; } /** * 是否是单实例的,可以通过改变返回值测试效果 */ public boolean isSingleton() { return true; } }
再在MainConfig主配置中增加一个bean如下:
@Bean public MyFactoryBean getMyFactoryBean(){ return new MyFactoryBean(); }
测试代码如下:
AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class); Object object = applicationContext2.getBean("getMyFactoryBean"); System.out.println("实例bean为 === "+object); Object object2 = applicationContext2.getBean("&getMyFactoryBean"); System.out.println("实例bean为 === "+object2);
运行结果如下:
实例bean为 === com.zhang.bean.Circular@3bd94634 实例bean为 === com.zhang.bean.MyFactoryBean@58a90037
怎么样注意上面测试的打印结果,是不是跟我们开头说的那样根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,请在id前面加一个&符号来获取
以上是今天文章的所有内容,欢迎大家吐槽
更多优质文章请关注以下公众号查阅: