前言
最近买了几本书,看了其中讲springboot
的一本书,看到了讲spring bean的生命周期这一节,书上只是提了个大概,感觉不是自己想要的结果,还是自己动手吧;虽然写得不好,但是记一记还是对自己有好处的;
正文
在网上找了几张图,感觉有一张比较清楚:
接下来说一下几种方式吧,该项目使用
springboot
构建的;以下代码均在改项目中完成
1. 自定义初始化方法和销毁方法
新建一个bean
类,注意该bean类上并没有使用注解
1 |
|
自定义bean
的初始化和销毁方法需要在配置文件中添加以下代码:
1 |
|
2. 使用注解的方式
使用@PostConstruct
和@PreDestroy
两个注解,其中 @PostConstruct
是在构方函数执行完之后指向性,@PreDestroy
是在bean
销毁前执行;
该bean类上使用了Component
注解,当然,你还可以使用另外的那三个注解中的某一个;
1 |
|
3.InitializingBean, DisposableBean
还可以继承InitializingBean
, DisposableBean
接口
1 |
|
4.实现*Aware接口
在上边的图中可看见,有三个在最前面的三个Aware
接口类,这些接口的功能就不用去说了
1 |
|
5.BeanPostProcessor 增强处理器
这个类不是接口类,这个类中有两个方法postProcessBeforeInitialization
和postProcessAfterInitialization
1 |
|
启动后的结果:
1 |
|
参考链接1:Spring中Bean的生命周期是怎样的?
参考链接2:Spring Bean 生命周期
总结
梳理了bean的生命周期,大概明白了spring对bean的一个处理流程;
对最上边的图进行详细描述:
- spring对bean进行实例化
- spring 将值和bean的引用注入到bean对应的属性当中;
- 如果bean实现了BeanNameAware接口,spring将bean的ID传递给setBeanName方法
- 如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory容器实例传入
- 如果bean实现了ApplicationContextAware接口,spring容器将调用setApplicationContext方法,将bean所在的应用上下文的引用传入进来
- 如果bean实现的BeanPostProcessor接口,spring将调用他们的postProcessBeforeInitialization方法;
- 如果bean实现了InitializeingBean接口,spring将调用他们的afterPropertiesSet方法。类似的,如果bean使用了init-method声明了初始化方法,该方法也会被调用;
- 如果bean实现的BeanPostProcessor接口,spring将调用他们的postProcessAfterInitialization方法
- bean被应用程序调用,直到该应用上下文被销毁;
- 如果bean实现了DisposableBean接口,spring将调用他的destroy方法。如果bean使用destroy-method声明销毁方法,该方法也会被调用