springBean生命周期

springBean生命周期

普通java对象和spring所管理的Bean实例化的过程是有区别的

普通java对象

1.java源码被编译为class文件

2.等到类需要被初始化时

3.class文件被虚拟机通过类加载到jvm

4.初始化对象供我们使用

在这里插入图片描述

springBean

spring所管理的Bean不同的是,除了class对象之外,还会使用BeanDefinition的实例来描述对象的信息

比如spring所管理的Bean有一系列的描述:@Scope、@Lazy、@DependsOn等等

可以理解为:Class只描述了类的信息,而BeanDefinition描述了对象的信息

spring在启动的时候需要扫描在XML/注解/javaConfig中需要被spring管理的Bean信息。

随后,会将这些信息封装成BeanDefinition,最后会把这些信息放到一个beanDefinitionMap中,key是beanName,value是BeanDefinition对象

到这里,只是将对象定义的元数据加载起来,目前真是对象还没有实例化。

在这里插入图片描述

1.遍历beanDefinitionMap,执行BeanFactoryPostProsessor这个Bean工厂后置处理器的逻辑。我们平时定义的占位符信息,就是通过BeanFactoryPostProssessor的子类PropertyPlaceholdConfiguter注入进去。我们也可以自定义BeanFactoryPostProcessor来对我们定义好的Bean元数据进行获取或者修改。

在这里插入图片描述

BeanFacotryPostProcessor后置处理器执行完了以后,就到了实例化对象

在spring里边是通过反射来实现的,一般情况下会通过反射选择合适的构造器来把对象实例化。

但是这里把对象实例化,只是把对象创建出来,而对象具体的属性是还没有注入的。

比如:我的对象是UserService,而UserService对象依赖着SendService对象,这时候的SendService还是null

所以,下一步就是对象的相关属性给注入

在这里插入图片描述

相关属性注入完之后,往下接着就是初始化的工作

首先判断Bean是否实现了Aware相关的接口,如果存在则填充相关的资源。

比如:我在项目中,希望通过代码程序的方式获取指定的springBean。我这边会抽取成一个工具类,去实现ApplicationContextAware接口,来获取ApplicationContext对象进而获取springBean。

在这里插入图片描述

Aware接口处理完之后,就会BeanPostProcessor后置处理器

BeanPostProcessor后置处理器有两个方法,一个是before,一个是after。

在这里插入图片描述

这个BeanPostProcessor后置处理器是Aop实现的关键(关键子类AnnotationAwareAspectJAutoProxyCreator)

执行完Aware相关的接口就会执行BeanPostProcessor相关子类的before方法

BeanPostProcessor相关子类的before方法执行完,则执行init相关的方法,比如说

@PostConstruct、实现了InitializingBean接口、定义的init-method方法

在这里插入图片描述

等到init方法执行完之后,就会执行BeanPostProcessor的after方法,就可以获取对象去使用了。

等到init方法执行完之后,就会执行BeanPostProcessor的after方法,就可以获取对象去使用了。

销毁的时候就看有没有配置相关的destory方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值