spring扩展点总结

NamespaceHandler

通过自定义的NamespaceHandler,配合BeanDefinitionParser,可以完成自定义Bean的组装操作,对于BeanDefinition的数据结构,进行个性化创建。

BeanFactoryPostProcessor

实现BeanFactoryPostProcessor的Bean,ApplicationContext会提前实例化,并使用BeanFactoryPostProcessor对BeanFactory中的BeanDefinition进行变化修改,或者创建BeanDefinition到BeanFactory中。

比如PropertyPlaceholderConfigurer可将property-placeholder中的配置文件信息替换到BeanDefinition中。

比如ConfigurationClassPostProcessor发现BeanFactory中使用了@Configuration注解的Bean,并根据此Bean在BeanFactory中增加Bean。

比如MyBatis中使用的MapperScannerConfigurer,扫描basePackage配置下的接口,生成多个Bean并注册到BeanFactory中。

BeanFactoryPostProcessor主要用于处理容器相关的内容,他被触发时机是在IoC容器加载完配置刚好执行完BeanFactory初始化之后。这个时候除了PostProcessors这个Bean,其他任何Bean都没有被创建。 所以在BeanFactoryPostProcessor处理Bean是不合适的,Bean应该要到BeanPostProcessor中去处理,2者的区别就是前者面向容器,后者面向Bean。

BeanPostProcessor

分别在Bean实例初始化之前和之后执行,可自定义修改Bean实例,甚至替换Bean实例为自定义实例。

https://www.cnblogs.com/mahuan2/p/7232372.html?utm_source=itdadao&utm_medium=referral

动态的向容器放入一个bean
@Component
public class MydefinitionRegistery implements BeanDefinitionRegistryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
        // TODO Auto-generated method stub

    }


    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        for (int i=0;i<10;i++) {
            BeanDefinitionBuilder  builder = BeanDefinitionBuilder.rootBeanDefinition(User.class);
            builder.addPropertyValue("name", "HZZ"+i);
            builder.addPropertyValue("age", 15+i);
            builder.addPropertyValue("time", new Date());
            registry.registerBeanDefinition("user——def"+i,builder.getBeanDefinition());
        }

    }

}
posted @ 2018-11-21 17:34  antball  阅读(312)  评论(0编辑  收藏  举报