一、关于BeanPostProcessor

在上一篇中,学习了如何在bean实例化的时候还要销毁的时候调用相应的回调方法执行一些需要的操作。在这篇中, 主要来看看另一个概念BeanPostProcessor,通过它,你可以在bean实例化之前还要实例化之后进行一些自定义的 操作。BeanPostProcessor是一个接口,只要让一个类实现该接口,那么在spring容器中所有定义的bean初始化之前和 初始化后都会执行实现该接口的两个回调方法。

二、BeanPostProcessor示例

看了上面的还是有些模糊,那就看代码吧:

public class InitUser implements BeanPostProcessor{

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("实例化之后 :" + beanName);
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("实例化之前:" + beanName);
        return bean;
    }

}

上面的代码片段就是实现了BeanPostProcessor接口的类,我们在实现的方法中打印一些信息。从方法名称其实就 可以看出谁是实例化之前调用,谁是之后调用。接着,我们继续沿用之前的User类:

public class User{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void init(){
        System.out.println("实例化对象...");
    }
    public  void destroy(){
        System.out.println("销毁了...");
    }

}

最后定义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-3.2.xsd"
    default-init-method="init"
    default-destroy-method="destroy"
    >

    <bean id="User" class="sk.spring.tuto.demo3.User" ></bean>
    <bean class="sk.spring.tuto.demo3.InitUser"></bean>
</beans>

上述就看到增加了一个bean,对应的类是InitUser。其它都与之前的配置一样。最后实现主方法来测试它:

public class MainTest {
    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("UserBeans.xml");
        User userA = (User) context.getBean("User");
        userA.setName("Sam");
        //shutdown context
        context.registerShutdownHook();

    }
}

运行后最后结果是:

实例化之前:User

实例化对象…

实例化之后 :User

销毁了…

从结果可以看出各个回调方法执行的顺序也是按照预期的一样,首先是实例化之前,然后是实例化时候,接着是 实例化之后,最后调用destroy的销毁方法。

三、总结

本篇主要介绍了下BeanPostProcessor。通过它你可以处理一个由IoC容器创建的bean实例。例如,你可以在bean实例化 之后处理类的字段值,对bean执行验证的一些逻辑。当然,你也可以设置多个实现BeanPostProcessor接口的类。如果是这样 的情况,你得让实现该接口的类同时实现Ordered接口,并在相应方法public int getOrder()返回相应的数字以表示 执行顺序。

参考:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/overview.html

##文档信息