茂展的分享博客

Spring底层巩固

Spring底层巩固

BeanFactory ApplicationContext

BeanFactory

BeanFactory实际上是实例化,配置和管理众多bean的容器。这些bean通常会彼此合作,因而他们之间会产生依赖。
Spring使用BeanFactory来实例化、配置、管理Bean,是IOC容器的核心接口,定义了IOC的基本功能。

切记BeanFactory只管理单例Bean的生命周期。它不能管理原型(prototype,非单例)Bean 的生命周期。因为原型Bean实例被创建之后便被传给了客户端,容器失去了对它们的引用

ApplicationContext

ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置实现。
由于ApplicationContext是BeanFactor的派生,则拥有BeanFactory的所有功能,另外增加了更多的扩展

增加了如下的扩展:

  1. MessageSource, 提供国际化的消息访问
  2. 资源访问,如URL和文件
  3. 事件传播特性,即支持aop特性
  4. 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层

ApplicationContext:是IOC容器另一个重要接口, 它继承了BeanFactory的基本功能, 同时也继承了容器的高级功能,如:MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布接口)

BeanFactory ApplicationContext区别

  1. BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。 相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。
    BeanFacotry延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用 ApplicationContext。
    应用上下文则会在上下文启动后预载入所有的单实例Bean。通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。
  2. BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

Bean的生命周期

关于Bean的初始化和销毁,可以有以下方法

Bean的初始化和销毁操作

跟源码之后,发现BeanPostProcess源码之后,内部原理

BeanPostProcess原理

在spring中有很多地方用到了BeanPostProcess原理,例如:
1.@Sync注解
2.@PostConstruct,@PreDesrory
3.@Autowired
4.类实现ApplicationContextAware往类中注入ioc容器(ApplicationContext)

这篇博客,关于Bean的生命周期流程图写的很好,借鉴一下,自己跟底层源码证实了正确性!
bean的生命周期

BeanFactoryAware和BeanNameAware

实现 BeanFactoryAware 接口的 bean 可以直接访问 Spring 容器,被容器创建以后,它会拥有一个指向 Spring 容器的引用。

BeanFactoryAware 接口只有一个方法void setBeanFactory(BeanFactorybeanFactory)。配置和一般的bean一样。

如果某个 bean 需要访问配置文件中本身的 id 属性,则可以使用 BeanNameAware 接口,该接口提供了回调本身的能力。实现该接口的 bean,能访问到本身的 id 属性。该接口提供一个方法:void setBeanName(String name)。

Spring 提供了以下 5 中标准的事件

1.上下文更新事件(ContextRefreshedEvent):该事件会在 ApplicationContext 被初始化或者更新时发布。也可以在调用 ConfigurableApplicationContext 接口中的 refresh()方法时被触发。
2.上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的 Start()方法开始/重新开始容器时触发该事件。
3.上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的 Stop()方法停止容器时触发该事件。
4.上下文关闭事件(ContextClosedEvent):当 ApplicationContext 被关闭时触发该事件。容器被关闭时,其管理的所有单例 Bean 都被销毁。
5.请求处理事件(RequestHandledEvent):在 Web 应用中,当一个 http 请求(request)结束触发该事件。

------本文结束感谢阅读------
🐶 您的支持将鼓励我继续创作 🐶