AOP 面向切面编程
1、不使用 AOP 的开发方式【理解】
1.1 Demo1
先定义好接口与一个实现类,该实现类中除了要实现接口中的方法外,还要再写两个非业务方法。非业务方法也称为交叉业务逻辑:
doTransaction()
:用于事务处理
doLog()
:用于日志处理
然后,再使接口方法调用它们。接口方法也称为主业务逻辑。
接口:
public class SomeServiceImpl implements SomeService {
@Override
public void doSome() {
doLog();
System.out.println("执行业务方法doSome()");
doTrans();
}
@Override
public void doOther() {
doLog();
System.out.println("执行业务方法doOther()");
doTrans();
}
public void doLog(){
System.out.println("非业务功能,日志功能,在方法开始时输出日志");
}
public void doTrans(){
System.out.println("非业务事务功能,在业务方法执行之后,加入事务");
}
}
1.2 Demo2
当然,也可以有另一种解决方案:将这些交叉业务逻辑代码放到专门的工具类或处理类中,由主业务逻辑调用。
public class ServiceTools {
public static void doLog(){
System.out.println("非业务功能,日志功能,在方法开始时输出日志");
}
public static void doTrans(){
System.out.println("非业务事务功能,在业务方法执行之后,加入事务");
}
}
public class SomeServiceImpl implements SomeService {
@Override
public void doSome() {
ServiceTools.doLog();
System.out.println("执行业务方法doSome()");
ServiceTools.doTrans();
}
@Override
public void doOther() {
ServiceTools.doLog();
System.out.println("执行业务方法doOther()");
ServiceTools.doTrans();
}
}
1.3 Demo3
以上的解决方案,还是存在弊端:交叉业务与主业务深度耦合在一起。当交叉业务逻辑较多时,在主业务代码中会出现大量的交叉业务逻辑代码调用语句,大大影响了主业务逻辑的可读性,降低了代码的可维护性,同时也增加了开发难度。
所以,可以采用动态代理方式。在不修改主业务逻辑的前提下,扩展和增强其功能。
功能增强:
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler() {
}
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)