面向切面编程(AOP)思想认为软件系统主要由核心关注点(业务主体)与横切关注点(附属模块)组成。可以理解为横切关注点就是对核心关注点扩展增强的部分。如在业务主体中加入日志记录、事物控制、性能统计等功能。
往往横切关注点代码具备相同特征,且大量重复出现在业务主体中,为了减少系统重复代码,提高系统健壮性与可扩展性,可通过动态代理技术实现业务主体与附属模块的解耦分离。
/*业务逻辑接口*/
/**
*@author xizhonghuai
*@date 2019年3月7日
*@readme
*/
public interface Car {
void carInfo(String name);
}
/*业务实现类*/
/**
* @author xizhonghuai
* @date 2019年3月7日
* @readme
*/
public class Audi implements Car {
/*
* (non-Javadoc)
*
* @see com.Car#CarInfo(java.lang.String, java.awt.Color)
*/
@Override
public void carInfo(String name) {
// TODO Auto-generated method stub
System.out.println(name);
}
}
/*动态代理类*/
/**
* @author xizhonghuai
* @date 2019年3月7日
* @readme
*/
public class JDKDynamicProxy implements InvocationHandler {
private Object obj;
public JDKDynamicProxy(Object obj) {
super();
this.obj = obj;
}
/**
* 获取被代理接口实例对象
*
* @param <T>
* @return
*/
public Object getProxy() {
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("运行额外方法");
Object result = method.invoke(obj, args);
System.out.println("运行额外方法");
return result;
}
}
/* 测试 */
public static void main(String[] args) {
// TODO Auto-generated method stub
Car car = (Car) new JDKDynamicProxy(new Audi()).getProxy();
// Car car = new Audi(); //如果不需要额外方法直接使用业务实现类
car.CarInfo("我是奥迪车!");
}