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();
}
结果
拦截目标方法后 可以自己加强方法的内容 添加 拦截目标方法后 可以自己加强方法的内容