标签:... 修改 就是 问题 void npos after get style
一 . 概述
在前面我们说过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的属性,
设置生成一个代理对象,这也很多第三方框架做的事情.
标签:... 修改 就是 问题 void npos after get style
原文地址:https://www.cnblogs.com/trekxu/p/9090982.html