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();


    /**
     * @param beanName bean名称
     */
    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();
        }
    }


    /**
     * @param beanName bean名称
     */
    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();
        }
    }


    /**
     * 获取SpringBean注册器
     *
     * @return BeanDefinitionRegistry
     */
    private DefaultListableBeanFactory getBeanFactory() {
        ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext;
        return (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
    }


    /**
     * 获取bean
     *
     * @param name bean的id
     * @param <T>
     * @return
     */
    public <T> 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);
               /*  依赖其他bean,这个要先注册
               definition.getPropertyValues().add("dataSource", this.applicationContext
                        .getBean(otherBeanName), OtherBeanName.class));*/

                // 属性赋值
                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);
    }

}

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值