zoukankan      html  css  js  c++  java
  • Spring Boot动态注入删除bean

    Spring Boot动态注入删除bean

    概述

    • 因为如果采用配置文件或者注解,我们要加入对象的话,还要重启服务,如果我们想要避免这一情况就得采用动态处理bean,包括:动态注入,动态删除。

    动态注入bean思路

    • 在具体进行代码实现的时候,我们要知道,Spring管理bean的对象是BeanFactory,具体的是DefaultListableBeanFactory,在这个类当中有一个注入bean的方法:registerBeanDefinition,在调用registerBeanDefinition方法时,需要BeanDefinition参数,那么这个参数怎么获取呢?Spring提供了BeanDefinitionBuilder可以构建一个BeanDefinition,那么我们的问题就是如何获取BeanFactory了,这个就很简单了,只要获取到ApplicationContext对象即可获取到BeanFacory了

    • 流程
      <1>. 获取ApplicationContext;
      <2>. 通过ApplicationContext获取到BeanFacotory;
      <3>. 通过BeanDefinitionBuilder构建BeanDefiniton;
      <4>. 调用beanFactory的registerBeanDefinition注入beanDefinition;
      <5>. 使用ApplicationContext.getBean获取bean进行测试;

    动态注入实现代码

    // 测试类
     package com.kfit.demo.service;  
     public class TestService {  
         private String name;  
         public String getName() {  
            return name;  
         }  
         public void setName(String name) {  
            this.name = name;  
         }  
         public void print(){  
            System.out.println("动态载入bean,name="+name);  
         }  
     }  
     
    // 获取context
    ApplicationContext ctx =  (ApplicationContext) SpringApplication.run(App.class, args);  
    //获取BeanFactory  
    DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) ctx.getAutowireCapableBeanFactory();       
    //创建bean信息.  
    BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestService.class);  
    beanDefinitionBuilder.addPropertyValue("name","张三");          
    //动态注册bean.  
    defaultListableBeanFactory.registerBeanDefinition("testService", beanDefinitionBuilder.getBeanDefinition());  
    //获取动态注册的bean.  
    TestService testService =ctx.getBean(TestService.class);、testService.print(); 
    
    // 动态删除
    defaultListableBeanFactory.removeBeanDefinition("testService");  
    

    多次注入同一个bean的情况

    • 多次注入同一个bean的,如果beanName不一样的话,那么会产生两个Bean;如果beanName一样的话,后面注入的会覆盖前面的。
    • 第二种情况的时候,用beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(TestService.class); 获取bean会报错,因为在getBean的时候,找到了两个bean,这时候就不知道要获取哪个了,可以用TestService testService=ctx.getBean("testService") 来获取
  • 相关阅读:
    第一节:SpringMVC概述
    SpringMVC【目录】
    Windows 系统快速查看文件MD5
    (error) ERR wrong number of arguments for 'hmset' command
    hive使用遇到的问题 cannot recognize input
    Overleaf支持的部分中文字体预览
    Understanding and Improving Fast Adversarial Training
    Django2实战示例 第十三章 上线
    Django2实战示例 第十二章 创建API
    Django2实战示例 第十一章 渲染和缓存课程内容
  • 原文地址:https://www.cnblogs.com/frankltf/p/11451597.html
Copyright © 2011-2022 走看看