Spring(5) - (11)CGLIB动态代理
2018-09-26 本文已影响15人
小白201808
特点:
1.可以针对没有接口的,使用继承真正类的方式implements IEmployeeServiceImpl
注意⚠️:public class TransactionManagerAdvice implements InvocationHandler{}
此时的InvocationHandler是rg.springframework.cglib.proxy.InvocationHandler 的 InvocationHandler,导入包的时候注意,别导错
主要代码:
package com.keen.proxy.tx;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.InvocationHandler;
@SuppressWarnings("all")//忽略所有警告
public class TransactionManagerAdvice implements InvocationHandler{
private Object targer;//真实对象,即对谁做增强
private TransactionManager txManager;//事务管理器(模拟)
public void setTarger(Object targer) {
this.targer = targer;
}
public void setTxManager(TransactionManager txManager) {
this.txManager = txManager;
}
//创建一个代理对象
public <T> T getProxyObject() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targer.getClass());//将继承于哪个类,去做增强
enhancer.setCallback(this);//设置增强的对象
return (T) enhancer.create();//创建代理对象
}
@Override
//如何为真实对象的方法增强的具体操作
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object ret = null;
txManager.begin();
//调用真实对象的方法
try {
ret = method.invoke(targer, args);//调用对象真实的方法
txManager.commit();
} catch (Exception e) {
e.printStackTrace();
txManager.rollback();
}
return ret;
}
}
测试类
public class AutoTest {
@Autowired
private TransactionManagerAdvice advice;
@Test
void testSave() throws Exception {
//获取代理对象 jdk :class com.sun.proxy.$Proxy19
//cglib:class com.keen.proxy.service.IEmployeeServiceImpl$$EnhancerByCGLIB$$ec7415fa
IEmployeeServiceImpl proxy = advice.getProxyObject();
//System.out.println(proxy.getClass());
proxy.save(new Employee());
}
@Test
void testUpdate() throws Exception {
IEmployeeServiceImpl proxy = advice.getProxyObject();
//System.out.println(proxy.getClass());
proxy.update(new Employee());
}