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") 来获取
  • 相关阅读:
    做自己的ORMapping Framework ---- 第三讲 关于Attribute
    Hugepages,hugetlb_shm_group与ORA-27125
    65个面试回答技巧
    在线修改Schema
    percona innobackupex 遇到 connect to MySQL server as DBD::mysql module is not installed 问题
    MYSQL中的日期转换
    SHOW INNODB STATUS 探秘
    11g手动打补丁
    11g OCM自动打补丁
    How to create Oracle ASM devices using device-mapper multipath devices in Red Hat Enterprise Linux 6
  • 原文地址:https://www.cnblogs.com/frankltf/p/11451597.html
Copyright © 2011-2022 走看看