Sping AOP是通过动态代理模式实现的,具体有两种实现方式,一种是基于Java原生的动态代理,一种是基于cglib的动态代理。
1.jdk动态代理
1.1创建需要被代理的方法接口
public interface TargetInteface {void method1();void method2();int method3(Integer i);
}
1.2实现编写方法逻辑
public class Target implements TargetInteface {@Overridepublic void method1() {System.out.println("method1 running ...");}@Overridepublic void method2() {System.out.println("method2 running ...");}@Overridepublic int method3(Integer i) {System.out.println("method3 running ...");return i;}
}
1.3使用springProxy创建代理对象代理该类,在每次调用方法前后写入要进行的逻辑
public class TargetProxy {public static <T> Object getTarget(T t) {//新构建了一个 新的 代理类的对象return Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), (proxy, method, args) -> {// proxy就是目标对象t,method就是调用目标对象中方法,args就是调用目标对象中方法的参数。//比如说:代理对象.method1(),这时proxy就是目标类,method1就是method,args就是method1方法参数。System.out.println("执行方法前...");Object invoke = method.invoke(t, args);System.out.println("执行方法后...");return invoke;
});}
}
1.4 使用该代理方法代理实现类
public static void main(String[] args) {TargetInteface target = (TargetInteface) TargetProxy.getTarget(new Target());target.method1();System.out.println("-----------------------------");target.method2();System.out.println("-----------------------------");System.out.println(target.method3(3));}
2.cglib动态代理
2.1创建需要被代理的对象
public class Target {public void method1() {System.out.println("method1 running ...");
}public void method2() {System.out.println("method2 running ...");}public int method3(Integer i) {System.out.println("method3 running ...");return i;}
}
2.2创建代理方enhancer代理该类
public class TargetProxy {public static <T> Object getProxy(T t) {Enhancer en = new Enhancer(); //帮我们生成代理对象en.setSuperclass(t.getClass());//设置要代理的目标类en.setCallback(new MethodInterceptor() {//代理要做什么@Overridepublic Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("执行方法前。。。");//调用原有方法 Object invoke = methodProxy.invokeSuper(object, args);// Object invoke = method.invoke(t, args);// 作用等同与上面。System.out.println("执行方法后。。。");return invoke;}});return en.create();}
}
2.3生成代理对象使用方法
public static void main(String[] args) {Target target = (Target) TargetProxy.getProxy(new Target());System.out.println(target.getClass().getName());target.method1();print(target);}