Spring对BeanFactoryPostProcessor、InstantiationAwareBeanPostProcessor接口实现类处理流程

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

相关文章
相关标签/搜索