基于CGLIB的动态代理
Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。
-
CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的 被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception。
-
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓 励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
1、 直接编写测试类
package com.daw.cglibproxy;
/**
* DAW
* NBAService
* 又不是不能用!
*/
public class NBAService {
public int add(String name, int id){
System.out.println("NBAService-------add------");
return id;
}
}
public static void main(String[] args) {
//目标对象 没有接口
NBAService nbaService = new NBAService();
//创建代理对象:选择cglib动态代理
NBAService proxyService = (NBAService) Enhancer.create(nbaService.getClass(),
new MethodInterceptor() {//回调函数 编写代理规则
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
try {
System.out.println("开始事务");
Object invoke = methodProxy.invokeSuper(o, objects);
System.out.println("提交事务");
return invoke;
}catch (Exception e){
System.out.println("回滚事务");
e.printStackTrace();
throw e;
}finally {
System.out.println("finally------");
}
}
}
);
//代理对象干活
int res=proxyService.add("湖人",1001);
System.out.println(res);
}
}
1.2、结构化设计方式
package com.daw.cglibproxy;
import com.daw.aop.AOP;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* DAW
* CglibProxyFactory
* 又不是不能用!
*/
public class CglibProxyFactory {
//目标对象
private NBAService nbaService; //没有实现接口的
//切面
private AOP aop;
public Object getProxyInstance(NBAService nbaService,AOP aop){
return Enhancer.create(nbaService.getClass(), new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
try {
aop.before();
Object o1 = methodProxy.invokeSuper(o, objects);
aop.after();
return o1;
} catch (Exception e) {
aop.exception();
e.printStackTrace();
throw e;
}finally {
aop.myFinally();
}
}
});
}
}
public static void main(String[] args) {
//目标对象:没有接口
NBAService nbaService = new NBAService();
//创建切面
TranAOP tranAOP = new TranAOP();
//创建代理对象:选择cglib动态代理
NBAService nbaService1 = (NBAService) new CglibProxyFactory().getProxyInstance(nbaService, tranAOP);
int res = nbaService1.add("勇士",1002);
System.out.println(res);
}