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方法。