面向切面总是听起来很抽象,而且像把数据验证也算作切面上的一层,总觉得有些牵强,但是如果根据程序线性执行的原则,可以把各层抽离开来,重新排布成下面这种面向过程的图案:
如图所示,我们可以在不同的方法执行过程中,找到具有相同需求、执行相同任务的步骤,因此可以抽出这些相同的部分,全局配置,进行一次开发,到处运行,而不是手动编码或者重复引用,从而解除耦合,减少代码维护成本。
在实际编程中,总会遇到各种不同需求,代码本身的或者业务的。在项目达到一定规模,有必要针对各类重复开发或引用方法的地方,运用面向切面的思想,进行整体配置和开发。
附:
定义切入点:
@Aspect
public class PointcutsDefinition {
// 定义可重用、有意义的签名的切入点
@Pointcut("execution(* com.shiyanlou.spring.aop.aspectJ.CustomerBo.*(..))")
public void customerLog() {
}
}
定义切面执行项:
@Aspect
public class LoggingAspect {
// 在此处直接引用上述定义好的切入点
@Before("com.shiyanlou.spring.aop.aspectJ.PointcutsDefinition.customerLog()")
public void logBefore(JoinPoint joinPoint){
System.out.println("logBefore() is running ...");
System.out.println("hijacked:"+joinPoint.getSignature().getName());
System.out.println("**********");
}
}
定义bean:
<aop:aspectj-autoproxy/> <!-- 开启aspect自动代理-->
<bean id="customerBo" class="com.shiyanlou.spring.aop.aspectJ.CustomerBo"/>
<bean id="logAspect" class="com.shiyanlou.spring.aop.aspectJ.LoggingAspect" />