我之前在解读Spring IOC源码的时候,经常看到源码中有对FactoryBean特殊处理的逻辑。

说起FactoryBean就不得不提BeanFactory,因为面试官老喜欢问它们的区别。

  1. BeanFactory:spring容器的顶级接口,管理bean的工厂。
  2. FactoryBean:并非普通的工厂bean,它隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利。

如果你看过spring源码,会发现它有70多个地方在用FactoryBean接口。

image

上面这张图足以说明该接口的重要性,请勿忽略它好吗?

特别提一句:mybatis的SqlSessionFactory对象就是通过SqlSessionFactoryBean类创建的。

我们一起定义自己的FactoryBean:

@Component
public class MyFactoryBean implements FactoryBean {


    @Override
    public Object getObject() throws Exception {
        String data1 = buildData1();
        String data2 = buildData2();
        return buildData3(data1, data2);
    }


    private String buildData1() {
        return "data1";
    }


    private String buildData2() {
        return "data2";
    }


    private String buildData3(String data1, String data2) {
        return data1 + data2;
    }




    @Override
    public Class<?> getObjectType() {
        return null;
    }
}

获取FactoryBean实例对象:

@Service
public class MyFactoryBeanService implements BeanFactoryAware {
    private BeanFactory beanFactory;


    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }


    public void test() {
        Object myFactoryBean = beanFactory.getBean("myFactoryBean");
        System.out.println(myFactoryBean);
        Object myFactoryBean1 = beanFactory.getBean("&myFactoryBean");
        System.out.println(myFactoryBean1);
    }
}
  1. getBean("myFactoryBean");获取的是MyFactoryBeanService类中getObject方法返回的对象,
  2. getBean("&myFactoryBean");获取的才是MyFactoryBean对象。
最后修改:2026 年 06 月 05 日
如果觉得我的文章对你有用,请随意赞赏