今天主要从以下两方面来介绍一下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前面加一个&符号来获取

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

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

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1