JDK动态代理小栗子
现有功能:
public interface SomeService {
void some();
void other();
}
public class ServiceImpl1 implements SomeService {
@Override
public void some() {
System.out.println("some 方法执行");
}
@Override
public void other() {
System.out.println("other 方法执行");
}
}
假设接口有N多实现类,需要增加功能,需要在每一个类上增加需要功能的代码,十分繁琐
public class MyUtil {
public static void log(){
System.out.println("增加日志功能");
}
public static void trans(){
System.out.println("增加事务处理");
}
}
动态代理实现:
通过目标类对象获取代理类对象
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
//使用工具类增加日志功能
MyUtil.log();
obj = method.invoke(target,args);
//模拟使用工具类处理完成后提交事务
MyUtil.trans();
return obj;
}
public Object getTarget(){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
}
测试实现:
public class MyTest {
public static void main(String[] args) {
//目标类对象
SomeService service = new ServiceImpl1();
//通过目标类对象获取代理类对象
SomeService proxy = (SomeService) new MyInvocationHandler(service).getTarget();
proxy.some();
System.out.println("=======================");
proxy.other();
}
}
实现指定方法使用代理,增加功能
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
String name = method.getName();
if ("some".equals(name)){
MyUtil.log();
obj = method.invoke(target,args);
MyUtil.trans();
}else {
obj = method.invoke(target,args);
}
return obj;
}
cglib动态代理:
第三方的工具库,创建代理对象,原理是继承通过继承目标类创建子类,子类就是代理对象
动态代理作用
在目标类代码不改变的情况下,增加功能
减少代码的重复
专注业务代码逻辑
解耦合,业务功能和事务,日志等功能分离
浙公网安备 33010602011771号