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接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值