现有功能:
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动态代理:
第三方的工具库,创建代理对象,原理是继承通过继承目标类创建子类,子类就是代理对象
动态代理作用
在目标类代码不改变的情况下,增加功能
减少代码的重复
专注业务代码逻辑
解耦合,业务功能和事务,日志等功能分离