如何动态往Spring容器注册/移除bean?

几个关键点需要知道

本文不谈原理,直接上实战。

几个关键点:如何拿到Spring上下文来创建bean或移除bean?如何准备构建bean所需的BeanDefinition?

第一问:可注入bean工厂org.springframework.beans.factory.support.DefaultListableBeanFactory得到;

第二问:使用org.springframework.beans.factory.support.BeanDefinitionBuilder来构建BeanDefinition。

实例

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;

import java.beans.Introspector;
import java.lang.reflect.Modifier;

/**
 * Bean 处理器
 */
@Slf4j
@Component
public class SpringBeanClassHandler {

    /**
     * Bean 工厂
     */
    private final DefaultListableBeanFactory beanFactory;

    public SpringBeanClassHandler(DefaultListableBeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    /**
     * 注册一个普通的bean
     *
     * @param beanCls - 待注册的bean class
     */
    public void registerBean(Class<?> beanCls) {
        if (beanCls == null) {
            return;
        }
        if (Modifier.isAbstract(beanCls.getModifiers())
                || Modifier.isPrivate(beanCls.getModifiers())
                || Modifier.isNative(beanCls.getModifiers())
                || Modifier.isInterface(beanCls.getModifiers())) {
            log.warn("can not support register this class to bean for: {} - {}", beanCls.getName(), Modifier.toString(beanCls.getModifiers()));
        }
        // 注册新的Bean
        String beanName = Introspector.decapitalize(beanCls.getSimpleName());
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(beanCls);
        GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
        definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);// 按类型自动注入
        beanFactory.registerBeanDefinition(beanName, definition);
        log.info("dynamic successfully register bean: {}", beanFactory.getBean(beanName));
    }

    /**
     * 移除 Bean
     *
     * @param beanCls - Bean class
     */
    public void removeBean(Class<?> beanCls) {
        if (beanCls == null) {
            return;
        }
        String clsName = Introspector.decapitalize(beanCls.getSimpleName());
        if (beanFactory.containsBean(clsName)) {
            beanFactory.removeBeanDefinition(clsName);
        }
    }

    /**
     * Spring 容器是否 已存在Bean
     *
     * @param beanCls
     * @return - boolean
     */
    public boolean containsBean(Class<?> beanCls) {
        return beanFactory.containsBean(Introspector.decapitalize(beanCls.getSimpleName()));
    }
}

完结。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于Spring Bean的创建流程,我可以简单地给您介绍一下。 1. Spring容器读取Bean的定义,解析XML配置文件或者注解,获取Bean的信息。 2. Spring容器根据Bean的定义使用Java反射机制创建Bean实例。 3. Spring容器Bean的属性值和其他Bean的引用注入到Bean实例中。 4. 如果Bean实现了BeanNameAware和BeanFactoryAware接口,Spring容器Bean的ID和BeanFactory实例注入到Bean中。 5. 如果Bean实现了ApplicationContextAware接口,Spring容器将ApplicationContext实例注入到Bean中。 6. 如果Bean实现了BeanPostProcessor接口,Spring容器将调用BeanPostProcessor的postProcessBeforeInitialization方法对Bean进行预处理。 7. 如果Bean实现了InitializingBean接口,Spring容器将调用其afterPropertiesSet方法进行初始化。 8. 如果Bean在配置文件中使用了init-method属性或者使用了@PostConstruct注解,Spring容器将调用指定的初始化方法进行初始化。 9. 如果Bean实现了BeanPostProcessor接口,Spring容器将调用BeanPostProcessor的postProcessAfterInitialization方法对Bean进行后处理。 10. 当需要将Bean从容器移除时,如果Bean实现了DisposableBean接口,Spring容器将调用其destroy方法进行销毁。 11. 如果Bean在配置文件中使用了destroy-method属性或者使用了@PreDestroy注解,Spring容器将调用指定的销毁方法进行销毁。 以上就是Spring Bean的创建流程,希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流沙QS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值