04Spring_bean 后处理器(后处理Bean),BeanPostProcessor ,bean创建时序,动态代理

时间:2023-03-09 03:39:46
04Spring_bean 后处理器(后处理Bean),BeanPostProcessor ,bean创建时序,动态代理

这篇文章很重要,讲解的是动态代理,以及bean创建前后的所发生的事情。介绍一个接口:在Spring构造Bean对象过程中,有一个环节对Bean对象进行 后处理操作 (钩子函数) ----- Spring 提供 BeanPostProcessor 接口。我们可以自定义类,实现 BeanPostProcessor 接口,配置到Spring容器中,在构造对象时,spring容器会调用接口中方法。

这个接口两个方法public Object postProcessAfterInitialization(Object bean, String beanName) 方法以及public Object postProcessBeforeInitialization(final Object bean, String beanName) 这两个方法里面的bean就是spring IO容器创建对象,beanName就是Sring配置文件applicationContext.xml文件里面对应的bean id。

为了说明postProcessBeforeInitialization和postProcessAfterInitialization的具体调用顺序,举一个例子说明。

//applicationContext.xml
<bean id="teacherService" class="cn.****.cyclelife.TeacherService" init-method="init" destroy-method="destroy">
<constructor-arg type="java.lang.Integer" index="0">
<value>20</value>
</constructor-arg>
<property name="name">
<value>Longmanfei</value>
</property>
</bean>
<bean id="postService"class="cn.****.cyclelife.PostService"></bean>
//TeacherService bean
public class TeacherService { private String name; private Integer age; public void setName(String name){
System.out.println("----这是teacherservice的set方法----");
this.name=name;
} public TeacherService(Integer age){
this.age=age;
} public void init(){
System.out.println("--------这是teacherservice的init的方法-------------");
} public void destroy(){
System.out.println("---------这是销毁(destroy)方法----------");
} public void display(){
System.out.println(this.name+"-----------------"+this.age);
}
}
// 实现接口的BeanPostProcessor bean
public class PostService implements BeanPostProcessor{ /**在初始化之后调用这个方法*/
@Override
public Object postProcessAfterInitialization(Object bean, String arg1)
throws BeansException {
System.out.println("----这是init之后执行的方法postProcessAfterInitialization----");
return bean;
} /**在初始bean之前调用的这个方法 在init方法之前执行,在set方法之后*/
@Override
public Object postProcessBeforeInitialization(Object bean, String arg1)
throws BeansException {
/**instanceof 判断前者是否是后者的一个实例*/
if(bean instanceof TeacherService){
System.out.println("--这是在init之前进行修改bean的属性值--");
/*这里我们不能直接new一个对象 因为bean本身就是一个对象,直接转换就可以了*/
((TeacherService)bean).setName("Longmanfei");
}
System.out.println("---这是init之前执行的方法postProcessBeforeInitialization---");
return bean;
}
}
//Junit 测试方法
public class App { @Test
public void test1(){
/**加载容器*/
ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"applic*.xml"});
/**调用getbean方法*/
TeacherService ts = (TeacherService) ac.getBean("teacherService"); ts.display(); /**调用close方法关闭bean*/
AbstractApplicationContext aac =(AbstractApplicationContext) ac;
aac.close();
} }
//这是执行结果(当加载容器的时候会判断是否有实现接口的BeanPostProcessor bean,如果有其他Bean就会按照特定的顺序去执行,并且执行实现接口的bean里的方法)
----这是teacherservice的set方法----
--这是在init之前进行修改bean的属性值--
----这是teacherservice的set方法----
---这是init之前执行的方法postProcessBeforeInitialization---
--------这是teacherservice的init的方法-------------
----这是init之后执行的方法postProcessAfterInitialization----
Longmanfei-----------------20
---------这是销毁(destroy)方法----------

这个例子里面可以看到Spring先会创造bean的实例对象,然后调用postProcessBeforeInitialization,然后再调用init-method="init"方法,然后再调用postProcessAfterInitialization方法。

这里我给一个bean的创建流程图

aaarticlea/png;base64,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" alt="" />

