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. mr原理简单分析

    背景 又是一个周末一天一天的过的好快,今天的任务干啥呢,索引总结一些mr吧,因为前两天有面试问过我?我当时也是简单说了一下,毕竟现在写mr程序的应该很少很少了,废话不说了,结合官网和自己理解写起. 官 ...

  2. 虚拟机VmWare打开报错,错误提示:VMware Authorization Service is not running!

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 微博:http://weibo.com/mcxiaobing 说明:打开我的虚 ...

  3. Android开发之SDCardUtils工具类。java工具详细代码,附源代码。判断SD卡是否挂载等功能

    package com.xiaobing.zhbj.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputSt ...

  4. 合并模拟器和真机的静态库动态库aggregate

    创建Aggregate的target 在Build Phases 添加Run Script,内容为 scriptFile=${SRCROOT}/universalA.shsh ${scriptFile ...

  5. C# Beanstalkd Client

    http://bestmike007.com/Beanstalkd.Client/ Other Message Queue http://queues.io

  6. 发送信息到邮箱的第三方扩展库PHPMailer使用方法

    一.下载 使用composer下载PHPMailer :composer require phpmailer/phpmailer 二.使用实例 use PHPMailer\PHPMailer\PHPM ...

  7. Spring MVC实例创建(一)

    Spring MVC Spring MVC 为展现底层提供的基于MVC设计理念的优秀的Web框架,是目前最流行的MVC框架之一.Spring3.0后全面超越Struts2,成为最为优秀的MVC框架.S ...

  8. C# aspx 禁止文本款输入缓的几种方法

    1   在ASP.NET中可以在页面中加入以下内容: <%@ OutputCache Location="None" VaryByParam="None" ...

  9. 一个极简Jsp工程下载

    下载地址:https://files.cnblogs.com/files/xiandedanteng/SimpleJspWebApp20191227.zip 要得到war文件,右键点项目->Ex ...

  10. Maven是什么? Maven的概念+作用+仓库的介绍+常用命令

    Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型.一组标准集合,一个依赖管理系统.和用来运行定义在生命周期阶段中插件目标和逻辑. 核心功能 Maven的核心 ...