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") 来获取
原文地址:https://www.cnblogs.com/frankltf/p/11451597.html