面向切面的另一种理解:面向过程

面向切面总是听起来很抽象,而且像把数据验证也算作切面上的一层,总觉得有些牵强,但是如果根据程序线性执行的原则,可以把各层抽离开来,重新排布成下面这种面向过程的图案:

面向切面的另一种理解:面向过程
面向过程

 

如图所示,我们可以在不同的方法执行过程中,找到具有相同需求、执行相同任务的步骤,因此可以抽出这些相同的部分,全局配置,进行一次开发,到处运行,而不是手动编码或者重复引用,从而解除耦合,减少代码维护成本。

在实际编程中,总会遇到各种不同需求,代码本身的或者业务的。在项目达到一定规模,有必要针对各类重复开发或引用方法的地方,运用面向切面的思想,进行整体配置和开发。

 

附:

定义切入点:

@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" />