Spring IoC 接口设计图
三条主要设计路线:
HierarchicalBeanFactory: 增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲IoC容器的管理功能
ConfigurableBeanFactory: 定义了一些对BeanFactory的配置功能,比如通过SetParentBeanFactory()设置双亲IoC容器
通过addBeanPostProcessor()配置Bean后置处理器等
2. 以ApplicationContext为核心的接口设计.
这里涉及到BeanFactory -> ListableBeanFactory -> ApplicationContext -> WebApplicationContext 或者 ConfigurableApplictionContext
其中ListableBeanFactory 连接BeanFactory, 细化了BeanFactory的接口功能, 比如定义了getBeanDefinitionNames()
ApplicationContext: 通过集成MessageSource,ResuourceLoadder,ApplicationEventPublisher接口, 在BeanFactory简单IoC容器的基础上,添加了许多对高级容器特性的支持.
BeanFactory 应用场景
BeanFactory提供 最基本IoC容器的功能, IoC容器所应遵守的最底层和最基本的编程规范
在用户使用容器时,可以通过转义符&来得到FactoryBean本身
FactoryBean与BeanFactory:
一个是Factory,也就是IoC容器或对象工厂
一个是Bean,
在Spring中,所有的Bean都是有BeanFactory(也就是IoC容器来管理的)
但对于FactoryBean而言,这个Bean不是简单的Bean,而是一个能产生或修饰对象生成工厂的Bean,它的实现与设计模式中的工厂模式和修饰器模式类似
看一段代码
public class ProxyDBObject implements FactoryBean<Object> { //实现了FactoryBean接口
private String currentDB;
@Override
public Object getObject() {
if("mysql".equals(currentDB)){
return new MysqlDB();
}
return new OracleDB();
}
@Override
public Class<?> getObjectType() {
if("mysql".equals(currentDB)){
return MysqlDB.class;
}
return OracleDB.class;
}
public String getCurrentDB() {
return currentDB;
}
public void setCurrentDB(String currentDB) {
this.currentDB = currentDB;
}
}
Spring配置文件
<bean id="proxyDBObject" class="com.chenhe.factorybean.ProxyDBObject">
<property name="currentDB" value="mysql"/>
</bean>
测试类
//proxyDBObject并不是ProxyDBObject,而是它getObject()方法返回的Bean
Object proxyDBObject = context.getBean("proxyDBObject");
//通过&符号,才能获取到ProxyDBObject类型的Bean
proxyDBObject = context.getBean("&proxyDBObject");
凡是实现了FactoryBean接口的类,都不能直接通过applocationContext.get(beanName)的方式直接获取该Bean,要通过加上&才能获取该Bean, 否则获取的永远都是getObject()返回的Bean