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;
    }

}
发布了22 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/hnhygkx/article/details/87877322