首先从字面理解: FactoryBean -->工厂Bean; BeanFactory -->Bean工厂。
即: FacttoryBean 是一个bean, BeanFactory 是bean的工厂。
使用:
1、BeanFactory: 提供获取bean的API。
2、FactoryBean:
public class TestBeanFactory implements FactoryBean {
@Override
public Object getObject() throws BeansException {
//用户自己创建对象
TestInBean testInBean = new TestInBean();
testInBean.setName("zs");
return testInBean;
}
@Override
public boolean isSingleton() {
return false;
}
@Override
public PropertyValues getPropertyValues() {
return null;
}
}
applicationContext.xml
<beans>
<bean id="TestFactoryBean" class="org.springframework.z_test.com.bean.TestBeanFactory"></bean>
</beans>
测试类:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml");
Object testFactoryBean = applicationContext.getBean("TestFactoryBean");
System.out.println(testFactoryBean);
输出结果:
TestInBean{name='zs', age=null}
上述案例TestBeanFactory 实现了FactoryBean接口,并且将FactoryBean交由Spring进行管理(配置文件),在获取对象的时候获取到的是用户自定义创建的对象 TestInBean,而不是TestBeanFactory。
原理:从Spring容器中获取到的bean对象是FactoryBean或者是实现FactoryBean的,会使用getObject()获取到真实的bean对象,这个对象是由用户自己进行创建管理的,体现了扩展性
通过上述可以得到:
BeanFactory提供了获取Bean的方式,(BeanFactory是Spring核心接口之一)
FactoryBean是一个特殊的bean,实现该接口可以自定义实现bean的创建逻辑(扩展性)。