前言
我们都知道AOP中的代理就是由AOP框架动态生成的一个对象,该对象可以作为目标对象使用。此处讲解Spring中的AOP代理之JDK动态代理。
JDK代理是什么
JDK动态代理是通过java.lang.reflect.Proxy类来实现的,我们可以调用Proxy了的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP.
实战
1.创建接口UserDao类
package com.aop.jdk;
public interface UseDao {
public void addUser();
public void deleteUser();
}
2.创建目标类UserDaoImpl实现UserDao接口
package com.aop.jdk;
import com.ioc.UserDao;
//目标类
public class UserDaoImpl implements UseDao {
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
3.创建切面类MyAspect
package com.aop.jdk;
//切面类:可以存在多个通知Advice(即增强的方法)
public class MyAspect {
public void check_Permission(){
System.out.println("模拟检查权限");
}
public void log(){
System.out.println("模拟记录日志");
}
}
4.创建代理类JdkProxy
package com.aop.jdk;
import org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理
public class JdkProxy implements InvocationHandler{
//声明目标类接口
private UseDao useDao;
//创建代理方法
public Object createProxy(UseDao useDao){
this.useDao = useDao;
//类加载器
ClassLoader classLoader = JdkProxy.class.getClassLoader();
//被代理对象实现的所有接口
Class<?>[] clazz = useDao.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_Permission();
//在目标类上调用方法,并传入参数
Object obj = method.invoke(useDao, args);
//后增强
myAspect.log();
return obj;
}
}
5.创建测试类
package com.aop.jdk;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestJdk {
public static void main(String[] args) {
//创建代理对象
JdkProxy jdkProxy = new JdkProxy();
//创建目标对象
UseDao useDao = new UserDaoImpl();
//从代理对象中获取增强后的目标对象
UseDao useDao1 = (UseDao) jdkProxy.createProxy(useDao);
useDao1.addUser();
useDao1.deleteUser();
}
}
运行结果
扫描关注下面二维码获得更多有用的资源!