携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
哈喽,大家好!我是Why,一名在读学生,目前刚刚开始进入自己的编程学习生涯。虽然学习起步较晚,但我坚信做了才有0或1的可能。学了一段时间以后也是选择在掘金上分享自己的日常笔记,也希望能够在众多道友的大家庭中打成一片。 本文主要讲解动态代理之Cglib动态代理,如果大家读后觉得有用的话,还请大家多多支持博主:欢迎 ❤️点赞👍、收藏⭐、留言💬 ✨✨✨个人主页:JinHuan
Cglib动态代理
Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展 JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的类,就可以使用CGLIB实现。 CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception。 CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。
BookService
package com.jinhuan.service;
/**
* @Author jinhuan
* @Date 2022/7/4 17:35
* Description:没有实现接口的Service
*/
public class BookService {
public void add(Integer id,String name){
System.out.println("BookService---add()---");
}
}
MyCglibProxy
package com.jinhuan.cglibProxy;
import com.jinhuan.aop.LogAop;
import com.jinhuan.aop.TranAop;
import com.jinhuan.service.BookService;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @Author jinhuan
* @Date 2022/7/4 17:34
* Description:测试Cglib动态代理
*/
public class MyCglibProxy {
public static void main(String[] args) {
//没有实现接口的被代理对象
BookService bookService = new BookService();
TranAop tranAop = new TranAop();
LogAop logAop = new LogAop();
//选择Cglib代理
BookService cglibProxyService = (BookService) new CglibProxyFactory().getProxyInstance(bookService, tranAop);
cglibProxyService.add(1,"jinhuan");
}
public static void main1(String[] args) {
//没有实现接口的被代理对象
BookService bookService = new BookService();
//选择Cglib代理
BookService bookProxyService = (BookService) Enhancer.create(bookService.getClass(), bookService.getClass().getInterfaces(),
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-----");
}
}
});
bookProxyService.add(1,"jinhuan");
}
}
CglibProxyFactory
package com.jinhuan.cglibProxy;
import com.jinhuan.aop.Aop;
import com.jinhuan.service.BookService;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @Author jinhuan
* @Date 2022/7/4 17:47
* Description:
*/
public class CglibProxyFactory {
//没有实现接口的被代理对象
private BookService bookService;
private Aop aop;
public Object getProxyInstance(BookService bookService,Aop aop){
return Enhancer.create(bookService.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();
throw e;
} finally {
aop.myFinally();
}
}
});
}
}