Spring中动态注册和销毁对象

这篇具有很好参考价值的文章主要介绍了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 {

    @Autowired
    private ApplicationContext context;

    private DefaultListableBeanFactory factory;

    @PostConstruct
    public 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 初次运行

Spring中动态注册和销毁对象,spring,spring,java

3.2 注册bean

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

Spring中动态注册和销毁对象,spring,spring,java

Spring中动态注册和销毁对象,spring,spring,java

3.3 再次注册,覆盖对象

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

Spring中动态注册和销毁对象,spring,spring,java

Spring中动态注册和销毁对象,spring,spring,java

4. 总结

        通过removeBean方法和registerBean结合,可以达到spring容器内对象的销毁、注册、替换等目的。文章来源地址https://www.toymoban.com/news/detail-802334.html

到了这里,关于Spring中动态注册和销毁对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 网页版Java(Spring/Spring Boot/Spring MVC)五子棋项目(二)前后端实现用户的登录和注册功能【用户模块】

    网页版Java(Spring/Spring Boot/Spring MVC)五子棋项目(二)前后端实现用户的登录和注册功能【用户模块】

    1. 用户id 2. 用户名 3. 密码 4. 天梯积分 5. 总场数 6. 获胜场数 和数据库的数据一一对应 1. 连接数据库(application.yml连接数据库) 这个可以直接赋值代码 2. 创建UserMapper的Java接口(interface UserMapper) 创建接口,在UserMapper.xml实现 在model中创建 需要实现@Mapper注释 3. 创建UserMappe

    2024年02月13日
    浏览(15)
  • 答疑解惑:解释在Mybatis-Spring下@Mapper与@MapperScan为何不能同时生效以及实现动态条件注册Mapper接口

    若项目中使用了@MapperScan注解后,则@Mapper注解不再生效 , 原因是:@MapperScan注解 会执行@Import(MapperScannerRegistrar.class),而MapperScannerRegistrar又会注册MapperScannerConfigurer BEAN,在MapperScannerConfigurer BEAN中会完成基于配置的包目录扫描注册所有mapper interface代理BEAN,而@Mapper注解的生效

    2024年02月11日
    浏览(10)
  • 【Java】Spring Boot配置动态数据源

    1.1 创建动态数据源 通过实现Spring提供的AbstractRoutingDataSource类,可以实现自己的数据源选择逻辑,从而可以实现数据源的动态切换。 1.2 创建动态数据源配置类 跟配置静态多数据源一样,需要手动配置下面的三个 Bean,只不过DynamicDataSource类的targetDataSources是空的。 1.3 创建动

    2024年02月09日
    浏览(12)
  • Spring IOC容器:让Java对象的管理和配置更简单

    在Java开发中,我们经常需要创建和使用各种Java对象,例如实体类,服务类,控制器类等。这些对象之间通常存在着一定的依赖关系,例如一个服务类可能需要调用另一个服务类或一个数据访问类的方法。为了创建和使用这些对象,我们通常需要做以下几件事: 在代码中通过

    2024年02月11日
    浏览(13)
  • spring boot application yaml key下划线如何转java的Properties对象字段驼峰

    spring boot application yaml key下划线如何转java的Properties对象字段驼峰

    spring boot yaml key和value如何映射到Properties对象 下面以MybatisPlusProperties为例 ##java properties 字段驼峰 ##yaml文件如图,key使用下划线 ##java对象驼峰转下划线匹配yaml文件key DataObjectPropertyName.toDashedForm(name);//驼峰转下划线 ##设置Properties对象字段值

    2024年02月01日
    浏览(6)
  • 【论坛java项目】第二章 Spring Boot实践,开发社区登录模块:发送邮件、开发注册功能、会话管理、生成验证码、开发登录、退出功能、

    【论坛java项目】第二章 Spring Boot实践,开发社区登录模块:发送邮件、开发注册功能、会话管理、生成验证码、开发登录、退出功能、

    😀如果对你有帮助的话😊 🌺为博主点个赞吧 👍 👍点赞是对博主最大的鼓励😋 💓爱心发射~💓 bofryuzursekbiab——密码 访问邮箱域名 邮箱端口 账号 密码 协议 详细配置 JavaMailSender 是 Spring Email 的核心组件,负责发送邮件 MimeMessage 用于封装邮件的相关信息 MimeMessageHelper 用

    2024年02月06日
    浏览(15)
  • SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)动态SQL

    SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)动态SQL

    昨天我们深入学习了 Mybatis的核心对象SqlSessionFactoryBuilder , 掌握MyBatis核心配置文件以及元素的使用 ,也掌握MyBatis映射文件及其元素的使用。那么今天我们需要掌握的是更加复杂的查询操作。 学会编写MyBatis中动态SQL 学会MyBatis的条件查询操作 学会MyBatis的更新操作 学会MyBati

    2024年02月11日
    浏览(17)
  • Spring Boot 笔记 023 注册页面

    Spring Boot 笔记 023 注册页面

    1.1 request.js请求工具 2.1 编写注册接口 3.1 编写页面 3.2 给表单绑定数据 3.3 定义表单校验规则 3.4 调用注册接口 3.1 跨域问题 3.1.1 修改request.js 3.1.2 修改vite.config.js 4.1 测试

    2024年02月19日
    浏览(9)
  • spring eurake中使用IP注册

    spring eurake中使用IP注册

    在开发spring cloud的时候遇到一个很奇葩的问题,就是服务向spring eureka中注册实例的时候使用的是机器名,然后出现localhost、xxx.xx等这样的内容,如下图: 我不知道这朋友用的什么spring cloud版本,反正我是用的spring cloud()版本中是没有这个,但是有下面配置, ​ 能够正确的

    2024年02月11日
    浏览(1)
  • spring boot mybatis plus mapper如何自动注册到spring bean容器

    spring boot mybatis plus mapper如何自动注册到spring bean容器

    ##@Import(AutoConfiguredMapperScannerRegistrar.class) ##注册MapperScannerConfigurer ##MapperScannerConfigurer.postProcessBeanDefinitionRegistry方法扫描注册mapper ##找到mapper候选者 ##过滤mapper 类 候选者 ##BeanDefinitionHolder注册到spring 容器

    2024年01月17日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包