在Spring BeanFactory容器中管理两种bean
- 1.标准Java Bean
- 2.另一种是工厂Bean, 即实现了FactoryBean接口的bean 它不是一个简单的Bean 而是一个生产或修饰对象生成的工厂Bean
- 3.在向Spring容器获得bean时 对于标准的java Bean 返回的是类自身的实例
- 4.而FactoryBean 其返回的对象不一定是自身类的一个实例,返回的是该工厂Bean的getObject方法所返回的对象
简单的例子如下:
public class SayHelloFactoryBeanImpl implements FactoryBean {
/**
* 返回该工厂生成的bean
*/
public Object getObject() throws Exception {
return new ChinaSayHelloServiceImpl();
}
/**
* getObject返回对象对应的Class
*/
public Class getObjectType() {
return ChinaSayHelloServiceImpl.class;
}
/**
* getObject返回的对象 是否是一个单例
*/
public boolean isSingleton() {
return false;
}
}
<bean id="sayHelloFactoryBean" class="com.xx.service.impl.SayHelloFactoryBeanImpl" />
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:applicationContext-server.xml"}, true);
//bean的 getObject方法 返回的对象
Object object = context.getBean("sayHelloFactoryBean");
System.out.println(object);
当一个受Spring容器管理的bean 如果实现了FactoryBean接口 在bean实例化(getBean)阶段 Spring会调用该bean的getObejct方法 返回的不一定是自身的实例
Spring 框架中有很多FactoryBean
- RmiProxyFactoryBean,
- SqlMapClientFactoryBean.
- LocalSessionFactoryBean
最后关于Spring容器是如何针对普通的bean和factoryBean做出不同的响应的,可以参看AbstractBeanFactory getBean方法入口:具体的分析见http://blog.youkuaiyun.com/java2000_wl/article/details/7410714