Spring的bean的生命周期——bean的创建与销毁

1、生成类信息map

扫描包,用asm技术获取类信息,打了@ComponentScan@component@service等注解的类会放入map。key是类名,value是beanDefinition类的基本信息

2、加载类

context.getBean("userService")

从类信息map中获取beanDefinition,并加载类。如果加载了会记录下来,如果没加载就调用类加载器去加载类

3、创建bean对象

创建对象过程是:实例化(1-3)、处理属性(5-7)、初始化(8-10)。

1.实例化前。InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()

2.实例化

3.实例化后。MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()

4.InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()

5.自动注入(依赖注入)

6.属性处理。InstantiationAwareBeanPostProcessor.postProcessProperties()。如@autowired

7.回调处理一些类信息。Aware对象

8.初始化前。BeanPostProcessor.postProcessBeforeInitialization()

9.初始化。执行InitializingBean初始化接口

10.初始化后。BeanPostProcessor.postProcessAfterInitialization()。如aop

创建出来的bean如果是单例,放到map中,key是bean名称,value是bean对象。如果是原型类,则不放入map,每次都执行上述的创建对象过程

实例化:先在beanDefinition中的supplier有没有返回对象,没有的话看beanFactory。实例化涉及推断构造方法。推断构造方法就是只有一个构造方法、执行这个构造方法;多个构造方法,执行@Autowired方法或者无参构造。有参构造的入参,回去beanMap中找,没有就创建。

aop:如果有aop则创建的bean是代理对象,执行流程是userService.test() --> aop切面逻辑如@before--> target.test()。 target是被代理对象

aop流程:找所有的切面类@Aspect、找切面中所有的pointCut,如@before@after等,看当前要创建的bean是否是pointCut需要的,是就创建代理对象

4、销毁bean

出发时机:spring容器关闭时

创建bean后,会把实现了DisposableBean接口的bean保存到一个map中,销毁容器AnnotationConfigApplicationContext.close()的时候会逐步处理清空这个map中的对象。

适配器模式:实现了AutoCloseable接口,或者在BeanDefinition中指定了destroyMethodName的都算是要销毁的。所以会把实现了AutoCloseable接口的类封装成DisposableBeanAdapter,而DisposableBeanAdapter实现了DisposableBean接口。

相关推荐

  1. Springbean生命周期——bean创建销毁

    2024-07-11 20:18:02       21 阅读
  2. spring bean生命周期

    2024-07-11 20:18:02       54 阅读
  3. Spring Bean生命周期

    2024-07-11 20:18:02       41 阅读
  4. Spring bean生命周期

    2024-07-11 20:18:02       40 阅读
  5. Spring bean生命周期

    2024-07-11 20:18:02       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 20:18:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 20:18:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 20:18:02       57 阅读
  4. Python语言-面向对象

    2024-07-11 20:18:02       68 阅读

热门阅读

  1. Nginx Bla~Bla~

    2024-07-11 20:18:02       18 阅读
  2. A133 Android10 root修改

    2024-07-11 20:18:02       20 阅读
  3. 雅思词汇及发音积累 2024.7.11

    2024-07-11 20:18:02       18 阅读
  4. Perl 语言入门很简单

    2024-07-11 20:18:02       20 阅读
  5. 华为机考真题 -- 精准核酸检测

    2024-07-11 20:18:02       22 阅读
  6. 练习题答案

    2024-07-11 20:18:02       17 阅读