012 BeanPostProcessor

一 . 概述

  在前面我们说过spring为我们提供了各种初始化时的回调方式,对于我们来说最为重要的就是BeanPostProcessor这个接口.


二 .BeanPostProcessor

public interface BeanPostProcessor {
   
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
   
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

}

上面的方法会在初始化过程的前面执行.

我们看下参数,一个是Bean对象,另外一个就是Bean的名字.


三 .演示  

public class User {
    private String name;
    public void setName(String name) {
        System.out.println("设值注入...");
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void init() {
        System.out.println("init 执行了 ...");
    }

    public User() {
        System.out.println("构造函数执行了...");
    }

    public void destroy() {
        System.out.println("销毁方法执行了...");
    }

}

BeanPostProcessor:

public class UserBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof User) {
            System.out.println("bean post before");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof User) {
            System.out.println("bean post after");
        }
        return bean;
    }

}

配置文件: 

    <bean id="user" class="com.trek.init.User" init-method="init" destroy-method="destroy">
        <property name="name" value="trek"></property>
    </bean>
    <bean class="com.trek.init.UserBeanPostProcessor"></bean>

测试代码: 

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        User user = (User) context.getBean("user");
        System.out.println(user);
        context.close();

运行结果: 

构造函数执行了...
设值注入...
bean post before
init 执行了 ...
bean post after
com.trek.init.User@2a2d45ba
五月 25, 2018 10:49:24 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@5d099f62: startup date [Fri May 25 22:49:24 CST 2018]; root of context hierarchy
销毁方法执行了...

我们发现了执行顺序的问题:

  [1]构造函数

  [2]设值注入

  [3]beanpostbefore

  [4]init

  [5]BeanPostAfter

  [6]销毁方法


四 .作用

  BeanPostProcessor的最大作用就是帮助我们拦截Bean创建的过程,我们可以在这个过程之中修改Bean的属性,

  设置生成一个代理对象,这也很多第三方框架做的事情.

猜你喜欢

转载自www.cnblogs.com/trekxu/p/9090982.html