SpringAOP:JDK动态代理
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringAOP:JDK动态代理相关的知识,希望对你有一定的参考价值。
SpringAOP:JDK动态代理
在Java中有多种动态代理技术,其中最常用的动态代理技术是JDK和CGLIB。
下面介绍一下JDK动态代理,JDK动态代理是java.lang.reflect.*包提供的方式,它必须提供一个接口才能提供代理对象,对于使用业务接口的类,Spring默认使用JDK动态代理实现AOP,下面示例实现JDK动态代理实现SpringAOP。
1-在eclipse中创建web应用ch15,并导入相应jar包,如下所示.
2-在ch15中的src目录下,创建dynamic.jdk包,在该包中创建接口TestDao和接口实现类testDaoImpl
public interface TestDao {
public void save() ;
public void modify() ;
public void delete() ;
}
public class TestDaoImpl implements TestDao{
@Override
public void save() {
System.out.println("保存") ;
}
@Override
public void modify() {
System.out.println("修改") ;
}
@Override
public void delete() {
System.out.println("删除") ;
}
}
3-在src目录下创建一个包aspect,在该包中创建切面类MyAspect类,在该类中定义多个通知
//切面类,可以定义多个通知,即增强处理的方法
public class MyAspect {
public void check() {
System.out.println("模拟权限控制") ;
}
public void except() {
System.out.println("模拟异常处理") ;
}
public void log() {
System.out.println("模拟日志记录") ;
}
public void monitor() {
System.out.println("性能检测") ;
}
}
4-创建代理类,在dynamic.jdk包中创建代理类JDKDynamicProxy,在JDK动态代理必须实现InvocationHandler接口,并编写代理方法。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import aspect.MyAspect;
public class JDKDynamicProxy implements InvocationHandler{
//声明目标类接口对象
private TestDao testDao ;
//创建代理的方法,建立代理对象与真实对象的关系,返回代理对象
public Object createProxy(TestDao testDao) {
this.testDao = testDao ;
//类加载器
ClassLoader cld = JDKDynamicProxy.class.getClassLoader() ;
//被代理对象实现的所有 接口
Class [] clazz = testDao.getClass().getInterfaces();
//使用代理类进行增强,返回所有代理对象
return Proxy.newProxyInstance(cld, clazz, this) ;
}
/**
* 代理的逻辑方法,所有动态代理类的方法调用都交给该方法处理
* proxy:被代理的对象
* method:将要被执行的方法
* args:执行该方法需要的参数
* return:返回的代理结果
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyAspect myAspect = new MyAspect() ; //创建一个切面
//前增强
myAspect.check();
myAspect.except() ;
//在目标类中调用方法并传入参数,想当于调用testDao的方法
Object obj = method.invoke(testDao, args) ;
//后增强
myAspect.log() ;
myAspect.monitor();
return obj ;
}
}
5-创建测试类,在dynamic.jdk包中创建测试类JDKDynamicTest,然后从代理对象获取目标对象增强后的对象,调用该对象的相应方法。
public class JDKDynamicTest {
public static void main(String[] args) {
//创建代理对象
JDKDynamicProxy jdkProxy = new JDKDynamicProxy() ;
///创建目标对象
TestDao testDao = new TestDaoImpl() ;
//从代理对象获取增强后的目标对象,该代理是一个被代理的对象,他会进入代理的逻辑方法invoke中
TestDao testDaoAdvice = (TestDao) jdkProxy.createProxy(testDao) ;
testDaoAdvice.save();
System.out.println("================");
testDaoAdvice.modify() ;
System.out.println("================") ;
testDaoAdvice.delete();
System.out.println("================");
}
}
6-测试结果如下:
以上是关于SpringAOP:JDK动态代理的主要内容,如果未能解决你的问题,请参考以下文章