我们知道jdk动态代理是通过实现目标类接口来对方法进行增强操作的。
如果现在有给类的方法需要增强,但是他没有实现任何接口,这时候可以通过cglib动态代理来实现代理增强功能。
cglib动态代理通过字节码技术创建代理类的子类实例,在子类中用拦截器拦截所有父类的方法调用并增加处理逻辑。
导入cglib依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
</dependency>
代理类,需要在方法添加事务。
package com.teasir.proxyTest;
public class PersonServiceImpl {
public void save() {
System.out.println("save some information");
}
}
增强类,给代理类方法开启事务模拟
package com.teasir.proxyTest;
public class MyTransaction {
public void begin() {
System.out.println("开启事务");
}
public void commit() {
System.out.println("提交事务");
}
}
实现MethodInterceptor接口来自定义处理器。
package com.teasir.proxyTest;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class PersonServiceInterceptor implements MethodInterceptor {
//目标类
private Object target;
//增强类
private MyTransaction myTransaction;
//构造器注入目标类和增强类
public PersonServiceInterceptor(Object target,MyTransaction myTransaction){
this.target=target;
this.myTransaction=myTransaction;
}
public Object createProxy(){
Enhancer enhancer=new Enhancer();
enhancer.setCallback(this);
//设置被代理的父类class
enhancer.setSuperclass(this.target.getClass());
//根据字节码技术动态创建子类实例
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
myTransaction.begin();
Object retObj=method.invoke(this.target,objects);
myTransaction.commit();
return retObj;
}
}
测试
package com.teasir.proxyTest;
public class ProxyTest {
public static void main(String[] args) {
Object object=new PersonServiceImpl();
MyTransaction myTransaction=new MyTransaction();
PersonServiceInterceptor interceptor=new PersonServiceInterceptor(object,myTransaction);
PersonServiceImpl personService= (PersonServiceImpl) interceptor.createProxy();
personService.save();
}
}
jdk动态代理和cglib动态代理的区别
1、jdk动态代理的实现需要有接口实现,如果需要对类进行增强则需要使用cglib动态代理;
2、cglib动态代理只能调用抽象类的已实现方法,不能调用其抽象方法;
不能调用private、final修改的方法。
相关文章
Java静态代理详解
Java反射机制详解
java动态代理之jdk动态代理详解
参考文章
https://blog.csdn.net/long_long_later/article/details/106364407
https://caoju.blog.csdn.net/article/details/90714295