1、spring中bean的生命周期

(1)概念

在spring框架中,所有的bean对象都有生命周期,就是指bean的创建、初始化、服务、销毁的一个过程。

(2)bean的生命周期

  • bean的定义

在spring中通常是通过配置文档的方式来定义Bean的,在一个配置文件中可以定义多个Bean

  • bean的初始化

默认在IOC容器加载的时候实例化对象(ApplicationContext是,Beanfactory只有在调用getBean的时候才进行实例化):https://www.cnblogs.com/zhai1997/p/12692026.html

  • bean的使用

通过ApplicationContext对象或Beanfactory对象获取bean

  • 销毁

(3)代码的方式演示Bean的生命周期

创建Student类:

public class Student implements BeanNameAware {
private String sname;
@Override
public String toString() {
return "Student{" +
"sname='" + sname + '\'' +
'}';
} public Student() {
System.out.println("bean创建了");
}
public void setSname(String sname) {
System.out.println("设置对象属性setName()..");
this.sname = sname;
} //Bean的初始化方法
public void initStudent() {
System.out.println("初始化Bean");
} //实现BeanNameAware接口的setBeanName(),传递Bean的ID。
@Override
public void setBeanName(String sname) {
System.out.println("调用BeanNameAware的setBeanSname,返回的ID值是:" +sname);
} //Bean的使用
public void use() {
System.out.println("使用Bean");
} //Bean的销毁方法
public void destroyStudent() {
System.out.println("销毁Bean");
}
}

其中调用接口后要实现接口的setBeanName方法,该方法的作用是返回bean的ID值

再创建一个类,书写Bean后置处理器相关的方法:

public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("前方法"+s);
return o;
} @Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("后方法"+s);
return o;
}
}

spring的配置文件:

 <bean name="student" class="com.zhb.bean.Student" init-method="initStudent" destroy-method="destroyStudent">

    </bean>
<bean class="com.zhb.test.MyBeanPostProcessor"></bean>

第二个是配置后处理器的bean,只需要配置类全名,不需要配置ID等,spring可以自动识别并注入。

测试结果:

2、总结

  • Bean 容器找到配置文件中 Spring Bean 的定义(配置文件或注解的方式定义)

  • Bean 容器利用Java Reflection API创建一个Bean的实例(ApplicationContext或Beanfactory)

  • 如果涉及到一些属性值,利用set()方法设置一些属性值。

  • 如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的ID

  • 如果 Bean 实现了`BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入 ClassLoader对象的实例。

  • 类似的,如果实现了其他 *.Aware接口,就调用相应的方法。

  • 如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization() 方法

  • 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。

  • 如果 Bean 在配置文件中的定义包含  init-method 属性,执行指定的方法。

  • 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization()方法

  • 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。

  • 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。

spring:bean的生命周期的更多相关文章

  1. 一次性讲清楚spring中bean的生命周期之二:FactoryBean的前世今生

    前言 在<spring中FactoryBean是什么bean>一文中,带着小伙伴学习了spring中的FactoryBean,了解了到了FactoryBean其实是一种生产Bean的bea ...

  2. 深究Spring中Bean的生命周期

    前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...

  3. 如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

    前言 当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图: 先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背? 究其原因在于, ...

  4. 一次性讲清楚spring中bean的生命周期之三:bean是如何实例化的

    在前面的两篇博文<一次性讲清楚spring中bean的生命周期之一:getSingleton方法>和<一次性讲清楚spring中bean的生命周期之二:FactoryBean的前世今 ...

  5. JAVA面试题:Spring中bean的生命周期

    Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一 ...

  6. 深入理解Spring中bean的生命周期

    [Spring中bean的生命周期] bean的生命周期 1.以ApplocationContext上下文单例模式装配bean为例,深入探讨bean的生命周期: (1).生命周期图: (2).具体事例 ...

  7. Spring中Bean的生命周期及其扩展点

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6106456.html Spring中Bean的管理是其最基本的功能,根据下面的图来了解Spr ...

  8. 简:Spring中Bean的生命周期及代码示例

    (重要:spring bean的生命周期. spring的bean周期,装配.看过spring 源码吗?(把容器启动过程说了一遍,xml解析,bean装载,bean缓存等)) 完整的生命周期概述(牢记 ...

  9. 面试Spring之bean的生命周期

    找工作的时候有些人会被问道Spring中Bean的生命周期,其实也就是考察一下对Spring是否熟悉,工作中很少用到其中的内容,那我们简单看一下. 在说明前可以思考一下Servlet的生命周期:实例化 ...

  10. 通过BeanPostProcessor理解Spring中Bean的生命周期

    通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 Spring源码解析(十一)Spring扩展接口InstantiationAwareBeanPostProces ...

随机推荐

  1. Arduboy基本用法(一)

    Arduboy基本用法(一) 一.第一个Arduboy程序 在arduino中新建项目 示例代码 #include<Arduboy.h> Arduboy arduboy; void set ...

  2. Charles 断点修改Response

    前言: 我们可以通过map功能进行重定向,但如果同一个域名进行的是不同请求与返回.此时map在这里就不适用了. 我们可以通关对某一请求进行断点,在进行修改请求或者返回.这样就可以满足我们的需求了. 一 ...

  3. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(一):搭建认证服务器

    配套源码:https://gitee.com/jardeng/IdentitySolution 1.创建ASP.NET Core Web应用程序,选择空模板. 去掉HTTPS 2.添加nuget包:I ...

  4. openCV - 1. 加载、修改、保存图像

    加载 cv::imread 修改 cv::cvtColor 保存 cv::imwrite 加载图像cv::imread imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称 ...

  5. JS - 日期时间比较函数

    JS日期比较(yyyy-mm-dd) function duibi(a, b) { var arr = a.split("-"); var starttime = new Date ...

  6. 如何自制WC3地形纹理贴图

    http://world-editor-tutorials.thehelper.net/tilesets.php https://wenku.baidu.com/view/e761c953cc1755 ...

  7. 如何编写高质量的C#代码(一)

    从"整洁代码"谈起 一千个读者,就有一千个哈姆雷特,代码质量也同样如此. 想必每一个对于代码有追求的开发者,对于"高质量"这个词,或多或少都有自己的一丝理解.当 ...

  8. Redis Linux 安装部署

    Redis部署文档   Redis部署文档 准备软件: 开始部署: 解压tar包[root@localhost redis]# tar -zxvf redis-3.2.8.tar.gz 进入Redis ...

  9. MySQL中如何分析查询语句

    Oracle中有explain for,mysql中也有同样的功能,那便是explain,举例如下: mysql> explain select (case (select count(*) f ...

  10. IOException的子类

    ChangedCharSetException, CharacterCodingException, CharConversionException, ClosedChannelException, ...