现在有jdk动态代理和cglib代理的场景,发现代码执行的时候顺序不一样,特此记录下
先有个普通的service方法,有save1()和save2(),save1调用了save2
package com.itheima.demo;
/**
* @author Smith 2020/9/12
*/
public class TestServiceImpl implements TestService {
@Override
public void test1() {
System.out.println("执行test1");
test2();
}
@Override
public void test2() {
System.out.println("执行test2");
}
}
public static Object getProxy(final Object target) {
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("jdk代理开始");
Object invoke = method.invoke(target, args);
System.out.println("jdk代理结束");
return invoke;
}
});
}
public static void main(String[] args) {
TestServiceImpl testServiceImpl = new TestServiceImpl();
TestService service;
service = (TestService)getProxy(testServiceImpl);
service.test1();
System.out.println("分割线---------");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TestServiceImpl.class);
enhancer.setCallback(new MethodInterceptor(){
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib代理开始");
Object object = methodProxy.invokeSuper(o, objects);
System.out.println("cglib代理结束");
return object;
}
});
service = (TestService) enhancer.create();
service.test1();
}
代码运行结果:
jdk代理开始
执行test1
执行test2
jdk代理结束
分割线---------
cglib代理开始
执行test1
cglib代理开始
执行test2
cglib代理结束
cglib代理结束
这是为什么呢?