Spring 中 BeanFactory 是什么?
BeanFactory
其实就是IoC
的底层容器,它本身只是一个接口,顾名思义Bean工厂,定义了Spring的基本功能框架,主要功能就是
-
负责从配置源中读取 Bean 的定义,并创建、管理这些 Bean 的生命周期
-
然后是延迟初始化,它只会在 Bean 首次请求时才会实例化该 Bean,而不是在容器启动时就立即创建所有的Bean
Spring 中的 FactoryBean 是什么?
FactoryBean
是 Spring 提供的一个特殊接口,允许开发者通过自定义的逻辑创建Bean 实例。它提供了更加灵活的初始化定制功能
FactoryBean
接口有几个主要的方法
-
getObject()
: 返回此工厂创建的对象的实例。该返回值会被存储到IoC
容器,解决循环依赖的第三级缓存就是工厂bean -
isSingleton()
: 判断此FactoryBean
是否返回单例 -
getObjectType()
: 返回getObject()
方法返回的对象类型
假设你依赖一个第三方的类HappyMachine,而我们又不能修改第三方的类,并且这个对象创建比较复杂,那么你就可以创建一个 bean 来封装它:
// 实现FactoryBean接口时需要指定泛型 // 泛型类型就是当前工厂要生产的对象的类型 public class HappyFactoryBean implements FactoryBean<HappyMachine> {private String machineName;public String getMachineName() { //get setreturn machineName;}public void setMachineName(String machineName) {this.machineName = machineName;}@Overridepublic HappyMachine getObject() throws Exception { //实例工厂bean,获取bean// 方法内部模拟创建、设置一个对象的复杂过程HappyMachine happyMachine = new HappyMachine();happyMachine.setMachineName(this.machineName);return happyMachine; //返回对象}@Overridepublic Class<?> getObjectType() {// 返回要生产的对象的类型return HappyMachine.class;} }
这样,我们getBean("A”)
会得到 A FactoryBean#getObject 的结果,如果单纯只想要 A的FactoryBean那么加个“&”即可,即 getBean("&A")
ApplicationContext ioc = new ClassPathXmlApplicationContext("...."); HappyMachine happyMachine = ioc.getBean("happyMachine"); //返回的是getObject方法返回的对象 // &happyMachine7 这是一种固定的约束 Object bean = iocContainer.getBean("&happyMachine"); //如果想要获取FactoryBean对象, 直接在id前添加&符号即可!