📜  Spring AOP-基于XML的应用程序(1)

📅  最后修改于: 2023-12-03 15:35:02.832000             🧑  作者: Mango

Spring AOP-基于XML的应用程序

Spring框架的AOP模块是实现面向切面编程的关键组件之一。在这个基于XML的应用程序中,我们将介绍如何使用Spring AOP模块。

前置条件

为了能够理解并使用该应用程序,你需要掌握以下知识:

  • Java 语言基础
  • XML 文件格式
  • Maven 或 Gradle 的使用
  • Spring Framework 的基本概念
架构设计

该基于XML的应用程序使用Spring AOP模块实现了一个简单的日志记录功能。当业务方法被调用时,AOP将记录方法的名称和运行时间,然后将它们输出到控制台。

下图为该应用程序的类图:

class-diagram

应用程序主要包含以下类:

  • Application:应用程序入口点,负责调用业务方法。
  • BusinessService:业务服务接口,声明了一个返回一个 String 对象的方法。
  • BusinessServiceImpl:业务服务的实现类,实现了 BusinessService 接口。
  • LoggerAspect:日志切面,使用 AOP 记录业务方法的信息。

其中,LoggerAspect 是核心类,它使用 XML 配置文件定义了 AOP 切入点和通知类型。

集成 Spring AOP

程序集成 Spring AOP 的第一步是在 Maven 或 Gradle 中添加依赖项。

<!-- Maven dependency -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.3.10</version>
</dependency>

然后,我们需要定义切面和通知类型。在这个例子中,我们将使用 XML 配置文件定义它们。

<!-- beans.xml -->
<bean id="loggerAspect" class="com.example.LoggerAspect" />

<aop:config>
    <aop:aspect id="loggingAspect" ref="loggerAspect">
        <aop:pointcut id="businessServicePointcut" expression="execution(* com.example.BusinessService.*(..))" />
        <aop:before pointcut-ref="businessServicePointcut" method="beforeMethod" />
        <aop:after-returning pointcut-ref="businessServicePointcut" method="afterMethod" />
    </aop:aspect>
</aop:config>

在这个 XML 配置文件中,我们定义了一个名为 loggerAspect 的 bean,它的类是 LoggerAspect

接下来,我们使用 <aop:config> 元素定义了一个名为 loggingAspect 的切面,它引用了 loggerAspect bean。

切面包含一个切入点,即业务服务接口中的所有方法。我们使用 execution() 表达式来定义它。

在该切面中,我们定义了两个通知类型:beforeafter-returning。它们调用切面 bean (loggerAspect) 中的两个方法:beforeMethod()afterMethod()

日志切面

下面是 LoggerAspect 类的源代码。

public class LoggerAspect {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    public void beforeMethod(JoinPoint joinPoint) {
        logger.info("Method " + joinPoint.getSignature().getName() + " is about to execute.");
    }

    public void afterMethod(JoinPoint joinPoint, Object result) {
        logger.info("Method " + joinPoint.getSignature().getName() + " has executed in " + elapsedTime(joinPoint) + "ms.");
    }

    private long elapsedTime(JoinPoint joinPoint) {
        return System.currentTimeMillis() - ((Long)joinPoint.getArgs()[0]).longValue();
    }
}

该类定义了两个方法:beforeMethod()afterMethod(),它们分别在业务方法执行前和执行后被调用。这些方法接受一个 JoinPoint 参数,用于获取当前业务方法的信息。

LoggerAspect 类还具有一个私有方法 elapsedTime(),它计算业务方法的执行时间。

应用程序入口点

Application 类是该应用程序的入口点。它使用 BusinessServiceImpl 类来实例化 BusinessService 接口,并调用 execute() 方法。

public class Application {
    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath*:beans.xml");
        BusinessService businessService = context.getBean(BusinessService.class);

        long startTime = System.currentTimeMillis();
        String result = businessService.execute("data");
        long endTime = System.currentTimeMillis();

        logger.info("Result: " + result);
        logger.info("Execution time: " + (endTime - startTime) + "ms.");
    }
}

在这个类中,我们首先加载了 beans.xml 配置文件,并从中获取 BusinessService 实例。然后我们计算了业务方法的执行时间,并将结果输出到控制台。

运行应用程序

编译和运行该应用程序的方法如下。

# compile sources
$ mvn compile

# run application
$ mvn exec:java -Dexec.mainClass="com.example.Application"

应用程序将输出类似以下内容的日志信息。

18:39:57.981 [main] INFO  com.example.LoggerAspect - Method execute is about to execute.
18:39:57.983 [main] INFO  com.example.LoggerAspect - Method execute has executed in 2ms.
18:39:57.984 [main] INFO  com.example.Application - Result: Hello, data!
18:39:57.984 [main] INFO  com.example.Application - Execution time: 5ms.
结论

在本文中,我们向你介绍了如何使用 Spring AOP 模块在基于 XML 的应用程序中实现面向切面编程。我们还演示了一个简单的日志记录功能,并解释了它如何工作。