JDK动态代理是通过java.lang. reflect.Proxy类来实现的,我们可以调用Proxy类的newProxyInstance0方法来创建代理对象。对于使用业务接口的类,Spring默认会 使用JDK动态代理来实现AOP.
代码实现如下:
UserDao.java文件
package com.itheima.jdk;
public interface UserDao {
public void addUser();
public void deleteUser();
}
UserDaoImpl.java文件
package com.itheima.jdk;
//目标类
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
// TODO Auto-generated method stub
System.out.println("添加用户");
}
@Override
public void deleteUser() {
// TODO Auto-generated method stub
System.out.println("删除用户");
}
}
MyAspect.java文件
package com.itheima.aspect;
//切面类,可以存在多个通知Advice
public class MyAspect {
public void check_Permissions(){
System.out.println("模拟检查权限....");
}
public void log() {
// TODO Auto-generated method stub
System.out.println("模拟记录日志....");
}
}
JdkProxy.java文件
package com.itheima.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.itheima.aspect.MyAspect;
//JDK代理类
public class JdkProxy implements InvocationHandler {
//声明目标类接口
private UserDao userDao;
//创建代理方法
public Object creatProxy(UserDao userDao){
this.userDao = userDao;
//1.类加载器
ClassLoader classLoader = JdkProxy.class.getClassLoader();
//被代理对象实现的所有接口
Class<?>[] clazz = userDao.getClass().getInterfaces();
//使用代理类,进行增强,返回被代理类的对象
return Proxy.newProxyInstance(classLoader, clazz, this);
}
//所有动态代理类的方法调用,都会交由invoke()方法去处理
//proxy被代理后的对象
//method将要被执行的方法信息(反射)
//args执行方法需要的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//声明切面
MyAspect myAspect = new MyAspect();
//前增强
myAspect.check_Permissions();
//在目标类上调用方法,并传入参数
Object obj = method.invoke(userDao, args);
//后增强
myAspect.log();
return obj;
}
}
JdkTest.java文件
package com.itheima.jdk;
public class JdkTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建代理对象
JdkProxy jdkProxy = new JdkProxy();
//创建目标对象
UserDao userDao = new UserDaoImpl();
//从代理对象中获取被增强后的目标对象
UserDao userDao1 = (UserDao) jdkProxy.creatProxy(userDao);
//执行方法
userDao1.addUser();
userDao1.deleteUser();
}
}