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的生命周期,通过实现InitializingBeanDisposableBean

这两个接口都只声明一个方法让我们可以初始化/关闭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 Life Cycle

Spring Boot Bean生命周期

Spring的Bean生命周期理解

Spring Bean的一生的更多相关文章

  1. Spring 了解Bean的一生(生命周期)

    转载 https://blog.csdn.net/w_linux/article/details/80086950 该篇博客就来了解IoC容器下Bean的一生吧,也可以理解为bean的生命周期. ## ...

  2. Spring Bean生命周期,好像人的一生。。

    大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...

  3. Spring8:一些常用的Spring Bean扩展接口

    前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...

  4. Spring Bean详细讲解

    什么是Bean? Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象. Spring 容器会自动完成@bean对象的实例化. 创建应用对象之间的协作关系的行为称为:装配( ...

  5. Spring Bean的生命周期(非常详细)

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  6. spring bean的生命周期

    掌握好spring bean的生命周期,对spring的扩展大有帮助.  spring bean的生命周期(推荐看)  spring bean的生命周期

  7. spring bean的重新加载

    架构体系 在谈spring bean的重新加载前,首先我们来看看spring ioc容器. spring ioc容器主要功能是完成对bean的创建.依赖注入和管理等功能,而这些功能的实现是有下面几个组 ...

  8. Spring Bean

    一.Spring的几大模块:Data access & Integration.Transcation.Instrumentation.Core Spring Container.Testin ...

  9. 【转】Spring bean处理——回调函数

    Spring bean处理——回调函数 Spring中定义了三个可以用来对Spring bean或生成bean的BeanFactory进行处理的接口,InitializingBean.BeanPost ...

随机推荐

  1. 四 Vue学习 router学习

    index.js: 按需加载组件: const login = r => require.ensure([], () => r(require('@/page/login')), 'log ...

  2. 参数化之利用CSV Data Set Config从文件读取参数并关联变量

    众所周知,在进行接口测试的过程中,需要创建不同的场景(不同条件的输入,来验证不同的入参的返回结果).因而,在日常的自动化接口监控或商品监控等线上监控过程中,需要配置大量的入参来监控接口的返回是否正确. ...

  3. SSO跨域 CodeProject

    http://www.codeproject.com/Articles/114484/Single-Sign-On-SSO-for-cross-domain-ASP-NET-appl 翻译: http ...

  4. oracle 查询及删除重复记录的SQL语句

    查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group ...

  5. python3.5 jira网站实现用户的批量插入

    工作中,经常要给多个用户创建账号,为了减少工作量,写了个自动化脚本来帮助我批量创建用户 代码如下: """自动创建Jira的学生账号""" ...

  6. Git 分支管理 不使用Fast forward模式进行合并 分支管理策略

    通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...

  7. Kbengine

    Kbengine 编辑 KBEngine是一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d ...

  8. 3dmax 法线重置

    从一个模型分离部位时,分离出的部分,面法线发生了混乱,左边原始模型,右边分离后 重置法线方法 对模型(比如对分离出的下半身)添加 EditoNormal修改器 选中模型部位 添加Edit Normal ...

  9. 洛谷 P1875 佳佳的魔法药水

    P1875 佳佳的魔法药水 题目描述 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的病只有一种办法,那就是传说中的 0 号药水 --怎么样才能 ...

  10. 笔记-迎难而上之Java基础进阶3

    统计字符串中每一个不同的字符 import java.util.*; //统计字符串每一个字符出现的字数 public class StringDemo{ public static void mai ...