Spring中最重要的原理之一:IOC中Bean的生命周期,

在Bean中会经历三个大阶段(生产、使用、销毁)

Untitled

其中生产最为复杂,重点来说一下生产的这个环节

1.首先,我们通过注解、XML、Java配置三个方法,我们可以将这些当做一个Bean,在Spring启动的时候,通过“加载Bean定义的方法”loadBeanDefinitions方法将他们注册到IOC容器中,并且每一个Bean都是BeanDefintion,最终将这些Bean存在一个ConcurrentHashMap中,名为BeanDefintionMap(启动的过程比较复杂,就先研究Bean为主)

Untitled

2.通过遍历这个BeanDefintionMap集合,通过crateBean方法创建一个个Bean的对象,然后创建Bean大概分为四个阶段(构建对象、填充属性、初始化实例、注册销毁)这四个步骤。

Untitled

 

2.1 构建对象:通过createBeanInstance方法进行对象构造,通过反射机制,从Bean定义中的Bean.Class对象中拿到构造方法(如果有多个构造方法的时候则会先拿带有@Autowired 注解的构造方法,默认使用无参构造器),然后经过这些后,就是构造对象了。

Untitled

2.2 填充属性:通过populateBean的方法,对Bean内部所需的属性进行赋值填充(通常就是@Autowired注解的这些变量),通过“三级缓存”机制进行填充,也就是我们常说的DI(依赖注入)

Untitled

2.3.1 初始化实例:通过initializeBean方法,将这个实例进行初始化。初始化的第一步是初始化容器的相关信息,通过invokeAwareMethods方法,为实现各种Aware接口(Aware代表信息感知接口,就可以再Bean的实例中感知并获取到对应的信息)的Bean设置诸如BeanName,BeanFactory的容器信息。

Untitled

2.3.2 接下来,就继续他通过invokeinitMethods方法执行Bean的初始化方法。执行后会执行afterPropertiesSet,这个方法是通过实现了initalzingBean接口实现的方法(方法名很直接,表示“Bean填充属性后执行”)。后续会继续执行我们自定义的方法——initMethod方法。

Untitled

2.3.3 后续的在执行这些方法之前和之后,还有二个方法,这二个方法也是构成AOP的主要来源和设计。一个是applyBeanPostProessorsBeforeInitalizetion和applyBeanPostProessorsAfterInitalizetion。他们分别在Bean的初始化前和初始化后处理各种Bean的后置处理器,这二个构成了负责Aop处理的,AnnotationAwareAspectJAutoProxyCreator(Aop),它会负责构造前(PostConstruct)和构造后(PreDestory)的系统级处理器。这里也可以去实现BeanPostProcessor来去自定义处理器,并且通过实现PriorityOrdered接口来指定执行顺序

Untitled

2.4最后在Bean销毁的时候。可以通过注册销毁registerDisposableBean方法,将实现了销毁接口的DispoableBean的进行注册,这样在销毁的时候就能够去使用destory的方法了。

Untitled

3.通过以上步骤就已经创建好了一个完整的Bean对象,最后通过addSingleton方法放入单例池singletonObjects中就可以被获取和使用了。

4.最后,当执行了close关闭时。和前面说初始化示例的时候一致,销毁前会先执行一次postProcessBeforeDestruction(销毁前处理器),这里就会执行程序@PreDestory的方法

Untitled

然后通过destoryBeans的方法,逐一摧毁单例池中所有的Bean(不清除BeanDefintionMap中的Bean),销毁的时候会执行destory方法。最后,会执行一个invokeCustomDestoryMethod(客户销毁方法),来执行自定义的destoryMethod方法

Untitled

END,这样从Bean的生产、使用到销毁的这一套完整的生命周期就已经全部完毕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值