spring的aop使用的是动态代理和cglib代理,在对象有实现接口的情况下使用动态代理,没有实现接口的情况下使用cglib代理。
cglib代理是继承目标对象来创建代理,所以目标对象不能使用final修饰。目标对象:
public class TestServiceImpl implements TestService { public void save() { System.out.println("保存"); } public void update() { System.out.println("更改"); } public void delete() { System.out.println("删除"); } public void select() { System.out.println("查找"); } }
动态代理:
package com.vhukze.proxy; import java.lang.reflect.Method; import org.springframework.cglib.proxy.InvocationHandler; import org.springframework.cglib.proxy.Proxy; import com.vhukze.service.TestService; import com.vhukze.service.serviceimpl.TestServiceImpl; /** * @author zsz * @version * @创建时间:2019年9月18日 上午9:09:17 */ public class TestServiceProxyFactory { private TestServiceImpl service; public TestServiceProxyFactory(TestService service) { this.service = (TestServiceImpl) service; } public TestService getTestServiceProxy() { //生成动态代理 第一个参数是一个类加载器 目标对象实现的接口的数组 TestService serviceProxy = (TestService) Proxy.newProxyInstance(TestServiceProxyFactory.class.getClassLoader(), TestServiceImpl.class.getInterfaces(), new InvocationHandler() { public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable { System.out.println("开启事务"); //参数一是当前执行此方法的对象 参数二是此方法的参数 Object invoke = method.invoke(service, arg2); System.out.println("提交事务"); return invoke; } }); return serviceProxy; } }
动态代理:
package com.vhukze.proxy; import java.lang.reflect.Method; import org.springframework.cglib.proxy.InvocationHandler; import org.springframework.cglib.proxy.Proxy; import com.vhukze.service.TestService; import com.vhukze.service.serviceimpl.TestServiceImpl; /** * @author zsz * @version * @创建时间:2019年9月18日 上午9:09:17 */ public class TestServiceProxyFactory { private TestServiceImpl service; public TestServiceProxyFactory(TestService service) { this.service = (TestServiceImpl) service; } public TestService getTestServiceProxy() { //生成动态代理 第一个参数是一个类加载器 目标对象实现的接口的数组 TestService serviceProxy = (TestService) Proxy.newProxyInstance(TestServiceProxyFactory.class.getClassLoader(), TestServiceImpl.class.getInterfaces(), new InvocationHandler() { public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable { System.out.println("开启事务"); //参数一是当前执行此方法的对象 参数二是此方法的参数 Object invoke = method.invoke(service, arg2); System.out.println("提交事务"); return invoke; } }); return serviceProxy; } }
测试方法:
1./** * @author zsz * @编辑时间 2019年9月18日上午9:44:03 * @编辑说明 动态代理测试 */ @Test public void fun1() { TestServiceProxyFactory proxy = new TestServiceProxyFactory(new TestServiceImpl()); TestService serviceProxy = proxy.getTestServiceProxy(); serviceProxy.select(); }
结果:
cglib代理:
package com.vhukze.proxy; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import com.vhukze.service.TestService; import com.vhukze.service.serviceimpl.TestServiceImpl; /** * @author zsz * @version * @创建时间:2019年9月18日 上午9:09:17 */ public class TestServiceProxyFactory2{ public TestService getTestServiceProxy(){ //帮我们生成代理对象 Enhancer en = new Enhancer(); //设置对谁代理 en.setSuperclass(TestServiceImpl.class); //设置代理要做什么 en.setCallback(new MethodInterceptor() { public Object intercept(Object proxyObj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable { System.out.println("开启事务"); Object returnValue = methodProxy.invokeSuper(proxyObj, arg); System.out.println("提交事务"); return returnValue; } }); return (TestService) en.create(); } }
结果: