spring——bean生命周期的第五步与第八步之使用动态代理实现增强操作
程序员文章站
2022-02-08 07:25:51
...
1、创建一个bean处理类 ,实现BeanPostProcessor接口。在其提供的两个方法中进行增强操作
package cn.itcast.demo4;
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;
//最重要的是以下两步:可以进行一些增强操作
public class MyBeanPostProcessor implements BeanPostProcessor{
//第五步
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{
System.out.println("第五步:初始化之前执行");
return bean;
}
//第八步
public Object postProcessAfterInitialization(final Object bean,String beanName) throws BeansException{
System.out.println("第八步:在初始化之后执行");
//使用动态代理实现方法增强:
//进行判断,只对lifeService这个bean进行增强操作
if(beanName.equals("lifeServiceImp")){
//获取代理 :使用proxy,要求代理对象类必须实现至少一个接口
Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
//InvocationHandler为匿名内部类
//在调用代理的类中的方法的时候,就会自动调用invoke
//method为当前调用的方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName());
//进行判断,只对addUser方法进行增强操作
if("addUser".equals(method.getName())){
System.out.println("权限校验");
Object result = method.invoke(bean, args);
return result;
}
return method.invoke(bean, args);
}
});
return proxy;//返回代理对象才会执行增强操作
}
return bean;//返回bean 不执行增强操作
}
}
2、在spring配置文件applicationContext.xml中配置 该类。其不需要配置id,因为它由ioc容器自动执行
<!-- 不用设置id,它是由ioc容器自动调用的 -->
<bean class="cn.itcast.demo4.MyBeanPostProcessor"></bean>
上一篇: 根据文件最后修改时间来读取文件
下一篇: 再一次理解String