一、作用:
BeanFactoryPostProcessor:BeanFactory的后置处理器;
在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;
所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
BeanFactoryPostProcessor原理:
1)、IOC容器创建对象
2)、invokeBeanFactoryPostProcessors(beanFactory);
如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
1)、直接在beanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
2)、在初始化创建其它组件前面执行
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{ @Override public void postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory) throws BeansException { String[] beanNames = beanFactory.getBeanDefinitionNames(); System.out.println("all bean names are " + Arrays.asList(beanNames)); System.out.println("MyBeanFactoryPostProcessor execute......"); } }
@Configuration public class ConfigurationBean { @Bean public MyBeanFactoryPostProcessor myBeanFactoryPostProcessor() { return new MyBeanFactoryPostProcessor(); } @Bean public Person person() { return new Person(); } }
public class Person implements ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware { private ApplicationContext applicationContext; @Override public void setEmbeddedValueResolver(StringValueResolver resolver) { String resolve = resolver.resolveStringValue("你好,${os.name},我是#{36*10}"); System.out.println(resolve); } @Override public void setBeanName(String name) { System.out.println("this bean name is " + name); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public Person() { System.out.println("person construct ...."); } }
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext( ConfigurationBean.class);
打印
all bean names are [org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, configurationBean, myBeanFactoryPostProcessor, person] MyBeanFactoryPostProcessor execute...... person construct .... this bean name is person 你好,Windows 7,我是360
二、应用
如:PlaceholderConfigurerSupport用来解析bean属性配置中的占位符,如数据源配置属性${jdbc.url},${jdbc.username}