Spring:Bean生命周期

news2024/9/21 14:52:00

Bean

  • 生命周期

在这里插入图片描述

生命周期

Bean 生命周期是 bean 对象从创建到销毁的整个过程。

简单的 Bean 生命周期的过程:

1.实例化(调用构造方法对 bean 进行实例化)
2.依赖注入(调用 set 方法对 bean 进行赋值)
3.初始化(手动配置 xml 文件中 bean 标签的 init-method 属性值,来指定调用对应的初始化方法)
4.使用 bean
5.销毁(与初始化方法同理,配置 destroy-method 属性值来调用销毁方法)

Bean 简单的生命周期示例:

package cn.edu.springdemo.beanDemo;

//Bean简单的生命周期测试类
public class BeanLifecycle {
    private String instance;

    public BeanLifecycle() {
        super();
        System.out.println("1.调用构造方法:实例化 bean ");
    }

    public void init() {
        System.out.println("3.调用初始化方法:初始化 bean ");
    }

    public void destroy() {
        System.out.println("5.调用销毁方法:关闭容器,bean 销毁");
    }

    public String getInstance() {
        return instance;
    }

    public void setInstance(String instance) {
        this.instance = instance;
        System.out.println("2.调用set方法:给 bean 属性赋值");
    }

    @Override
    public String toString() {
        return "BeanLifecycle{" +
                "instance='" + instance + '\'' +
                '}';
    }
}

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- 初始化和销毁方法需要手动配置 -->
    <bean id="beanLifecycle" class="cn.edu.springdemo.beanDemo.BeanLifecycle"
          init-method="init" destroy-method="destroy"
          p:instance="beanLifecycleInstance" />
</beans>

测试结果:

package cn.edu.springdemo.test;

import cn.edu.springdemo.beanDemo.BeanLifecycle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AdminTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beanDemo.xml");
        BeanLifecycle beanLifecycle = (BeanLifecycle) applicationContext.getBean("beanLifecycle");
        System.out.println("4.使用bean:" + beanLifecycle);
        ((ClassPathXmlApplicationContext) applicationContext).close();
    }
}

结果如图:
在这里插入图片描述

复杂的 Bean 生命周期的过程:

1.实例化(调用构造方法对 bean 进行实例化)
2.依赖注入(调用 set 方法对 bean 进行赋值)
3.若 Bean 实现了 BeanNameAware 接口,则调用 setBeanName() 方法,传递 Bean 的 id 值
4.若 Bean 实现了 BeanFactoryAware 接口,则调用 setBeanFactory() 方法,传递 BeanFactory 对象的引用
5.若 Bean 实现了 ApplicationContextAware 接口,则调用 setApplicationContext() 方法,传递 ApplicationContext 对象的引用
6.若 Bean 实现了 BeanPostProcessor 接口,则调用 postProcessBeforeInitialization() 方法,对Bean进行预处理
7.若 Bean 实现了 InitializingBean 接口,则调用 afterPropertiesSet() 方法,执行自定义的初始化方法
8.初始化(手动配置 xml 文件中 bean 标签的 init-method 属性值,来指定调用对应的初始化方法)
9.若 Bean 实现了 BeanPostProcessor 接口,则调用 postProcessAfterInitialization() 方法,对 Bean 进行后处理
10.当容器关闭时,若 Bean 实现了 DisposableBean 接口,则调用 destroy() 方法,执行自定义的销毁方法;若手动配置 xml 文件中 bean 标签的 destroy-method 属性值,则调用指定的销毁方法

生命周期的前后置方法示例(当发现某个属性值需要修改时,但又为了防止修改原代码后报异常。在原代码不变的情况下,可以使用其生名周期阶段来进行修改):

//Bean简单的生命周期测试类保持不变
package cn.edu.springdemo.beanDemo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

