spring之Bean的生命周期

news2024/11/20 10:42:17

文章目录

  • 一、Bean的生命周期之五步
    • 1、准备User类
    • 2、spring配置文件
    • 3、测试类
    • 4、运行结果
  • 二、Bean的生命周期之七步
    • 1、实现BeanPostProcessor类
    • 2、配置文件
    • 3、运行结果:
  • 三、Bean的生命周期之十步
    • 1、点位1
    • 2、点位2
    • 3、点位3
  • 四、Bean的作用域


一、Bean的生命周期之五步

Bean的生命周期按照粗略的五步的话:

  • 第一步:实例化Bean(调用无参数构造方法)
  • 第二步:Bean属性赋值(调用set方法)
  • 第三步:初始化Bean(调用Bean的init方法,需要自己写自己配)
  • 第四步:使用Bean
  • 第五步:销毁Bean(调用Bean的destory方法,需要自己写自己配

在这里插入图片描述

需要手动关闭spring容器

        //销毁Bean 必须手动关闭Spring容器
        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
        context.close();

需要手动指定初始化方法和销毁方法

init-method="initBean" destroy-method="destroyBean"

1、准备User类

无参构造 name属性以及set方法

public class User {
    private String name;

    public void setName(String name) {
        System.out.println("第二步:给对象的属性赋值。");
        this.name = name;
    }

    public User() {
        System.out.println("第一步:无参数构造方法执行。");
    }
    public void initBean(){
        System.out.println("第三步:初始化Bean。");
    }
    public void destroyBean(){
        System.out.println("第五步:销毁Bean。");
    }
}

2、spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="user" class="com.bjpowernode.spring.bean.User"
          init-method="initBean" destroy-method="destroyBean">
        <property name="name" value="小白"></property>

    </bean>
</beans>

3、测试类

    @Test
    public void testBeanLifeCircle(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = applicationContext.getBean("user", User.class);
        System.out.println("第四步:使用Bean:"+user);
        //销毁Bean 必须手动关闭Spring容器
        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
        context.close();
    }

4、运行结果

在这里插入图片描述

二、Bean的生命周期之七步

在以上的五步中,第三步是初始化Bean,如果还想在初始化前和初始化后添加代码,可以加入”Bean后处理器“ ----”BeanPostProcessor“

Bean生命周期七步:

  • 第一步:实例化Bean(调用无参数构造方法)
  • 第二步:Bean属性赋值(调用set方法)
  • 第三步:执行”Bean后处理器“的before方法
  • 第四步:初始化Bean(调用Bean的init方法,需要自己写自己配)
  • 第五步:执行”Bean后处理器“的after方法
  • 第六步:使用Bean
  • 第七步:销毁Bean(调用Bean的destory方法,需要自己写自己配)
    在这里插入图片描述

1、实现BeanPostProcessor类

编写一个类实现BeanPostProcessor类,并且重写before和after方法:

出现return 报错的现象可能是jdk版本太低 改为1.8即可

public class LogBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第三步:执行”Bean后处理器“的before方法");
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第五步:执行”Bean后处理器“的after方法");
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }
}

2、配置文件

需要在配置文件中进行配置

注意:这个Bean后处理器将作用于整个配置文件中所有的Bean

<bean class="com.bjpowernode.spring.bean.LogBeanPostProcessor"></bean>

完整的:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean class="com.bjpowernode.spring.bean.LogBeanPostProcessor"></bean>

    <bean id="user" class="com.bjpowernode.spring.bean.User"
          init-method="initBean" destroy-method="destroyBean">
        <property name="name" value="小白"></property>

    </bean>
</beans>

3、运行结果:

在这里插入图片描述

三、Bean的生命周期之十步

比七步添加的三步在哪里?

  • 在”Bean后处理器“before方法之前(检查Bean是否实现了Aware的相关接口,并设置相关依赖)
  • 在”Bean后处理器“before方法之后(检查Bean是否实现了InitializingBean接口,并调用接口方法)
  • 销毁Bean之前或使用Bean之后(检查Bean是否实现了DisposableBean接口,并调用接口方法)
    添加的这三步的特点:都是在检查这个Bean是否实现了某些特定的接口,如果实现了这些接口,则spring容器会调用这些接口中的方法

1、点位1

实现BeanNameAware, BeanClassLoaderAware, BeanFactoryAware 接口

public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware {
    private String name;

    public void setName(String name) {
        System.out.println("第二步:给对象的属性赋值。");
        this.name = name;
    }

    public User() {
        System.out.println("第一步:无参数构造方法执行。");
    }
    public void initBean(){
        System.out.println("第四步:初始化Bean。");
    }
    public void destroyBean(){
        System.out.println("第七步:销毁Bean。");
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("Bean这个类的加载器:"+classLoader);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("生产这个Bean的工厂对象是:"+beanFactory);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("这个Bean的名字是:"+name);
    }
}

