Spring总结篇,不同于之前抽丝剥茧式地纵向深入源码,本次从横向的角度出发,希望可以带个读者一个完全不同的Spring视角。
2024年重置版,搞点不一样的东西。希望通过本篇的内容,将之前的文章全部给串起来。
相关前文:
- Spring Boot启动加载
- Spring Web请求处理流程
- Spring上下文刷新(一)、Spring上下文刷新(二)
- Spring DispachterServlet初始化
- Spring AOP(一)、Spring AOP(二)
- Spring Bean的创建(一)、Spring Bean的创建(二)
一、Bean的生命周期
我们先从狭义上进行简单划分:
- 实例化前(Before Instantiation):执行 cls.newInstance 之前,AOP动态代理、池化操作在此步进行。
- 实例化(Instantiation):执行 cls.newInstance 。
- 实例化后(After Instantiation):执行 cls.newInstance 之后。
- 填充属性(Population of Properties):注入字段,处理@Autowired、@Value、@Resource。
- 初始化前(Before Initialization):给与Aware接口资源
- 初始化(Initialization):执行@PostConstruct、执行afterPropertiesSet方法、init-method,执行顺序依次降低。
- 初始化后(After Initialization):无特殊操作。
- 使用中(In Use):代码运行中…
- 销毁(Destruction):分销毁前、销毁后。
如下是一张图,较为全貌地展示了bean的生命周期
二、BeanPostProcessor
我们再看下一个Bean在整个生命周期中都会经过哪些Spring内置的BeanPostProcessor,我们在其中的各个环节都可以做些什么。
便于理解,这里只列举关键BeanPostProcessor接口,不会过多扩展。
1、测试代码
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;import javax.annotation.PostConstruct;
import java.lang.reflect.Constructor;public class BeanPostProcessorTest {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanPostProcessorTest.class);context.registerBeanDefinition("testBean", new RootBeanDefinition(TestBean.class));Object testBean = context.getBean("testBean");System.out.println(testBean