动态代理
JDK动态代理
JDK动态代理对象是通过被代理类是实现的接口来创建对象的,因此JDK动态代理只能代理实现了接口的类的对象
CGLib动态代理
CGLib是通过创建被代理类的子类来创建对象的,因此即使没有实现任何接口的类也可以通过CGLib产生的代理对象,cglib不能为final类创建代理对象
- 添加cglib依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
- 创建动态代理类
public class CGLibDynamicProxy implements MethodInterceptor {
private Object object;
public CGLibDynamicProxy(Object o){
this.object = 0;
}
public Object getProxy(){
Enhancer enhancer = new Enhancer(); // 用于创建代理对象
enhancer.setSuperclass(BookDao.class);
enhancer.setCallback(this);
Object o = enhancer.create();
return o;
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
return null;
}
}
// 测试类
public class Test {
public static void main(String[] args) {
// 创建被代理对象
BookDao bookDao = new BookDao();
// 通过cglib动态代理类创建代理对象
CGLibDynamicProxy cgLibDynamicProxy = new CGLibDynamicProxy(bookDao);
// 代理对象实际上是被代理对象的子类,可以强转
BookDao daoProxy = (BookDao) cgLibDynamicProxy.getProxy();
//使用代理对象调用方法,实际上执行了代理对象的 intercept,将当前方法和参数传递到intercept方法
daoProxy.insert();
}
}