Cglib
Cglib方式
jdk自带的代理方式 必须要实现接口,有限制,所以有Cglib方式
原理:通过字节码技术,创建一个目标类的子类,作为代理对象,在子类中拦截目标类中的方法,对方法做一个加强处理
1)创建目标类
import com.test.staticproxy.IUserService; public class UserService { public void insert() { } }
2)导入架包
<dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.2.4</version> </dependency>
创建一个代理类生成器
import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; //代理对象构造器 public class MyCgLib implements MethodInterceptor { //创建一个代理对象生成器 Enhancer enhancer=new Enhancer(); //返回一个代理对象 public Object getProxy(Class clazz) { //设置目标对象(目标对象是代理对象的父类) enhancer.setSuperclass(clazz); //设置回调函数 enhancer.setCallback(this); //通过字节码技术创建一个代理对象 返回 return enhancer.create(); } //方法拦截 @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { //方法加强 System.out.println("拦截目标方法后 可以自己加强方法的内容"); //调用代理对象的父类中同名的方法 Object result= methodProxy.invokeSuper(o,objects); //方法加强 System.out.println("拦截目标方法后 可以自己加强方法的内容2"); return result; } }
5)使用
@Test public void fun() { //创建代理类生成器对象 MyCgLib myCgLib=new MyCgLib(); // 创建一个代理对象 赋值给目标对象类型 或 目标对象类型的接口 UsersService userService=(UsersService)myCgLib.getProxy(UsersService.class); userService.add(); }
结果
拦截目标方法后 可以自己加强方法的内容 添加 拦截目标方法后 可以自己加强方法的内容CGlib