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