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,来指定初始化方法。
posted @ 2023-03-05 16:49  一个苦逼的23届毕业生  阅读(21)  评论(0编辑  收藏  举报