一,图示
图片参考:面试必备系列:阿里架构师深度解析spring源码IOC原理,讲的如此清晰明了_哔哩哔哩_bilibili
这个老师讲的还是不错的. 由浅入深, 清晰明了. 我喜欢.
二,动手验证
Spring提供了很多接口给我们使用, 目的就是让我们开发者可以干预Bean的创建过程, 做一些我们想做的事儿. 另一方面是提供给它自己实现功能使用, 是从设计上考量的.
再一个, 这些东西基本在我们的项目开发中基本不会见到, 但是我们还是需要了解一下这个过程, 对于我们整体把握源码时有意义的.
Spring提供的很多接口一般后缀都是有 Aware(发现的意思), Processor(处理器), Initialize, Disposable等字样.
带有prototype的bean是不会进入到单例池中的.也就是说不会被SpringIOC所管理
@Component
public class TestLifeFlow implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanPostProcessor, InitializingBean, DisposableBean {
@Autowired
private Person person;
@Override
public void setBeanName(String beanName) {
System.out.println("当前beanName = " + beanName);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("beanFactory = " + beanFactory);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("applicationContext = " + applicationContext);
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("bean = " + bean);
System.out.println("beanName = " + beanName);
return bean;
}
@PostConstruct
public void postConstruct() {
System.out.println("PostConstruct");
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("....................");
System.out.println("bean = " + bean);
System.out.println("beanName = " + beanName);
return bean;
}
@PreDestroy
public void preDestroy() {
System.out.println("destroy....");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet");
}
@Override
public void destroy() throws Exception {
System.out.println("销毁了哦.....");
}
}
三. 启动日志
大概格式:
1. 先打印我们上方干预方法输出的东西
2. 打印postProcessBeforeInitialization方法
这儿会输出所有Bean
3. 打印postProcessAfterInitialization方法
这儿会输出所有Bean
四,思考:
学习了SpringBean的生命周期后, 我们就可以在某些位置去干预. 而且对于我们了解源码也更近一步, 因为我们认识了挺多Spring提供的新的玩意儿.
上方有一个 BeanPostProccessor, 还有一个 BeanFactoryPostProcessor 两个接口.
BeanPostProccessor 就是对Bean创建前后进行拦截处理.
同理:
BeanFactoryPostProcessor 就是对BeanFactory顶层对象创建前后进行拦截处理.
带有PostProcessor的我们称为后置处理器.
五, 大概浏览源码主要步骤
会感觉到有很多单词已经不太陌生了. 因为我们又前进了一步.