这个图对上面的例子的代码运行结果给出了很好的解释。(这个博客非常不错http://uule.iteye.com/blog/2094609)

换句话说我们在执行public Object postProcessBeforeInitialization(final Object bean, String beanName)方法时,传入的值bean就是IOC容器已经给我们创建好的对象了,

那么我们可以拿这个对象做什么呢?很重要的一点就是动态代理,我们可以给这个bean对象做个动态代理。

先给出具体代码我在做分析:

做动态代理必须要接口,所以我先给出抽象角色(接口)

package cn.itcast.spring.d_lifecycle;

public interface IHello {
public void sayHello(); public void setup(); public void teardown();
}

再给出真实角色:

package cn.itcast.spring.d_lifecycle;

/**
* Bean对象,初始化和销毁方法 (无返回值、无参数、非静态)
*
* @author seawind
*
*/
public class LifeCycleBean implements IHello {
public LifeCycleBean() {
System.out.println("LifeCycleBean 构造...");
}
//配置文件中init-method="setup"
public void setup() {
System.out.println("LifeCycleBean 初始化...");
}
//配置文件中destroy-method="teardown"
public void teardown() {
System.out.println("LifeCycleBean 销毁...");
}
//被代理的方法
@Override
public void sayHello()
{ System.out.println("hello ,itcast..."); }
}

再给出实现了BeanPostProcessor接口的方法:

package cn.itcast.spring.d_lifecycle;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; /**
* 后处理器
*
* @author seawind
*
*/
public class MyBeanPostProcessor implements BeanPostProcessor {
static int a=0;
@Override
/**
* bean 代表Spring容器创建对象
* beanName 代表配置对象对应 id属性
*/ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (beanName.equals("lifeCycleBean")) {
System.out.println("后处理器 初始化后执行...");
}
return bean;
} @Override
public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
// 针对bean id 为 lifeCycleBean的对象 进行代理,配置文件中bean的id为lifeCycleBean就做一下处理
if (beanName.equals("lifeCycleBean")) {
System.out.println("后处理器 初始化前执行...");
/*给传进来的bean对象做一个动态代理.bean.getClass().getClassLoader表示要被执行代理的类,也就是我们的IOC容器创建的bean对象。
bean.getClass().getInterfaces()表示我们的要代理的类所实现
的所有的而接口,我们最后new出来的代理类会按照这个参数实现这些所有的接口。这也是为什么动态代理模式必须要用接口的原因了。
new InvocationHandler() {}表示真正要执行的方法。
最后用的是return 就是把生成出来的的代理类返回了。所以执行好这个方法后其实的返回的是new 出来的的代理类,而不是之前的bean对象了。(这句话非常重要)
*/
return Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//模拟代理方法(额外要执行的方法)
System.out.println("执行代理.....");

//执行要真正的方法
return method.invoke(bean, args); }
});
}
return bean;
} }

再给出Spring的配置文件(applicationContext.xml)

<bean id="lifeCycleBean" class="cn.itcast.spring.d_lifecycle.LifeCycleBean"
init-method="setup" destroy-method="teardown" />

最后给出Junit的测试代码

package cn.itcast.spring.d_lifecycle;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class LifeCycleTest {
@Test
public void testInitDestroy() {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
IHello lifeCycleBean = (IHello) applicationContext.getBean("lifeCycleBean");
System.out.println(lifeCycleBean);
lifeCycleBean.sayHello(); // 必须手动调用 容器销毁的方法 --- web服务器tomcat,自动调用容器销毁
applicationContext.close();
}
}

对上面代码的分析:经过public class MyBeanPostProcessor implements BeanPostProcessor里面的postProcessBeforeInitialization方法后,就是给IOC创建的bean对象进行了动态代理,在Junit的测试代码中。我们执行了 lifeCycleBean.sayHello();就会被动态代理给拦截,执行 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {......}里面的方法.这里的lifeCycleBean已经不是lifeCycleBean.class类型了,而是com.sun.proxy.$Proxy4类型了,要验证这个观点很简单,只要在public class LifeCycleTest 方法中的 lifeCycleBean.sayHello();之前加一句System.out.println(lifeCycleBean);就可以得到验证。

最后给出上述代码的是运行结果:

后处理器 初始化前执行...
执行代理.....
被代理的方法是public abstract void cn.itcast.spring.d_lifecycle.IHello.setup()a的值是1aaaaacn.itcast.spring.d_lifecycle.LifeCycleBeanLifeCycleBean 初始化...
后处理器 初始化后执行...
执行代理.....
被代理的方法是public java.lang.String  java.lang.Object.toString()

aaaaacn.itcast.spring.d_lifecycle.LifeCycleBeancn.itcast.spring.d_lifecycle.LifeCycleBean@a0430b6
测试方法中lifeCycleBean的真相是com.sun.proxy.$Proxy4执行代理.....

被代理的方法是public abstract void cn.itcast.spring.d_lifecycle.IHello.sayHello()a的值是3aaaaacn.itcast.spring.d_lifecycle.LifeCycleBeanhello ,itcast...

这里很奇怪,为什么执行了这么多的“执行代理” 原因很简单,因为setup()和 System.out.println(lifeCycleBean)和 lifeCycleBean.sayHello();每一次执行方法时都会被动态代理所拦截,从而执行了三次动态代理。