栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring手动注册/销毁Bean

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring手动注册/销毁Bean

package org.demo.spring;

import lombok.extern.slf4j.Slf4j;
import org.example.rest.User;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.locks.ReentrantReadWriteLock;

@Service
@Slf4j
public class ManualOperationBeanUtil {

    @Resource
    private ApplicationContext applicationContext;

    
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();


    
    public void registryBean(String beanName) {
        log.info("开始注册[{}]。", beanName);
        lock.writeLock().lock();
        try {
            DefaultListableBeanFactory beanFactory = getBeanFactory();
            //注册DataSourceBean
            GenericBeanDefinition dataSourceBeanDefinition = this.buildBeanDefinition(beanName);
            beanFactory.registerBeanDefinition(beanName, dataSourceBeanDefinition);
            log.info("注册[{}]成功!", beanName);
        } finally {
            lock.writeLock().unlock();
        }
    }


    
    public void unRegistryBean(String beanName) {
        log.info("开始注销bean[{}]。", beanName);
        lock.writeLock().lock();
        try {
            DefaultListableBeanFactory beanFactory = getBeanFactory();
            if (beanFactory.containsBeanDefinition(beanName)) {
                beanFactory.destroySingleton(beanName);
                beanFactory.removeBeanDefinition(beanName);
                log.info("注销[{}]成功!", beanName);
            } else {
                log.info("不存在[{}],不需要注销!", beanName);
            }
        } finally {
            lock.writeLock().unlock();
        }
    }


    
    private DefaultListableBeanFactory getBeanFactory() {
        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
        return (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
    }


    
    public  T getBean(String name) {
        return (T) applicationContext.getBean(name);
    }


    private GenericBeanDefinition buildBeanDefinition(String beanName) {
        GenericBeanDefinition definition = null;
        switch (beanName) {
            case "user":
                BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
                definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
                definition.setBeanClass(User.class);
                definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_NAME);
               

                // 属性赋值
                definition.getPropertyValues().add("id", "1")
                        .add("name", "张三")
                        .add("password", "123")
                        .add("mail", "zhangsan@qq.com");
                break;
            default:
                throw new RuntimeException("创建bean异常");
        }
        return definition;
    }


}
@Data
public class User extends base implements Serializable {
    private static final long serialVersionUID = 1L;

    private String id;

    private String name;

    private String password;

    private String mail;

}

单侧:

public class ManualOperationBeanUtilTest  extends baseTest {

    @Autowired
    ManualOperationBeanUtil manualOperationBeanUtil;

    @Test
    public void test() {
        manualOperationBeanUtil.registryBean("user");
        User user = manualOperationBeanUtil.getBean("user");
        System.out.println(user);
        manualOperationBeanUtil.unRegistryBean("user");
        // NoSuchBeanDefinitionException
        user = manualOperationBeanUtil.getBean("user");
        System.out.println(user);
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号