環境:spring
jdk:1.7app
spring:3.2.0.RELEASEide
第一步:post
建立一個實體類,並利用BeanFactoryPostProcessor、InstantiationAwareBeanPostProcessor實現類生成實例對象測試
實體類:this
public class SimplePostProcessor { private String connectionString; private String password; private String username; public String getConnectionString() { return connectionString; } public void setConnectionString(String connectionString) { this.connectionString = connectionString; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String toString() { return "SimplePostProcessor{" + "connectionString='" + connectionString + '\'' + ", password='" + password + '\'' + ", username='" + username + '\'' + '}'; } }
BeanFactoryPostProcessor接口實現類:spa
public class ObscenityRemovingBeanFactoryPostProcessor implements BeanFactoryPostProcessor { private Set<String> obscenties; public ObscenityRemovingBeanFactoryPostProcessor() { this.obscenties = new HashSet<>(); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { String[] beanNames = beanFactory.getBeanDefinitionNames(); for(String beanName : beanNames) { BeanDefinition bd = beanFactory.getBeanDefinition(beanName); StringValueResolver valueResolver = new StringValueResolver() { @Override public String resolveStringValue(String strVal) { if(isObscence(strVal)) { return "******"; } return strVal; } }; BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(valueResolver); visitor.visitBeanDefinition(bd); } } public boolean isObscence(Object value) { String potentialObscence = value.toString().toUpperCase(); return this.obscenties.contains(potentialObscence); } public void setObscenties(Set<String> obscenties) { this.obscenties.clear(); for (String obscenty: obscenties) { this.obscenties.add(obscenty.toUpperCase()); } } }
InstantiationAwareBeanPostProcessor接口實現類:3d
public class MyInstantiationAwareBeanFactoryProcessor implements InstantiationAwareBeanPostProcessor { @Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { System.out.println("zzx test =========================="); return null; } @Override public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { return false; } @Override public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { return null; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } }
第二步:調試
編寫spring.xml文件,並編寫測試代碼xml
spring.xml文件內容以下:
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-lazy-init="false" > <bean id="bfpp" class="com.zzx.study.propertyConfigurer.ObscenityRemovingBeanFactoryPostProcessor"> <property name="obscenties"> <set> <value>bolloks</value> <value>winky</value> <value>bum</value> <value>Microsoft</value> </set> </property> </bean> <bean id="simpleBean" class="com.zzx.study.propertyConfigurer.SimplePostProcessor"> <property name="connectionString" value="bolloks"/> <property name="password" value="imagecup"/> <property name="username" value="Microsoft"/> </bean> <bean class="com.zzx.study.propertyConfigurer.MyInstantiationAwareBeanFactoryProcessor"/> </beans>
測試代碼以下:
public class PropertyConfigurerTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("spring-property-configurer.xml"); System.out.println(context.getBean("simpleBean")); } }
第三步:
使用斷點調試,spring初始化simpleBean工做流程,對BeanFactoryPostProcessor和InstantiationAwareBeanPostProcessor的處理
1.ClassPathXmlApplicationContext.refresh()纔開始加載spring容器
2.AbstractApplicationContext.invokeBeanFactoryPostProcessors->invokeBeanFactoryPostProcessors()
開始處理自定義的ObscenityRemovingBeanFactoryPostProcessor.postProcessBeanFactory()方法
3.AbstractApplicationContext.finishBeanFactoryInitialization(),開始beanFactory中實體bean初始化
4.DefaultListableBeanFactory.preInstantiateSingletons()->getBean(),準備獲取實體bean
5.AstractFactoryBean.doGetBean(),開始獲取實體bean動做
6.AbstractAutowireCapableBeanFactory.createBean()->resolveBeforeInstantiation(),開始建立實體bean,
並調用自定義MyInstantiationAwareBeanFactoryProcessor.postProcessBeforeInstantiation()
7.AbstractAutowireCapableBeanFactory.doCreateBean()->populateBean(),裝載實體所須要的屬性,並調用
自定義MyInstantiationAwareBeanFactoryProcessor.postProcessAfterInstantiation()方法
8.AbstractAutowireCapableBeanFactory.initializeBean()準備真正初始化實體bean,首先會調用
自定義MyInstantiationAwareBeanFactoryProcessor.postProcessBeforeInitialization()方法
9.AbstractAutowireCapableBeanFactory.invokeInitMethods(),用戶自定義bean實現InitializingBean的會先調用自定義的afterPropertiesSet方法,
再實現用戶的init-method()方法
10.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(),實現用戶自定義
MyInstantiationAwareBeanFactoryProcessor.postProcessAfterInitialization()方法