//BeanPostProcessor接口的实现类
public class BeanLifecycleBPP implements BeanPostProcessor {
    //前置方法,在初始化方法执行前被调用
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("调用前置方法");
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean,beanName);
    }

    //后置方法,在初始化方法执行后被调用
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("调用后置方法");
        //获取 bean 并修改其属性值
        BeanLifecycle beanLifecycle = (BeanLifecycle) bean;
        //重新调用 set 方法进行属性赋值
        beanLifecycle.setInstance("UpdateInstanceName");
        return BeanPostProcessor.super.postProcessAfterInitialization(beanLifecycle,beanName);
    }
}

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- 初始化和销毁方法需要手动配置 -->
    <bean id="beanLifecycle" class="cn.edu.springdemo.beanDemo.BeanLifecycle"
          init-method="init" destroy-method="destroy"
          p:instance="beanLifecycleInstance" />

	<!-- 只需配置 class 属性即可 -->
    <bean class="cn.edu.springdemo.beanDemo.BeanLifecycleBPP" />
</beans>

测试结果:
在这里插入图片描述

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

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

相关文章

IDEA使用教程 安装教程

16. Codota 插件 Codota 插件可以根据使用频率优先显示较常用的类和方法。然而&#xff0c;是否使用该插件取决于个人的偏好。有时工具只能作为参考&#xff0c;仍然需要依靠个人记忆来确保准确性。 17. 快速查看类和字段的注释 按下 F2 键可以快速查看某个类或字段的文档注…

编译运行Secure Value Recovery Service v2

下载项目 git clone https://github.com/signalapp/SecureValueRecovery2.git编译 make dockersh报错 修改Dockerfile ARG PROTOC_GEN_GO_GITREV6875c3d7242d1a3db910ce8a504f124cb840c23a RUN go env -w GOPROXYhttps://goproxy.cn,direct RUN go install google.golang.org/p…

阿里云轻量应用服务器和云服务器的区别

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;云服务器ECS是明星级云服务器&#xff0c;轻量应用服务器可以理解为简化版的云服务器ECS&#xff0c;轻量适用于单机应用&#xff0c;云服务器ECS适用于集群类高可用高容灾应用&#xff0c;阿里云百科来详细说下阿里云轻…

MachineLearningWu_10_NeuralNetwork

x.1 课程目录 为了开始我们的学习&#xff0c;我们会先列出我们的课程目录&#xff0c;诸如以下&#xff0c; x.2 NN的发展 NN一开始是为了模仿人类大脑&#xff0c;但随着时间的演进&#xff0c;逐渐被使用在各种应用之中&#xff0c; 深度学习DL为何最近几年突飞猛进呢&…

IDEA使用插件绘制UML类图+PlantUML语法讲解

安装 IDEA安装插件 安装完插件记得重启一下IDEA 安装Graphviz&#xff08;亲测win11可以使用&#xff09; 安装完插件之后&#xff0c;还需要安装Graphviz才可以渲染图形。 Graphviz安装包下载地址 安装过程很简单&#xff0c;直接双击或者管理员身份运行即可&#xff0c;注…

高性能内存对象缓存 Memcached

高性能内存对象缓存 Memcached Memcached 概述 一套开源的高性能分布式内存对象缓存系统 所有的数据都存储在内存中 支持任意存储类型的数据 提高网站的访问速度 Memcached 是典型的 C/S 架构&#xff0c;因此需要安装 Memcached 服务端与 Memcached API 客户端。 数据存…

实验三(OSPF)7 8

解题思路&#xff1a; 先配置好路由的环回及规划好IP地址&#xff0c;确保正确&#xff1b; &#xff08;由于r8模拟为运营商&#xff0c;因此r1,r2,r3各写一条缺省指向r8 并测试&#xff09; hub-spoke网络结构&#xff0c;需要在r1-r2-r3建立隧道0配置MGRE-多点通用路由协…

FreeRTOS ~(七)互斥量 ~ (3/3)互斥量的缺陷和递归锁

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;2/3&#xff09;互斥的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;2/5&#xff09;队列解决互斥缺陷 FreeRTOS ~&#xff08;六&#xff09;信号量 ~ &#xff08;2/…

