简介
●Spring IOC读取Bean的相关属性,保存到beanDefinition对象中。
● 加载完所有beanDefinition之后,调用BeanFactoryPostProcessor接口扩展点。
● 根据beanDefinition创建bean对象。
如果想获取beanDefinition信息或者修改beanDefinition对象中的属性, 可以实现BeanFactoryPostProcessor进行修改。
示例:
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
beanDefinitionBuilder.addPropertyValue("id", 123);
beanDefinitionBuilder.addPropertyValue("name", "修改definition");
defaultListableBeanFactory.removeBeanDefinition("user");
defaultListableBeanFactory.registerBeanDefinition("user", beanDefinitionBuilder.getBeanDefinition());
}
}
用途
1.Spring应用读取配置
抽象类:PropertyResourceConfigurer, 主要做的就是读取properties文件,做一些必要的转换,并将这些properties写到bean Definition中。
public abstract class PropertyResourceConfigurer extends PropertiesLoaderSupport
implements BeanFactoryPostProcessor, PriorityOrdered {
private int order = Ordered.LOWEST_PRECEDENCE; // default: same as non-Ordered
// 略:serOrder / getOrder
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
try {
Properties mergedProps = mergeProperties();
// Convert the merged properties, if necessary.
convertProperties(mergedProps);
// Let the subclass process the properties.
processProperties(beanFactory, mergedProps);
}
catch (IOException ex) {
throw new BeanInitializationException("Could not load properties", ex);
}
}
}
它有两个实现类:
● PropertyOverrideConfigurer:比如数据库配置为"dataSource.driverClassName=com.mysql.jdbc.Driver",这个类负责将这个value从配置文件中(比如叫datasource.properties)读取配置写到相应的beanDefinition中。
● PropertyPlaceholderConfigurer ,这个类可以将代码中定义的"${...}"替换为配置文件中的实际的值。
2.在Spring启动时打印相关信息, 比如bean的个数,统计指定特性的bean信息。