ApplicationContext和BeanFactory
ApplicationContext和BeanFactory
BeanFactory
- BeanFactory是spring的IOC容器的核心,Spring 使用 BeanFactory 来实例化、配置和管理 Bean。
- 常用的BeanFactory核心实现有:DefaultListableBeanfactory、XmlBeanFactory、ApplicationContext等,最常用的就是XmlBeanFactory,根据xml文件中的配置加载bean。
ApplicationContext
- 继承自接口BeanFactory,不仅包含BeanFactory中的所有功能,还拓展了很多功能:
- 继承MessageSource,因此支持国际化
- 统一的资源文件访问方式。(常用:ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebApplicationContext)
- 强大的事件机制event
- 自动注册BenaPostProcessor、BeanFactoryPostProcessor等
两者对比
- BeanFactory采用懒加载的方式注入bean,也就是只有用到bean的时候,容器才会去加载它,可能出现某个bean的某个属性没有注入,导致使用的时候报错。
而ApplicationContext在容器启动的时候,就加载好了所有的bean。不足之处就是占用内存空间,当bean数量很多时,容器启动较慢。 - BeanFactory和ApplicationContext都支持BeanPostProcessor和BeanFactoryPostProcessor,不同的是BeanFactory需要手动注册,而ApplicationContext是自动注册。
- beanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 Applicationcontex 主要面对与 spring 使用的开发者。基本都会使用 Applicationcontex 并非 beanFactory 。
ApplicationContext常见实现
ClassPathXmlApplicationContext:类路径加载
FileSystemXmlApplicationContext:文件系统路径加载
AnnotationConfigApplicationContext:用于基于注解的配置
WebApplicationContext:专门为web应用准备的,从相对于Web根目录的路径中装载配置文件完成初始化
BeanPostProcessor和BeanFactoryPostProcessor
BeanFactoryPostProcessor
- 实现该接口,可以在 Spring 创建 bean 之前修改 bean 的定义属性。也就是说,Srping 允许 BeanFactoryPostProcessor 在容器实例化 bean 之前读取配置元数据,并可以根据需要进行修改。例如可以把 bean 的 Scope 从 singleton 改为 prototype ,也可以把 property 的值给修改掉。另外可以同时配置多个 BeanFactoryPostProcessor,并通过 order 属性来控制
BeanPostProcessor
- BeanPostProcessor 可以在 spring 容器实例化 bean 之后,在执行 bean 的初始化方法前后,添加一些自己的处理逻辑。 这里说的初始化方法,指的是以下两种:
- 1.bean 实现 了 InitializingBean 接口,对应的方法为 afterPropertiesSet 。
- 2.在 XML 文件中定义 bean 的时候,
<bean>
标签有个属性叫做 init-method,来指定初始化方法。