spring中bean的生命周期

2023-11-04

1、spring中bean的生命周期

(1)概念

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

(2)bean的生命周期

  • bean的定义

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

  • bean的初始化

默认在IOC容器加载的时候实例化对象(ApplicationContext是,Beanfactory只有在调用getBean的时候才进行实例化):生命周期(初始化、销毁方法、BeanPostProcessor后处理Bean) - 怀梦想,致远方 - 博客园

  • 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 属性,执行指定的方法。

     

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring中bean的生命周期 的相关文章

随机推荐

  • Spring核心概念

    BeanDefinition BeanDefinition表示Bean定义 BeanDefinition中存在很多属性用来描述一个Bean的特点 比如 class 表示Bean类型 scope 表示Bean作用域 单例或原型等 lazyIn
  • python3 leecode之快乐数

    题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果 可以变为 1 那么这个数就是快乐
  • 05-Mysql夺命三连问:什么是索引下推?什么是索引覆盖?什么是回表?【Java面试总结】

    Mysql夺命三连问 什么是索引下推 什么是索引覆盖 什么是回表 索引下推是mysql5 6 提出的一个查询优化方案 主要的目的是减少数据或查询中不必要的读取和计算 它的原理是将查询条件尽可能的推送到索引层面进行过滤 减少从磁盘读取的数据量
  • Win10报错! 由于找不到hhctrl.ocx win10运行帮助时hhctrl.ocx缺失的解决方法

    hhctrl ocx下载地址 1 到网上下载hhctrl ocx 然后将下载的ocx文件复制到C Windows System32目录下 Win7 Vista系统的路径是一样的 64位放到C Windows SysWOW64 2 开始 菜单
  • 使用OpenCV对物体搜索检测与识别

    在本教程中 我们将了解对象检测中称为 选择性搜索 的重要概念 我们还将用C 和Python共享OpenCV代码 物体检测与物体识别 对象识别算法识别图像中存在哪些对象 它将整个图像作为输入 并输出该图像中存在的对象的类标签和类概率 例如 类
  • vue3 - setup之defineEmits

    基础形式 子组件 const emits defineEmits name 触发emits事件 const eventButton gt emits name 父组件
  • 第14.11节 Python中使用BeautifulSoup解析http报文:使用查找方法快速定位内容

    一 引言 在 第14 10节 Python中使用BeautifulSoup解析http报文 html标签相关属性的访问 介绍了BeautifulSoup对象的主要属性 通过这些属性可以访问标签 内容 但这种方法要么就只能访问符合条件的第一个
  • robot framework 使用三:浏览器兼容性自动化

    robot framework 测试浏览器兼容性 上图中黄色圈的地方默认什么都不写 是firefox浏览器 写上ie就是ie浏览器了 firefox最新版本就行 ie需要设置 1 IE选项设置的安全页中 4个区域的启用保护模式的勾选都勾上
  • git commit遇到的问题:error: pathspec ‘xxx‘ did not match any file(s) known to git

    问题 git commit 时出现报错 error pathspec xxx did not match any file s known to git 原因 未知 可以看下其他人的答案 查询其他人的说法 远程分支与本地分支没有建立连接等
  • C++中的类模板(黑马程序员)

    目录 类模板 类模板 1 1 类模板语法 1 2 类模板与函数模板区别 1 3 类模板中成员函数创建时机 1 4 类模板对象做函数参数 主要了解类模板实例化出的对象后 如何向函数传参 1 5 类模板与继承 1 6 类模板成员函数类外实现 1
  • 使用GetOpenFileName创建“选择文件”对话框

    GetOpenFileName用于创建一个打开文件对话框 存在于头文件commdlg h 原型 BOOL WINAPI GetOpenFileName Inout LPOPENFILENAME lpofn lpofn为一个指向OPENFIL
  • MySQL JDBC URL中几个重要参数说明

    jdbc mysql host port host port database 参数名1 参数值1 参数名2 参数值2 参数名称 参数说明 缺省值 最低版本要求 user 数据库用户名 用于连接数据库 所有版本 password 用户密码
  • tensorflow中如何average checkpoint

    首先获取checkpoint的状态以及每个参数的值 ckpt state tf train get checkpoint state model dir ckpts ckpt state all model checkpoint paths
  • java - 面向对象程序的三大特性 封装、继承、多态

    目录 1 封装 1 1访问限定符 1 2包 1 3导入包中的类 1 4如何自定义包 1 5 包的访问权限控制举例 1 6 常见的包 1 7如果修改封装好的成员变量 2 继承 什么继承 子类中访问父类成员变量 子类和父类不存在同名成员变量 子
  • windows电脑文件传输至ipad/iphone

    前言 个人分享而已 好坏对错与否勿喷 介意就别看 文明上网 tips1 本方法适用于稍微有点计算机基础的伙伴们 tips2 本方法需要你的电脑上已经安装并配置好了python 只要你电脑可以进行python代码程序运行就是ok的 tip3
  • Vue使用axios、解决axios跨域

    axios axios文档 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端 从浏览器中创建 XMLHttpRequests 从 node js 创建 http 请求 支持 Promise API 拦截
  • 用vue3 写出一个完整的用户登录界面

    首先 安装必要的依赖包 npm install vue next vue router vuex 然后 创建一个名为App vue的根组件
  • 基于GRU的时间序列预测及matlab代码实现

    基于GRU的时间序列预测及matlab代码实现 时间序列预测在实际应用中非常重要 如股票市场预测 气象预报 交通流量预测等 门控循环单元 Gated Recurrent Unit GRU 是一种比较新的循环神经网络结构 具有快速训练和处理长
  • 详解“辗转相除法”(如何求最大公约数)

    本篇博客来讲一讲学习C语言过程中遇到的一种解法 辗转相除法 首先我会介绍辗转相除法的概念 然后会用一道例题进行运用 最后会进行总结 一 辗转相除法的概念 辗转相除法又称欧几里得算法辗转相除法 是指用于计算两个非负整数a b的最大公约数 应用
  • spring中bean的生命周期

    1 spring中bean的生命周期 1 概念 在spring框架中 所有的bean对象都有生命周期 就是指bean的创建 初始化 服务 销毁的一个过程 2 bean的生命周期 bean的定义 在spring中通常是通过配置文档的方式来定义