一、基于子类的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;
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);
UserDaoImpl createProxy = (UserDaoImpl) m.createProxy();
createProxy.save(new User());
}
}
(2)事务切面
package com.gql.transaction;
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;
public class UserDaoImp {
public void save(User user){
System.out.println("保存用户成功...");
}
}
(3)日志切面
package com.gql.jdkproxy;
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;
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;
}
}