Spring Bean的一生
Spring Bean的一生
When you work directly in Java, you can do anything you like with your objects and do not always need to rely on the container lifecycle.
前言:
在Ioc容器启动后相应的Bean并没有立即实例化,此时Ioc容器仅仅拥有所有对象的BeanDefinition(Bean对象在Spring中的描述,包含该Bean在容器中实例化所需的信息,通过解析xml/javaconfig后所得)
Spring Bean生命周期的管理
Spring bean factory能管理Beans的生命周期,通过实现InitializingBean和DisposableBean
这两个接口都只声明一个方法让我们可以初始化/关闭bean中的资源
当然在整个生命周期中也提供了一些Call Back Methods,这些方法类似于Servlet中的监听器的实现
- 当
Bean处于post-initialization阶段时,我们可以通过实现InitializingBean接口来实现afterPropertiesSet() - 当
Bean处于pre-destruction阶段时,我们可以实现DisposableBean接口来实现destroy()方法
Spring Bean的生命周期图


Code Time
以Rick类交给Spring容器管理,方法顺序为其在Spring容器中的执行顺序
Rick.java
public class Rick implements InitializingBean, DisposableBean {
public Rick(){
System.out.println("Rick is in [Rick] - Rick()");
}
public void customInit(){
System.out.println("Rick is in [Rick] - customInit()");
}
@PostConstruct
public void postConstruct(){
System.out.println("Rick is in [@PostConstruct] - postConstruct()");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Rick is in [InitializingBean] - afterPropertiesSet()");
}
@PreDestroy
public void preDestroy(){
System.out.println("Rick is in [@PreDestroy] - preDestroy()");
}
@Override
public void destroy() throws Exception {
System.out.println("Rick is in [DisposableBean] - destroy()");
}
public void customDestroy(){
System.out.println("Rick is in [Rick] - customDestroy()");
}
}
加入BeanPostProcess
RickBeanPostProcess.java
public class RickBeanPostProcess implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Rick) {
System.out.println("Rick is in [BeanPostProcessor] - postProcessBeforeInitialization()");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Rick) {
System.out.println("Rick is in [BeanPostProcessor] - postProcessAfterInitialization()");
}
return bean;
}
}
配置类
RickConfig.java
@Configuration
public class RickConfig {
/**
* 指定自定义初始化方法和自定义销毁方法
* @return Rick
*/
@Bean(initMethod = "customInit",destroyMethod = "customDestroy")
public Rick rick(){
return new Rick();
}
@Bean
public RickBeanPostProcess rickBeanPostProcess(){
return new RickBeanPostProcess();
}
}
测试类
Client.java
public class Client {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(RickConfig.class);
((AnnotationConfigApplicationContext) applicationContext).close();
}
}
最终结果如下
Rick is in [Rick] - Rick()
Rick is in [BeanPostProcessor] - postProcessBeforeInitialization()
Rick is in [@PostConstruct] - postConstruct()
Rick is in [InitializingBean] - afterPropertiesSet()
Rick is in [Rick] - customInit()
Rick is in [BeanPostProcessor] - postProcessAfterInitializa
Rick is in [@PreDestroy] - preDestroy()
Rick is in [DisposableBean] - destroy()
Rick is in [Rick] - customDestroy()
参考
Spring Framework Documentation
Spring Bean Life Cycle Explained
Spring Bean的一生的更多相关文章
- Spring 了解Bean的一生(生命周期)
转载 https://blog.csdn.net/w_linux/article/details/80086950 该篇博客就来了解IoC容器下Bean的一生吧,也可以理解为bean的生命周期. ## ...
- Spring Bean生命周期,好像人的一生。。
大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...
- Spring8:一些常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
- Spring Bean详细讲解
什么是Bean? Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象. Spring 容器会自动完成@bean对象的实例化. 创建应用对象之间的协作关系的行为称为:装配( ...
- Spring Bean的生命周期(非常详细)
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
- spring bean的生命周期
掌握好spring bean的生命周期,对spring的扩展大有帮助. spring bean的生命周期(推荐看) spring bean的生命周期
- spring bean的重新加载
架构体系 在谈spring bean的重新加载前,首先我们来看看spring ioc容器. spring ioc容器主要功能是完成对bean的创建.依赖注入和管理等功能,而这些功能的实现是有下面几个组 ...
- Spring Bean
一.Spring的几大模块:Data access & Integration.Transcation.Instrumentation.Core Spring Container.Testin ...
- 【转】Spring bean处理——回调函数
Spring bean处理——回调函数 Spring中定义了三个可以用来对Spring bean或生成bean的BeanFactory进行处理的接口,InitializingBean.BeanPost ...
随机推荐
- QT(1)介绍
Qt官网 Qt官网:https://www.qt.io Qt下载:http://www.qt.io/download Qt所有下载:http://download.qt.io/archive/qt Q ...
- UVA 10559 Blocks——区间dp
题目:https://www.luogu.org/problemnew/show/UVA10559 应该想到区间dp.但怎么设计状态? 因为连续的东西有分值,所以应该记录一下连续的有多少个. 只要记录 ...
- VijosP1180:选课
描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这M门课并考核通过就能获得 ...
- HDU4391(线段树+剪枝)
Paint The Wall Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- CAS单点登录学习(二):客户端配置
下载jar包因为cas的源码修改变动很大,所以客户端引入的jar包根据服务端的war包而定.之前搭建的cas服务端用的版本是3.5.2,经过测试,可以使用cas-client-core的3.2.1版本 ...
- hibernate学习 六 Hibernate缓存
缓存: 如果在集群环境下使用Hibernate时,(集群有节点A ,节点B) 当请求,发往A节点,A在数据库中修改了一条记录,然后节点B的缓存中如何实时的更新节点A修改的新数据 hi ...
- Altium Designer如何从已有的PCB图中导出封装库
1.打开PCB文件 2.选择 Design -> Make Integrated Library (生成集成库) 注意,一定要在PCB 文件下 生成集成库!! 最终生成这个文件,打开这个文 ...
- Flutter汇总贴
Fluuter常遇到的问题 Flutter从入门到进阶实战携程网App_汇总贴 Flutter教程网 http://www.flutterj.com/ 第三季:https://jspang.com/p ...
- array mysql_fetch_row(resource result)
array mysql_fetch_row(resource result) 函数返回从结果集result中取得的行生成的数组,若到了最后一行之后则返回false,每个结果的列存储在一个数组的单元中 ...
- POJ 2976 Dropping tests (二分+贪心)
题意:给定 n 个分数,然后让你去年 m 个分数,使得把剩下的所有的分子和分母都相加的分数最大. 析:这个题并不是分子越大最后结果就越大,也不是整个分数越大,最后结果就越大的,我们可以反过来理解,要去 ...