Spring框架|动态代理之CGLIB代理


一、基于子类的CGLIB动态代理

  • 提供者:第三方的 CGLib,如果报 asmxxxx 异常,需要导入 asm.jar。
  • 要求:被代理类不能用 final 修饰的类(最终类)。

二、CGLIB代理演示

在这里插入图片描述

(1)cglb测试类

package com.gql.cglibproxy;
import com.gql.dao.UserDaoImpl;
import com.gql.jdkproxy.Logger;
import com.gql.staticproxy.User;
import com.gql.transaction.MyTransaction;

/**
 * 类说明:
 *		cglb测试
 * @guoqianliang1998.
 */
public class cglibDemo {
	public static void main(String[] args) {
		//创建目标类
		UserDaoImpl u = new UserDaoImpl();
		//创建日志切面
		Logger log = new Logger();
		//事务类
		MyTransaction mt = new MyTransaction();
		//创建拦截器
		MyInterceptor m = new MyInterceptor(u,log, mt);
		//利用cglib包创建代理对象
		UserDaoImpl createProxy = (UserDaoImpl) m.createProxy();
		createProxy.save(new User());
	}
}

(2)事务切面

package com.gql.transaction;
/**
 * 类说明:
 *		事务类
 * @guoqianliang1998.
 */
public class MyTransaction {
	public void begin(){
		System.out.println("开启事务...");
	}
	public void commit(){
		System.out.println("提交事务...");
	}
}

(3)目标切面

package com.gql.cglibproxy;
import com.gql.staticproxy.User;
/**
 * 类说明:
 *		目标类
 * @guoqianliang1998.
 */
public class UserDaoImp {
	public void save(User user){
		System.out.println("保存用户成功...");
	}
}

(3)日志切面

package com.gql.jdkproxy;
/**
 * 类说明:
 *		日志类
 * @guoqianliang1998.
 */
public class Logger {
	public void log(){
		System.out.println("日志记录...");
	}
}

(4)拦截器

package com.gql.cglibproxy;

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.gql.jdkproxy.Logger;
import com.gql.transaction.MyTransaction;
/**
 * 类说明:
 *		拦截器
 * @guoqianliang1998.
 */
public class MyInterceptor implements MethodInterceptor {
	private Object target;//目标类
	private Logger log;
	private MyTransaction myTransaction;
	
	//创建代理对象
	public Object createProxy(){
		Enhancer enhancer = new Enhancer();
		enhancer.setCallback(this);
		enhancer.setSuperclass(this.target.getClass());
		return enhancer.create();	
	}
	
	
	public MyInterceptor(Object target, Logger log, MyTransaction myTransaction) {
		super();
		this.target = target;
		this.log = log;
		this.myTransaction = myTransaction;
	}

	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
		log.log();
		myTransaction.begin();
		arg1.invoke(this.target, arg2);//调用目标方法
		myTransaction.commit();
		return null;
	}
}
发布了385 篇原创文章 · 获赞 1033 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/104125700