簡介
●Spring IOC讀取Bean的相關屬性,保存到beanDefinition對象中。
● 加載完所有beanDefinition之后,調用BeanFactoryPostProcessor接口擴展點。
● 根據(jù)beanDefinition創(chuàng)建bean對象。
如果想獲取beanDefinition信息或者修改beanDefinition對象中的屬性, 可以實現(xiàn)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);
}
}
}
它有兩個實現(xiàn)類:
● PropertyOverrideConfigurer:比如數(shù)據(jù)庫配置為"dataSource.driverClassName=com.mysql.jdbc.Driver",這個類負責將這個value從配置文件中(比如叫datasource.properties)讀取配置寫到相應的beanDefinition中。
● PropertyPlaceholderConfigurer ,這個類可以將代碼中定義的"${...}"替換為配置文件中的實際的值。
2.在Spring啟動時打印相關信息, 比如bean的個數(shù),統(tǒng)計指定特性的bean信息。