Cglib实现动态代理
使用场景:
模拟事务的开启和提交
准备工作
-
定义PersonDAO接口
/**
* @Title: PersonDAO.java
* @Package com.hlbdx.proxy
* @Description: 不积跬步,无以至千里;不积小流,无以成江海。
* @author zhaoyong
* @date 2018-11-10 下午2:59:17
* @version V1.0
* Update Logs:
******************************************************
*/
package com.hlbdx.cglib.proxy;
/**
* @ClassName: PersonDAO
* @Description:
* @author zhaoyong
* @date 2018-11-10 下午2:59:17
*
*/
public interface PersonDAO {
public void save();
public void update();
}
-
定义接口PersonDAO的实现PersonDaoImpl类
/**
* @Title: PersonDaoImpl.java
* @Package com.hlbdx.proxy
* @Description: 不积跬步,无以至千里;不积小流,无以成江海。
* @author zhaoyong
* @date 2018-11-10 下午3:04:36
* @version V1.0
* Update Logs:
******************************************************
*/
package com.hlbdx.cglib.proxy;
/**
* @ClassName: PersonDaoImpl
* @Description:
* @author zhaoyong
* @date 2018-11-10 下午3:04:36
*
*/
public class PersonDaoImpl implements PersonDAO {
public void save() {
System.out.println("PersonDaoImpl.save()");
}
public void update() {
System.out.println("PersonDaoImpl.update()");
}
}
-
定义事务Transaction类
/**
* @Title: Transaction.java
* @Package com.hlbdx.proxy
* @Description: 不积跬步,无以至千里;不积小流,无以成江海。
* @author zhaoyong
* @date 2018-11-10 下午3:02:11
* @version V1.0
* Update Logs:
******************************************************
*/
package com.hlbdx.cglib.proxy;
/**
* @ClassName: Transaction
* @Description:
* @author zhaoyong
* @date 2018-11-10 下午3:02:11
*
*/
public class Transaction {
public void begin() {
System.out.println("Transaction.begin()");
}
public void commit() {
System.out.println("Transaction.commit()");
}
}
-
定义事务拦截器TransactionInterceptor
/**
* @Title: TransactionInterceptor.java
* @Package com.hlbdx.proxy
* @Description: 不积跬步,无以至千里;不积小流,无以成江海。
* @author zhaoyong
* @date 2018-11-10 下午3:07:38
* @version V1.0
* Update Logs:
******************************************************
*/
package com.hlbdx.cglib.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @ClassName: TransactionInterceptor
* @Description:
* @author zhaoyong
* @date 2018-11-11 下午3:07:38
*
*/
public class TransactionInterceptor implements MethodInterceptor {
private Object target;
private Transaction transaction;
public TransactionInterceptor(Object target, Transaction transaction) {
this.target = target;
this.transaction = transaction;
}
/**
*
* @Title: createProxy
* @Description: TODO(创建代理对象)
* @author zhaoyong
* @return
* @throws
*/
public Object createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setCallback(this);
enhancer.setSuperclass(this.target.getClass());
return enhancer.create();
}
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
this.transaction.begin();
Object obj = arg1.invoke(target, arg2);
this.transaction.commit();
return obj;
}
}
-
定义测试ProxyTest类
/**
* @Title: ProxyTest.java
* @Package com.hlbdx.cglib.proxy
* @Description: 不积跬步,无以至千里;不积小流,无以成江海。
* @author zhaoyong
* @date 2018-11-11 下午3:11:16
* @version V1.0
* Update Logs:
******************************************************
*/
package com.hlbdx.cglib.proxy;
import org.junit.Test;
/**
* @ClassName: ProxyTest
* @Description:
* @author zhaoyong
* @date 2018-11-11 下午3:11:16
*
*/
public class ProxyTest {
@Test
public void test() {
PersonDAO target = new PersonDaoImpl();
Transaction transaction = new Transaction();
TransactionInterceptor transactionInterceptor = new TransactionInterceptor(
target, transaction);
PersonDAO proxy = (PersonDAO) transactionInterceptor.createProxy();
proxy.update();
}
}
-
测试结果