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", "[email protected]");
                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);
    }

}

Guess you like

Origin blog.csdn.net/meser88/article/details/120999408