Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理
    **Spring**容器通过插入一个或多个**BeanPostProcessor**的实现来完成实例化,配置和初始化一个bean之后实现一些自定义逻辑回调方法
    配置多个**BeanPostProcessor**接口,通过设置**BeanPostProcessor**实现的Ordered接口提供的**Order**属性来控制这些**BeanPostProcessor**接口的执行顺序,实现**Ordered.getOrder()**方法,返回值越小,执行顺序越靠前
    在自定义的的**BeanPostProcessor**接口实现类中,要实现以下的两个抽象方法**BeanPostProcessor.postProcessBeforeInitialization(Object, String)****BeanPostProcessor.postProcessAfterInitialization(Object, String)**,注意命名要准确,否则会出现:**“ The type InitHelloWorld must implement the inherited abstract method BeanPostProcessorpostProcessBeforeInitialization(Object, String) ”**之类的错误
    案例代码:
    Person.java

    1. package com.baklib.custom;
    2. public class Person {
    3. private String name;
    4. private String carType;
    5. public String getName() {
    6. return name;
    7. }
    8. public void setName(String name) {
    9. this.name = name;
    10. }
    11. public String getCarType() {
    12. return carType;
    13. }
    14. public void setCarType(String carType) {
    15. this.carType = carType;
    16. }
    17. public void buyCar(){
    18. System.out.println(this.getName()+"购买了"+this.getCarType()+"!");
    19. }
    20. public void init(){
    21. System.out.println("进入4S店");
    22. }
    23. public void destroy(){
    24. System.out.println("离开4S店");
    25. }
    26. }

    InitPerson0.java

    1. package com.baklib.custom;
    2. import org.springframework.beans.BeansException;
    3. import org.springframework.beans.factory.config.BeanPostProcessor;
    4. import org.springframework.core.Ordered;
    5. public class InitPerson0 implements BeanPostProcessor, Ordered {
    6. @Override
    7. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    8. System.out.println(this.getClass()+" BeforeInitialization0: "+beanName+"\tOrder: "+this.getOrder());
    9. return bean;
    10. }
    11. @Override
    12. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    13. System.out.println(this.getClass()+" AfterInitialization0: "+beanName+"\tOrder: "+this.getOrder());
    14. return bean;
    15. }
    16. @Override
    17. public int getOrder() {
    18. return 5;
    19. }
    20. }

    InitPerson1.java

    1. package com.baklib.custom;
    2. import org.springframework.beans.BeansException;
    3. import org.springframework.beans.factory.config.BeanPostProcessor;
    4. import org.springframework.core.Ordered;
    5. public class InitPerson1 implements BeanPostProcessor, Ordered {
    6. @Override
    7. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    8. System.out.println(this.getClass()+" BeforeInitialization1: "+beanName+"\tOrder: "+this.getOrder());
    9. return bean;
    10. }
    11. @Override
    12. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    13. System.out.println(this.getClass()+" AfterInitialization1: "+beanName+"\tOrder: "+this.getOrder());
    14. return bean;
    15. }
    16. @Override
    17. public int getOrder() {
    18. return 3;
    19. }
    20. }

    MainApp.java

    1. package com.baklib.custom;
    2. import org.springframework.context.support.AbstractApplicationContext;
    3. import org.springframework.context.support.ClassPathXmlApplicationContext;
    4. public class MainApp {
    5. public static void main(String[] args) {
    6. AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
    7. Person person = (Person) context.getBean("person");
    8. person.buyCar();
    9. context.registerShutdownHook();
    10. }
    11. }

    配置文件 Beans.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5. <bean id="person" class="com.baklib.custom.Person" init-method="init" destroy-method="destroy">
    6. <property name="name" value="张三" />
    7. <property name="carType" value="小轿车" />
    8. </bean>
    9. <bean class="com.baklib.custom.InitPerson0" />
    10. <bean class="com.baklib.custom.InitPerson1" />
    11. </beans>

    编写完以上代码,就可以运行这个程序,运行结束后,可以在控制台看到下面的信息

    1. class com.baklib.custom.InitPerson1 BeforeInitialization1: person Order: 3
    2. class com.baklib.custom.InitPerson0 BeforeInitialization0: person Order: 5
    3. 进入4S
    4. class com.baklib.custom.InitPerson1 AfterInitialization1: person Order: 3
    5. class com.baklib.custom.InitPerson0 AfterInitialization0: person Order: 5
    6. 张三购买了小轿车!
    7. 离开4S