AOP,Bean以及Bean的生命周期

Spring中的基本概念

什么是Spring Bean

Bean就相当于定义一个组件,这个组件是用于具体实现某个功能的。

在Spring文档的官方解释是:在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由Spring IoC 容器实例化、组装和管理的对象。

简单说明一下就是:

  • bean 是对象,一个或者多个不限定
  • bean 由 Spring 中一个叫 IoC 的东西管理的
  • 我们的应用程序由一个个 bean 构成
  • Bean就是Spring当中的最小执行单位
什么是IOC

IOC(Inversion of Control,控制反转)Spring IOC它的主要作用是将对象的创建和依赖关系的管理交给 Spring 容器来处理,而不是在代码中手动创建和管理对象。

控制反转通过依赖注入(DI)方式实现对象之间的松耦合关系。程序运行时,依赖对象由辅助程序动态生成并注入到被依赖对象中,动态绑定两者的使用关系。Spring IoC 容器就是这样的辅助程序,它负责对象的生成和依赖的注入,然后再交由我们使用。

通过这种方式,Spring IOC 实现了松耦合设计,使得代码更易于维护和测试。你可以简单地理解为,Spring IOC 容器就像一个“中介”,它负责根据你的需求提供合适的对象,并管理它们的依赖关系和生命周期。

什么是AOP

aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等

img

Bean的生命周期

Spring Bean的生命周期是指Bean在Spring容器中从创建到销毁的整个过程。该过程由Spring IOC容器进行管理。

image-20240808095043043

可以分为三个过程:生产,使用以及销毁

1.生产Bean:

image-20240808095603408

1.加载Bean定义

通过 loadBeanDefinitions 扫描所有xml配置、注解将Bean记录在beanDefinitionMap中

2.创建Bean对象

通过 createBean 遍历 beanDefinitionMap 创建bean

2.1.构建对象

  1. 容器通过 createBeanInstance 进行对象构造
  2. 获取构造方法:@Autowired
  3. 准备参数 根据类查找>参数名查找
  4. 构造对象
  5. 无参对象直接实例化

2.2.填充属性

通过populateBean方法为Bean内部所需的属性进行赋值

  • 通常是 @Autowired 注解的变量

2.3初始化Bean对象

通过initializeBean对填充后的实例进行初始化

2.3.1填充初始化容器相关信息

通过 invokeAwareMethods 方法:为实现aware接口【信息感知接口】的Bean 设置注入beanName、beanFactory等容器信息

2.3.2初始化构造方法

通过 invokeInitMethods 方法进行初始化:

如果Bean实现InitializingBean接口进行处理【未实现则不进行】

  • afterPropertiesSet方法【bean填充属性后执行】
  • initMethod 方法

2.3.3Bean的后置处理

invokeInitMethods 的前后进行

  • applyBeanPostProcessorsBeforeInitialization
  • invokeInitMethods
  • applyBeanPostProcessorsAfterInitialization

在后置处理中处理了包括:AOP【AnnotationAwareAspectJAutoProxyCreator】

负责 构造后@PostConstruct销毁前@PreDestroy 的 InitDestoryAnnotationBeanPostProcessor 等

2.3.4注册销毁

通过reigsterDisposableBean处理实现了DisposableBean接口的Bean的注册

3.添加到单例池

通过 addSingleton 方法,将Bean 加入到单例池 singleObjects

4.销毁

4.1.销毁前

调用 bean中@PreDestory 注解的方法

通过 postProcessBeforeDestruction 方法调用destoryBean逐一销毁Bean

4.2.销毁

调用 destoryBeans

4.3.执行客户自定义销毁

调用 invokeCustomDestoryMethod

最后使用addSingleton将生成的Bean放入单例池singletonObjects中就可以被获取以及使用