Spring的AOP,底层原理是动态代理。
动态代理的实现一般有两种:JDK的动态代理和Cglib的动态代理。
下面我们先介绍Jdk动态代理的实现。
Jdk动态代理,是基于接口的开发的,如果没有接口,不能使用JDK动态代理生成代理对象。
JDK动态代理,不需要引入如何jar文件,只需要写接口和实现类,还需要创建一个代理类,该类可以生成需要代理的类的代理类对象。
1.创建web项目ch03
项目结构如下:
在该项目中设计一个接口UserDao和其代理类UserDaoImpl,代码如下。
(1)UserDao接口
package com.zdxh.jdk;
public interface UserDao {
public void add();
public void delete();
public void update();
public void find();
}
(2)UserDaoImpl实现类代码
package com.zdxh.jdk;
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("add...");
}
@Override
public void delete() {
System.out.println("delete...");
}
@Override
public void update() {
System.out.println("update...");
}
@Override
public void find() {
System.out.println("find...");
}
}
2.创建代理类JdkProxy
为了通用性,我们设置代理类返回类型为Object。假设我们要求在原有基础上,如果调用add方法,需要增强功能,例如,为了简单起见,我们只是增强一句话。但是平时开发肯定要使用切面类,在切面类中设计很多增强方法。
package com.zdxh.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkProxy {
private Object obj;
public JdkProxy(Object obj) {
super();
this.obj = obj;
}
//生成代理的方法
public Object createProxy(Object obj) {
return (Object) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] arg2) throws Throwable {
if("add".equals(method.getName())) {
System.out.println("检查权限.....增强");
return method.invoke(obj, arg2);
}
return method.invoke(obj, arg2);
}
});
}
}
3.编写测试类:
package com.zdxh.jdk;
import org.junit.jupiter.api.Test;
public class JdkTest {
@Test
public void ptTest() {
UserDao userDao =new UserDaoImpl();
UserDao proxy=(UserDao) new JdkProxy(userDao).createProxy(userDao);
proxy.delete();
proxy.add();
proxy.update();
proxy.find();
}
}
4.运行测试方法,结果如下:
总结:本案例介绍了使用JDK方法生成代理。