Spring手动注册/销毁Bean


AIO项目中,摄像头注册bean,在删除摄像头的时候,注意把bean注销,否则再次添加该摄像头时,由于重复注册bean导致报错

Bean

package com.shark.aio.data.video.configuration;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Configuration;

@Configuration
public class VideoConfiguration implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        VideoConfiguration.applicationContext = applicationContext;
    }

    public static <T> T getBean(Class<T> tClass,String beanName){
        if (applicationContext.containsBean(beanName)){
            return applicationContext.getBean(beanName, tClass);
        }else {
            return null;
        }
    }

    /**
     *  动态注入bean
     * @param requiredType 注入类
     * @param beanName bean名称
     */
    public static void registerBean(Class<?> requiredType,String beanName){

        //将applicationContext转换为ConfigurableApplicationContext
        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;

        //获取BeanFactory
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getAutowireCapableBeanFactory();

        //创建bean信息.
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(requiredType);

        //动态注册bean.
        defaultListableBeanFactory.registerBeanDefinition(beanName, beanDefinitionBuilder.getBeanDefinition());

    }


    /**
     *  动态注销bean
     * @param beanName bean名称
     */
    public static void unRegistryBean(String beanName) {
//        System.out.println("开始注销bean[{}]。"+beanName);

        try {
            //将applicationContext转换为ConfigurableApplicationContext
            ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
            DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getAutowireCapableBeanFactory();;
            if (beanFactory.containsBeanDefinition(beanName)) {
                beanFactory.destroySingleton(beanName);
                beanFactory.removeBeanDefinition(beanName);
                System.out.println("注销摄像头 " + beanName + " 成功!");
            } else {
                System.out.println("不存在摄像头" + beanName + " 不需要注销!");
            }
        } catch (Exception e){

        }
    }


}

使用

//在ioc容器中注册bean
VideoConfiguration.registerBean(VideoRecorderService.class, video.getMonitorName());

//查看该bean
VideoRecorderService videoRecorderService = VideoConfiguration.getBean(VideoRecorderService.class,video.getMonitorName());
System.out.println(videoRecorderService);

//注销bean
VideoConfiguration.unRegistryBean(video.getMonitorName());

//查看bean的注销情况
VideoRecorderService videoRecorderService = VideoConfiguration.getBean(VideoRecorderService.class,video.getMonitorName());
System.out.println(videoRecorderService);

参考

https://blog.csdn.net/meser88/article/details/120999408?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170626071916800188556847%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170626071916800188556847&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-3-120999408-null-null.142^v99^pc_search_result_base6&utm_term=java%E5%8A%A8%E6%80%81%E6%B3%A8%E5%86%8C%E5%92%8C%E6%B3%A8%E9%94%80bean&spm=1018.2226.3001.4187


文章作者: Luan-bx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Luan-bx !
  目录