Cglib实现动态代理

                                        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();
	}

}
  • 测试结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值