在这里插入图片描述

2、点位2

实现InitializingBean接口

public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean {

    public void setName(String name) {
        System.out.println("第二步:给对象的属性赋值。");
    }

    public User() {
        System.out.println("第一步:无参数构造方法执行。");
    }
    public void initBean(){
        System.out.println("第四步:初始化Bean。");
    }
    public void destroyBean(){
        System.out.println("第七步:销毁Bean。");
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("Bean这个类的加载器:"+classLoader);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("生产这个Bean的工厂对象是:"+beanFactory);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("这个Bean的名字是:"+name);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean's afterPropertiesSet执行。");
    }
}

在这里插入图片描述

3、点位3

实现DisposableBean接口

public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean,DisposableBean {

    public void setName(String name) {
        System.out.println("第二步:给对象的属性赋值。");
    }

    public User() {
        System.out.println("第一步:无参数构造方法执行。");
    }
    public void initBean(){
        System.out.println("第四步:初始化Bean。");
    }
    public void destroyBean(){
        System.out.println("第七步:销毁Bean。");
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("Bean这个类的加载器:"+classLoader);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("生产这个Bean的工厂对象是:"+beanFactory);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("这个Bean的名字是:"+name);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean's afterPropertiesSet执行。");
    }

    @Override

    public void destroy() throws Exception {
        System.out.println("DisposableBean's destroy执行");
    }
}

在这里插入图片描述

四、Bean的作用域

  • spring容器只对singleton的Bean进行完整的生命周期管理
  • 如果是prototype作用域,Spring容器只负责将该Bean初始化完毕,等客户端一旦获取到该Bean之后,Spring容器就不再管理该对象的生命周期了(生出来就不管了)
    测试:
    在配置文件中加入
    scope=“prototype”
    在这里插入图片描述
    客户端获取之后,就不再继续管之后的生命周期了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Coinbase或在不久使用Zebec发放工资,并对Web3支付赛道发展寄予厚望

流支付协议Zebec Protocol目前已经完成了生态向BNB Chian上的迁移&#xff0c;目前得到了以PancakeSwap为代表的头部生态的支持。在12月20日Zebec生态在PancakeSwap官方的支持下&#xff0c;经过社区投票&#xff0c;ZBC通证上线了糖浆池&#xff0c;并有望继续上线Binance。而…

ELK集群部署---Kibana的部署

1. 环境规划&#xff1a; 主机名IP地址角色node1192.168.56.111 ElasticSearch(master) Zookeeper Kafka node2192.168.56.112 ElasticSearch(slave) Kibana Zookeeper Kafka node3192.168.56.113 ElasticSearch(slave) Zookeeper Kafka node4192.168.56.114 Logstash Filebe…

优雅数据同步--canal实现mysql同步demo

当需要两张表数据同步的时候&#xff0c;我们会想到几种方案&#xff1f; 最简单的一种方式就是触发器的方式。例如A同步到B,可以通过下面的sql来添加触发器 create trigger tri_trade_update after UPDATE on A for each row begin update B set company_id new.compan…

数据结构和算法学习——稀疏数组

目录 一、数据结构和算法的关系 二、数据结构的分类 (一)线性结构 (二)非线性结构 三、稀疏数组(sparsearray) (一)稀疏数组的基本介绍 (二)稀疏数组的处理方法 一、数据结构和算法的关系 数据data结构(structure)是一门研究组织数据方式的学科&#xff0c;有了编程语言…

Grafana 查询数据和转换数据

Grafana 系列文章&#xff0c;版本&#xff1a;OOS v9.3.1 Grafana 的介绍和安装Grafana监控大屏配置参数介绍&#xff08;一&#xff09;Grafana监控大屏配置参数介绍&#xff08;二&#xff09;Grafana监控大屏可视化图表Grafana 查询数据和转换数据 介绍 Grafana能够支持各…

微服务网关GateWay

在微服务架构下&#xff0c;网关的本质&#xff0c;其实就是对请求进行路由转发&#xff0c;在此基础上我们可以根据网关在整个微服务架构中的特殊位置&#xff0c;对请求进行前置和后置的处理。 请求转发和路由&#xff1a;网关类似于一个门面&#xff0c;微服务的组织细节对…

三维数字化开发管理中心

目录一、前言二、项目依赖2.1 后端2.2 前端三、快速运行3.1 启动后台服务3.2 启动前台页面四、使用手册4.1 登录4.2 首页4.3 资源中心4.4 在线预览4.5 三维开发4.6 信息管理4.6.1 用户信息4.6.2 模型信息4.7 个人中心五、数据库5.1 数据需求5.2 数据流图5.3 数据字典1&#xff…

