Spring中动态注册和销毁对象

1. 使用说明

        通常我们项目中想要往spring容器中注入一个bean可以在项目初始化的时候结合@Bean注解实现。但是该方法适合项目初始化时候使用,如果后续想要继续注入对象则无可奈何。本文主要描述一种在后续往spring容器注入bean的方法。

2. 实现

2.1 说明

2.1.1 注册bean

  • 定义BeanDefinition,注册类定义到factory中
  • 创建对象,注册实例到fatory中

2.1.2 销毁bean

  • 判断是否有类定义。有,则移除BeanDefinition
  • 判断是否有对象。有,则从容器中去除

2.2 代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;/*** @author pp_lan* @date 2024/1/17*/
@Component
public class SpringUtils {@Autowiredprivate ApplicationContext context;private DefaultListableBeanFactory factory;@PostConstructpublic void init() {factory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();}/*** 注册对象** @param beanName* @param object*/public void registerBean(String beanName, Object object) {// 添加类定义factory.registerBeanDefinition(beanName, new RootBeanDefinition(object.getClass()));// 添加类实例factory.registerSingleton(beanName, object);}/*** 删除对象** @param beanName*/public void removeBean(String beanName) {List<String> beanDefinitionList = Arrays.asList(factory.getBeanDefinitionNames());if (beanDefinitionList.contains(beanName)) {factory.destroySingleton(beanName);}for (Iterator<String> it = factory.getBeanNamesIterator();it.hasNext();) {String next = it.next();if (next.equals(beanName)) {factory.removeBeanDefinition(beanName);return;}}}/*** 获取bean** @param clazz* @return* @param <T>*/public <T> T getBean(String name, Class<T> clazz) {for(Iterator<String> it = factory.getBeanNamesIterator();it.hasNext();) {String next = it.next();if (next.equals(name)) {return this.context.getBean(name, clazz);}}return null;}
}

2.3 测试代码

 @RequestMapping("/addUser")public Response add(String userId) {User user = new User(userId, "zhang", "小张");springUtils.removeBean("user");springUtils.registerBean("user", user);User zhang = springUtils.getBean("user", User.class);return Response.ok(zhang);}@RequestMapping("/get")public Response get() {return Response.ok(springUtils.getBean("user", User.class));}

3. 运行

3.1 初次运行

3.2 注册bean

使用addUser注册后,使用get方法获取容器内中的user对象,结果如下:

3.3 再次注册,覆盖对象

销毁已存在的对象,重新注册对象。使用get方法获取容器内中的user对象,结果如下:

4. 总结

        通过removeBean方法和registerBean结合,可以达到spring容器内对象的销毁、注册、替换等目的。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三棋先手必胜证明

目录 创作原因 游戏规则 初始状态图 证明过程 先手必胜的证明 失败的博弈树&#xff08;三个多小时的成果&#xff09; 创作原因 这个棋不是网上流行的成三棋&#xff0c;我也不知道这个棋叫什么。由于这个棋是&#xff08;横竖斜&#xff09;连成三个就获胜&#xff0c;…

Dubbo负载均衡解析

Dubbo负载均衡四件套 相比Ribbon负载均衡策略里的十八般兵器&#xff0c;Dubbo就显得低调的多了&#xff0c;它只提供了负载均衡四件套&#xff0c;让我们先来简单了解一下: 负载均衡策略底层算法RandomLoadBalance基于权重算法的负载均衡策略LeastActiveLoadBalance基于最少…

PXE——高效批量网络装机

目录 部署PXE远程安装服务 1.PXE概述 2.实现过程 3.实验操作 3.1安装dhcp、vsftpd、tftp-server.x86_64、syslinux服务 3.2修改配置文件——DHCP 3.3修改配置文件——TFTP 3.4kickstart——无人值守安装 3.4.1选择程序 3.4.2修改基础配置 3.4.3修改安装方法 3.4.4…

【多线程】认识Thread类及其常用方法

&#x1f4c4;前言&#xff1a; 本文是对以往多线程学习中 Thread类 的介绍&#xff0c;以及对其中的部分细节问题进行总结。 文章目录 一. 线程的 创建和启动&#x1f346;1. 通过继承 Thread 类创建线程&#x1f345;2. 通过实现 Runnable 接口创建线程&#x1f966;3. 其他方…

【Python数据可视化】matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

vue实现 marquee(走马灯)

样式 代码 <div class"marquee-prompt"><div class"list-prompt" refboxPrompt><span v-for"item in listPrompt" :title"item" class"prompt">{{item}}</span></div> </div>data() {…

[C++] opencv - copyTo函数介绍和使用案例

copyTo函数介绍 copyTo函数是OpenCV库中的一个成员函数&#xff0c;用于将一个Mat对象的内容复制到另一个Mat对象中。 函数原型&#xff1a; void cv::Mat::copyTo(OutputArray m) const;void cv::Mat::copyTo(OutputArray m, InputArray mask) const; 参数说明&#xff1a;…

C语言位域定义与使用

参考文章&#xff1a; 【C语言】详解位域定义与使用_c 语言定义位-CSDN博客 代码有修改&#xff0c;主要是变量初始化&#xff0c;原程序可能相应内存不能写。且第二个字节F不好区分各位。 #include <stdio.h>typedef struct {unsigned short b1 : 1;unsigned short b…

rust获取本地外网ip地址的方法

大家好&#xff0c;我是get_local_info作者带剑书生&#xff0c;这里用一篇文章讲解get_local_info的使用。 get_local_info是什么&#xff1f; get_local_info是一个获取linux系统信息的rust三方库&#xff0c;并提供一些常用功能&#xff0c;目前版本0.2.4。详细介绍地址&a…

LeetCode面试题02.07链表相交

力扣题目链接 思想&#xff08;数学&#xff09;&#xff1a;设链表A的长度为a&#xff0c;链表B的长度为b&#xff0c;A到交点D的距离为c&#xff0c;B到交点D的距离为d。显然可以得到两者相交链表的长度为&#xff1a;a - c b - d ,变换一下式子得到&#xff1a;a d b …

高效除甲醛 污染物 光触媒 5nm石墨烯二氧化钛粉CY05S

商品描述 技术指标&#xff1a; 项目 指标 型号 CY05S 粉末外观 蓝黑色粉体 粒径 <5nm 含量 99% 表面性质 亲水 使用方法&#xff1a; 把CY05S粉用蒸馏水&#xff0c;去离子水等&#xff0c;做成固含为1-2%的水溶液&#xff0c;喷涂于墙壁&#xff0c;天花板&a…

什么是身份治理和管理(IGA)

员工的数字身份在组织阶梯内移动时可能会发生变化&#xff0c;将对用户帐户应用与访问相关的修改的过程往往会变得费力且耗时&#xff0c;其强度与组织的人数成正比&#xff0c;为了简化用户身份管理&#xff0c;组织实施了身份治理和管理。 身份治理和管理&#xff08;IGA&am…