spring 动态 注册bean的两种方式

1:通常用实现  BeanDefinitionRegistryPostProcessor 实现bean注册,代码如下

@Configuration
public class NetsDaoBeanConfig implements BeanDefinitionRegistryPostProcessor {
    private BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator();
    /**
     * daoImpl包
     */
    static final String BASE_PACKAGES = "com.*.*.*.*.dao.impl";

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
        throws BeansException {
        System.out.println("NetsDaoBeanConfig.postProcessBeanDefinitionRegistry()");
        this.daoRegisterBean(registry);
    }

    private  void daoRegisterBean(BeanDefinitionRegistry registry){
        Set<Class> scan = ClassScannerUtil.scan(BASE_PACKAGES);
        for (Class tl : scan) {
            registerBean(registry, null, tl);
        }
    }

    /**
     * 提供公共的注册方法。
     *
     * @param registry
     * @param name
     * @param beanClass
     */
    private void registerBean(BeanDefinitionRegistry registry, String name, Class<?> beanClass) {
        AnnotatedBeanDefinition annotatedBeanDefinition = new AnnotatedGenericBeanDefinition(beanClass);
        annotatedBeanDefinition.setParentName("baseDao");
        //自动生成name
        String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(annotatedBeanDefinition, registry));
        System.out.println("生成的beanName:" + beanName);
        //bean注册的holer类.
        BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(annotatedBeanDefinition, beanName);
        //使用bean注册工具类进行注册.
        BeanDefinitionReaderUtils.registerBeanDefinition(beanDefinitionHolder, registry);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("NetsDaoBeanConfig.postProcessBeanFactory()");
    }

registerBean 方法为核心代码

说明:BeanDefinitionRegistryPostProcessor  实现动态注册, 优先级较高,在容器未初始化完成前,添加bean注册,如果注册的bean中的属性需要引用其他的一些bean 如Datasource 对象,是获取不到的。

 

方法2:在容器初始化完成后,添加bean

@Configuration
public class IdGeneratorBeanConfig implements  ApplicationContextAware{
private ApplicationContext applicationContext;
 @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
        DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext
            .getAutowireCapableBeanFactory();
        this.registBeanByFactory(beanFactory);
    }
    private void registBeanByFactory(DefaultListableBeanFactory beanFactory) {
        System.out.println("IdGeneratorBeanConfig.registBeanByFactory()");
        List<SeqEnum> seqList = SeqEnum.getAllSeqInfos();
        //遍历序列动态注册bean
        for (SeqEnum seqEnum : seqList) {
            String beanName = "seqBeanName_" + count.incrementAndGet();
            this.registerBean(beanFactory, beanName,MySQLMaxValueIncrementer.class, seqEnum);
            MySQLMaxValueIncrementer incrementer = (MySQLMaxValueIncrementer) applicationContext.getBean(beanName);
            incrementer.init();//除非init方法


        }
    }

 /**
     *  容器初始化完成后进行添加bean
     *
     * @param beanClass
     */
    private void registerBean(DefaultListableBeanFactory beanFactory, String beanName, Class<?> beanClass, SeqEnum seqEnum) {
        AnnotatedBeanDefinition annotatedBeanDefinition = new AnnotatedGenericBeanDefinition(beanClass);
        ((AnnotatedGenericBeanDefinition) annotatedBeanDefinition).setPropertyValues(getPropertyValues(seqEnum));//添加属性
        beanFactory.registerBeanDefinition(beanName,annotatedBeanDefinition);
    }

 /**
     * 属性设置
     */
    private MutablePropertyValues getPropertyValues(SeqEnum seqEnum) {
        MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
        mutablePropertyValues.add("seqName", seqEnum.getSeqName());
        mutablePropertyValues.add("cacheSize", seqEnum.getCacheSize());
        mutablePropertyValues.add("dataSource", applicationContext.getBean("dataSource"));
        mutablePropertyValues.add("incrementerName", seqEnum.getIncrementerName());
        return mutablePropertyValues;
    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值