BeanFactory和ApplicationContext
本章介绍BeanFactory和ApplicationContexctory和容器级别之间的差异和影响。
从容器的角度来说,BeanFactory和ApplicationContext都能当做容器去使用。
官方文档推荐使用ApplicationContext或者使用AnnotationConfigApplicationContext或者是他的子类org.springframework.context.annotation.AnnotationConfigApplicationContext作为自定义引导类。
ApplicationContext包含BeanFactory的所有功能,并在容器的基础上做了很多扩展,比如集成bean生命周期管理,包括自动注、册国际化、内置的发布机制。
对于许多扩展容器功能,例如注解处理和AOP代理, BeanPostProcessor扩展点是必不可少的。如果仅使用普通的DefaultListableBeanFactory,则默认情况下不会检测到并激活此类后置处理器。
特点 | Bean Factory | ApplicationContext |
---|---|---|
Bean Bean实例化/装配 | 支持 | 支持 |
集成生命周期管理 | 不支持 | 支持 |
自动注册BeanPostProcessor | 不支持 | 支持 |
自动注册BeanFactoryPostProcessor | 不支持 | 支持 |
Messagesource 国际化 | 不支持 | 支持 |
内置ApplicationEvent 发布机制 | 不支持 | 支持 |
使用BeanFactory注册BeanPostProcessor,需要手动去注册Bean的后置处理器:
public static void main(String[] args) {
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
//自動裝配后置处理器
factory.addBeanPostProcessor(new AutowiredAnnotationBeanPostProcessor());
// 自定义bean的后置处理器
factory.addBeanPostProcessor(new MyBeanPstProcessor());
}
如果使用BeanFactory注册BeanFactoryPostProcessor,需要手动去注册BeanFactory的后置处理器:
public static void main(String[] args) {
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new FileSystemResource("beans.xml"));
// 从配置文件中读取属性
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource("jdbc.properties"));
cfg.postProcessBeanFactory(factory);
}
在这两种情况下,显示使用BeanFactory作为容器使用很麻烦,这就是为什么各种ApplicationContext变体优先于Spring支持的应用程序中的普通DefaultListableBeanFactory, 尤其是在典型企业设置中依赖BeanFactoryPostProcessor 和 BeanPostProcessor实例来扩展容器功能时。
AnnotationConfigApplicationContext具有注册的所有常见注解后置处理器,并且可以通过配置注解(例如@EnableTransactionManagement)在封面下引入其他处理器。 在Spring的基于注解的配置模型的抽象级别,bean的后置处理器的概念变成仅仅是内部容器细节。