环境: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()方法