马斯克辞任CEO,产品经理如何用项目协作软件武装自己?

自马斯克接管推特以来&#xff0c;已经发起了多轮裁员潮&#xff0c;仅第一波就裁掉了50%的员工。11月14日&#xff0c;马斯克开启第二波裁员。而IT之家12 月 21 日消息&#xff0c;埃隆・马斯克在推特发文对网友的投票结果做出回应&#xff0c;称会尽快找到一个足够傻的人来接…

蓝桥杯备赛Day3——基础数据结构(一维数组)

目录 数据结构 什么是数据结构? 《数据结构》教材一般包含 基础数据结构 最简单的数据结构——一维数组 一维数组的定义 一维变长数组 一维正向遍历 一维反向遍历 一维数组区间操作&#xff08;实际上就是切片操作&#xff09; 一维数组从a[1]开始赋值 一维数组的读…

热门项目披露:四川超声印制板有限公司100%股权转让

热门项目披露&#xff1a;四川超声印制板有限公司100%股权转让 项目推荐指数&#xff1a;&#xff1b;该项目由 北京产权交易所 发布&#xff0c;于2022年12月11日被塔米狗平台收录。 项目方 四川超声印制板有限公司&#xff0c; 成立于 1998年7月5日 &#xff0c; 注册资金 2…

Unity 3D Hierarchy 视图 || Unity 3D Project 视图

Unity 3D 的 Hierarchy 视图包含了每一个当前场景的所有游戏对象&#xff08; GameObject &#xff09;&#xff0c;如下图所示。 其中一些是资源文件的实例&#xff0c;如 3D 模型和其他预制物体&#xff08; Prefab &#xff09;的实例&#xff0c;可以在 Hierarchy 视图中选…

Mac 截图工具 iShot Pro - 软件介绍、下载安装详细教程

Mac 截图工具 iShot Pro -软件介绍、下载安装详细教程 iShot -优秀&#xff0c;功能齐全的区域截图&#xff0c;窗口截图&#xff0c;多窗口截图&#xff0c;长屏幕截图&#xff0c;shell截图&#xff0c;时间间隔截图&#xff0c;快速注释&#xff0c;纹理&#xff0c;颜色匹配…

虚拟专用网VPN(计算机网络-网络层)

目录 专用网络与专用地址 RFC 1918指明的专用地址 互连两个地点的专用网络 虚拟专用网VPN (Virtual Private Network) IP 隧道技术 VPN 的要点 专用网络与专用地址 世界上有很多机构有自己独立的网络&#xff0c;这些网络并不与因特网 互连&#xff0c;为该机构所专有&…

【LeetCode】有效的数独 [M](模拟)

36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 一、题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔…

国产CAE的涅槃-岩土行业高性能离散元软件MatDEM

作者 | 刘春博士 一、导读 2019年9月11日&#xff0c;ANSYS公司公开宣称&#xff1a;“收购LSTC公司&#xff0c;一举获得其旗下拥有LS-DYNA&#xff08;结构&流体&电磁的多物理场求解器&#xff09;、LS-PrePost&#xff08;前后处理器&#xff09;、LS-OPT/LS-TASC…

基于Web的文件管理系统,支持Office、WPS预览/编辑、在线解压缩、文件分享、文件加密、远程存储、远程文件推送、秒传、断点

基于Web的文件管理系统&#xff0c;支持权限管理、历史版本管理、Office预览/编辑、WPS预览/编辑、在线解压缩、文件分享、文件加密、远程存储、远程文件推送、秒传、断点续传、智能搜索、文件备注、本地自动备份、异地自动备份、一键迁移、集群部署。 主要应用场景&#xff1…

14_视图

1. 常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不应该修改&…

STM32正点原子图片——显示实验

目录 一、图片显示部分 GIF piclib.c介绍 图像显示实验main.c介绍 二、SD卡模块 1、SD卡基础知识 2、SD卡读操作 3、SD卡写操作 一、图片显示部分 GIF GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在1987年开发的图像文件格式。GI…

敏捷价值流管理

对团队或企业来说&#xff0c;敏捷能够通过快速迭代、改进来更好地为客户或终端用户交付价值。但有些团队在引入敏捷项目管理模式之后&#xff0c;团队管理层看了看埋头工作的团队&#xff0c;“唉&#xff1f;团队的效率好像并没有提升啊&#xff0c;这不和以前一样吗……”在…

怎样给黑白照片上色?2个技能教你如何给黑白照片上色

大家看过长辈的黑白照片吗&#xff1f;最近我的爷爷翻出了几十年前的老照片&#xff0c;给我细细道来每张照片背后的故事。可惜那个年代的技术水平有限&#xff0c;没办法拍出好看的彩色照片。如今照片修复技术层层递进&#xff0c;我想借助一些图片处理软件&#xff0c;将这些…