超详细 | 遗传-粒子群自适应优化算法及其实现(Matlab)

作者在前面的文章中介绍了两种经典的优化算法——遗传算法(GA)和粒子群算法(PSO)&#xff0c;这些智能优化算法解决问题的方式和角度各不相同&#xff0c;都有各自的适用域和局限性&#xff0c;对智能优化算法自身做的改进在算法性能方面得到了一定程度的提升&#xff0c;但算法…

前端如何实现面向对象

交流所记&#xff1a; 面向对象的三要素&#xff1a; 封装&#xff1a;把客观事物封装成抽象的类&#xff0c;并且类可以把自己的数据和方法只让可信的类或者对象操作&#xff0c;对不可信的类或者对象隐藏信息继承&#xff1a;它可以使用现有类的所有功能&#xff0c;并在无…

链上衍生品协议 ProsperEx:探索 RWA 叙事,打造 DeFi 变异黑马

“ProsperEx 本身背靠着具备潜力的链上衍生品赛道&#xff0c;同时也是 RWA 领域早期的布局者之一&#xff0c;其有望成为 Web2 世界与 Web3 世界的早期连接点&#xff0c;并具备广泛且规模性捕获用户的能力。” 从2020年DeFi之夏链上世界迎来了爆发后&#xff0c;链上衍生品赛…

SQL21 浙江大学用户题目回答情况

解法一:left JOIN select t1.device_id,question_id,result from question_practice_detail t1 left JOIN user_profile t2 on t1.device_id t2.device_id where university 浙江大学解法二:子查询 select device_id, question_id, result from question_practice_detail …

Android 性能优化系列:启动优化进阶

文章目录 启动速度优化的本质因素CPU 层面进行速度优化减少程序的指令数降低时钟周期时间降低每条指令的平均时间周期 缓存层面进行速度优化缓存的读写速度缓存的命中率 任务调度层面进行速度优化通过实时进程和普通进程了解任务调度机制原理进程生命周期 CPU 优化合理使用线程…

day67_mybatisplus

今日内容 零、 复习昨日 零、 复习昨日 一、MybatisPlus快速入门 [MyBatis-Plus](简介 | MyBatis-Plus (baomidou.com))&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官方…

InnoDB: Waiting for page_cleaner to finish flushing of buffer pool 解决方案

这个是因为linux系统时间&#xff0c;Mysql数据库时间&#xff0c;Mysql日志时间出现不一致导致的。 1、date -R 查询linux系统时间 中国标准时区东八区时区 2、mysql数据库的时间 3、在mysql的配置文件里面&#xff0c;定义好时间&#xff0c;时区一致。 问题解决。

前端Vue自定义商品评价页面单选多选标签tags组件单选多选按钮选择器picker组件

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

群晖折腾记5—docker安装emby开启核显

硬解的前提条件 Emby为正版 带核显的白裙或者已经被正确驱动的黑裙 开心版本不在讨论范围之内 需要的目录有/config /mnt/share1 /mnt/share2&#xff0c;自己创建对应的目录即可 打开ssh sudo -i输入下面命令首先判断群晖是否有核显驱动&#xff0c;白裙使用有带核显cpu的可…

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题

由于一段时间没有使用Selenium&#xff0c;当再次使用时发现之前写的Selenium元素定位的代码运行之后会报错&#xff0c;发现是Selenium更新到新版本&#xff08;4.x版本&#xff09;后&#xff0c;以前的一些常用的代码的语法发生了改变&#xff0c;当然如果没有更新过或是下载…

VS2022 Fortran调用lapack 64位库

首先&#xff0c;可以在官网下载以下lib 下载64位的&#xff0c;然后就是添加文件所在的文件夹&#xff0c;以及添加lib&#xff0c;就可以直接使用lapack中的函数&#xff0c;但是现在Oneapi中集成了lapack库&#xff0c;所以可以直接调用&#xff0c;如下所示。 1. 首先&…