1.简介

在本文中,我们将通过Spring介绍AOP(Aspect Oriented Programming 面向方面的编程),并介绍如何简单使用它 。

在使用Spring AOP开发时,也可以利用AspectJ的注解。

但是在本文中,我们将重点放在基于XML的Spring AOP核心配置上。

2. 关于AOP

AOP是一种编程范例,旨在将横切关注点与业务主体进行进一步分离,以提高程序代码的模块化程度。

可以在现有代码中添加其他行为而无需修改代码本身。

Spring的AOP框架可帮助我们实现将横切关注点与业务主体进行分离。

3. Maven依赖

让我们从pom.xml中添加Spring的AOP库依赖开始:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>5.2.7.RELEASE</version>
</dependency>

可以在这里检查最新版本。

4. AOP概念和术语

让我们简要介绍一下AOP的概念和术语:

spring aop

4.1 业务对象

业务对象是具有常规业务逻辑类。

让我们看一下业务对象的简单示例,其中我们只简单的计算两个数字的和:

public class SampleAdder {
    public int add(int a, int b) {
        return a + b;
    }
}

请注意,该类是具有业务逻辑并且没有任何与Spring相关的注解的普通类。

4.2 切面

一个切面(Aspect)是跨多个类的关注点的模块化机制。比如,统一日志就是这种跨领域关注的例子。

让我们来简单的定义一个切面:

public class AdderAfterReturnAspect {

    public void afterReturn(Object returnValue) throws Throwable {
       System.out.println(String.format("返回值为 %s", returnValue.toString()));
    }
}

在上面的代码中,我们定义了一个简单的Java类,该类具有一个名为afterReturn的方法,该方法有一个Object类型的一个参数,我们在方法里打印了这个参数。

请注意,AdderAfterReturnAspect是标准的Java类,我们没有使用任何Spring注解。

4.3 连接点

连接点(Joinpoint)是一个程序的执行点,如方法的执行异常的处理过程都可以视为连接点。

在Spring中,在Spring AOP中,连接点就是方法。

4.4 切点

切入点(pointcut)是一个谓词,可以帮助匹配切面在特定的连接点上要应用的通知

4.5 通知

通知(Advice)是指切面在特定的连接点上所采取的处理。一个通知被视为一个拦截器,并在连接点周围维护了一系列拦截器。

Spring AOP提供了5种通知类型给我们:前置后置返回异常环绕

4.6 将业务对象连接到切面

让我们看一下如何使用返回通知将业务对象连接到切面

下面我们来看一下Spring aop的XML配置:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="sampleAdder"
          class="com.ripjava.aop.intro.SampleAdder" />
    
    <bean id="doAfterReturningAspect" class="com.ripjava.aop.intro.AdderAfterReturnAspect" />

    
    <aop:config>
        <aop:aspect id="aspects" ref="doAfterReturningAspect">
            <aop:pointcut id="pointCutAfterReturning"
                          expression="execution(* com.ripjava.aop.intro.SampleAdder+.*(..))" />
            <aop:after-returning method="afterReturn"
                                 returning="returnValue" pointcut-ref="pointCutAfterReturning" />
        </aop:aspect>
    </aop:config>

</beans>

我们定义了一个simpleAdder的业务对象bean。。

我们还定义了一个AdderAfterReturnAspect的切面bean。

因为本文只是介绍,这里使用了XML配置,之后会教大家使用AspectJ注解配置。

4.7 AOP配置

<aop:config>标签用于定于AOP相关的配置。

<aop:config>标签里:

我们使用<aop:aspect>标签定义了一个切面的类。还是为它创建了对doAfterReturningAspect切面bean的引用。

<aop:aspect>标签里:

我们使用<aop:pointcut>标签定义了一个切点。XML配置使用的切点配置是execution(* com.ripjava.aop.intro.SampleAdder+.*(..))。表示对于SampleAdder类中接受任意数量的参数并返回任何值类型的任何方法应用我们的定义的通知类型。

<aop:pointcut>标签之后:

我们使用<aop:after-returning>标签定义了一个返回类型的通知。指定了通知的处理方法,传递到方法的参数,和通知类型对应的切点。

5. 测试

下面我们来测试一下:

public class SpringAOPTest {
    @Test
    public void test_springAOP(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-aop-intro.xml");
        context.getBean(SampleAdder.class).add(1,3);
    }
}

输出如下:

返回值为 4

6. 总结

在本文中,我们简单的介绍了AOP一些的概念以及展示了一个简单的在Spring中使用AOP的示例。

之后会更新更多关于Spring AOP的文件,请持续关注本站。

最后,和往常一样,代码可以在Github上找到。