Spring生命周期不可不知的回调接口
来源:互联网 发布:三维立体制作软件 编辑:程序博客网 时间:2024/06/06 12:41
上回说到 Spring bean生命周期中的InitializingBean接口,我们了解到这只是spring bean生命周期中修改bean的诸多方式之一,其实在整个生命周期中,修改bean的方式大致有如下几种:
实现 InitializingBean接口 的 afterPropertiesSet()
实现 DisposableBean接口的 destroy()
给方法加@PostConstruct和@PreDestroy注解,需要说明一点,这两个注解是JSR250标准中的,而Spring中InitDestroyAnnotationBeanPostProcessor类实现了这个标准
以xml的方式定义bean时,指定init method和destroy method
<bean id="testBeanLifeCycle" class="org.springframework.samples.mvc.beanPostProcessor.TestBeanLiftCycle"
init-method="xmlInit" destroy-method="xmlDestroy">
<property name="message" value="Hello World!"/</bean>
在众多的lifecycle机制中,假设一个bean使用了上边所有的方式,那么它们的执行顺序是这样的:
Methods annotated with @PostConstruct
afterPropertiesSet() as defined by the InitializingBean callback interface
A custom configured init() method
Methods annotated with @PreDestroy
destroy() as defined by the DisposableBean callback interface
A custom configured destroy() method
我们在代码中来看
在Spring中,bean的生命周期管理都是由beanFactory来管理,上一篇我们有提到,实现了beanFactory的类AbstractAutowiredCapableBeanFactory完成了bean的init和destroy的工作,初始化方法是
invokeInitMethods方法如下
接下来看看destroy逻辑,在AbstractAutowiredCapableBeanFactory中我们找到destroy方法
再来看DisposableBeanAdapter的destroy做了什么
来看个小demo来验明正身
定义Spring bean TestBeanLifeCycle
在applicationContext.xml中声明bean
以Junit方式启动容器
然后我们会看到下面的输出:
说了这么多机制,那么我们在使用的时候要注意什么
推荐使用@PostConstruct和@PreDestroy,因为这来自JSR250,对Spring框架0耦合。
除此之外,Spring还提供了LifeCycle接口和LifeCycleProcessor接口,实现这些接口能让bean的lifecycle关联到Container的lifeCycle,当容器有启动,停止,刷新等动作时,会回调到bean。
如果说所有这些Spring提供的机制还是不能满足你的需求,那么总有一款适合你——BeanPostProcessor接口,事实上在Spring架构内部,众多的beanPostProcessor实现,能完成各种接口的回调,或者自定义方法的触发。关于更多BeanPostProcessor,且听下回分解。
欢迎关注,期待与您的交流,让我们携手在通往牛逼的小路上徐徐前行。
- Spring生命周期不可不知的回调接口
- Java 接口和抽象类---不可不知的异同点
- 不可不知的EventBus
- 不可不知的前端
- Hibernate不可不知的东西
- 不可不知的人生定律!!!
- 不可不知的健康知识
- 中国人不可不知的常识
- 不可不知的Windows快捷键
- 不可不知的家庭生活妙招
- Eclipse不可不知的用法
- 不可不知的“云计算”
- 不可不知的json库
- 不可不知的“云计算”
- 不可不知的css十大密技
- 不可不知的python知识
- 你不可不知的JSON
- 不可不知的GitHub功能
- GCC C语言处理主要函数之init_pragma
- yii2.0 数据库关联查询
- c++---函数和类模板
- 我是怎样优化 Android 工程中的 Enum的
- 读取TXT文件
- Spring生命周期不可不知的回调接口
- PixelFormat 图像颜色的数据格式
- [我眼中的C#]文件读写操作
- javascript和as的结合解决禁止flash的右键功能
- Spring框架第一天
- Navicat for mysql Mac版 快捷键
- Android EventBus使用详解
- React点击空白部分隐藏弹出层;React阻止事件冒泡失效)
- App启动速度优化