今天主要从以下两方面来介绍一下FactoryBean

  • FactoryBean是什么

  • FactoryBean使用演示


在读这篇文章之前推荐阅读以下两篇文章,可能连贯性会好点


推荐


深入理解spring注解之@Bean注解

一分钟学会spring注解之@Import注解


1,FactoryBean是什么


FactoryBean从名字来看以bean结尾那应该就是一个bean吧,没错它确实是一个bean不同于普通Bean的是:它是实现了FactoryBean<T>接口的Bean,根据该Bean的ID从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身,如果要获取FactoryBean对象,请在id前面加一个&符号来获取


2,FactoryBean使用演示


首先咱们一起来看下FactoryBean的源代码如下:


public interface FactoryBean<T> {
   /**
    * 获取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<Circular>{
   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前面加一个&符号来获取



以上是今天文章的所有内容,欢迎大家吐槽



更多优质文章请关注以下公众号查阅:


一分钟了解spring之FactoryBean_spring