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

相關文章
相關標籤/搜索