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;
}
}
测试方法:
/**
* @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();
}
}
测试方法:
/**
* @author zsz
* @编辑时间 2019年9月18日上午9:44:03
* @编辑说明 cglib代理测试
*/
@Test
public void fun2() {
TestServiceProxyFactory2 proxy = new TestServiceProxyFactory2();
TestService serviceProxy = proxy.getTestServiceProxy();
serviceProxy.select();
}
结果:
扫描二维码关注公众号,回复:
9078619 查看本文章