📜  Spring AOP – AspectJ 注解(1)

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

Spring AOP – AspectJ 注解

简介

Spring AOP 是 Spring 框架提供的默认的 AOP 框架,提供一个非常便捷的方式来实现面向切面的编程。AspectJ 是另一个流行的 AOP 框架,它通过注释或 XML 等方式来定义切面 。AspectJ 的注解方式比 XML 方式更加方便快捷,使得程序员们可以更加轻松地使用 AspectJ。在 Spring 中,我们可以使用 AspectJ 注解方式来定义切面。

如何在 Spring 中使用 AspectJ 注解

以下是在 Spring 中使用 AspectJ 注解的步骤:

1. 引入 AspectJ 库

首先,我们需要在项目中引入 AspectJ 库:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.6</version>
</dependency>
2. 定义一个切面类

我们需要定义一个类,并使用 @Aspect 注解来指定该类是一个切面类。同时,在该类中,我们还需要定义一个或多个通知方法,并使用 @Before@After@AfterReturning@AfterThrowing 注解来指定使用不同类型的通知方法。

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class LoggingAspect {

    @Before("execution(* com.example.service.UserService.*(..))")
    public void logBefore() {
        System.out.println("Logging before the method is executed.");
    }

    @AfterReturning("execution(* com.example.service.UserService.*(..))")
    public void logAfterReturning() {
        System.out.println("Logging after the method has successfully returned.");
    }
}

在上面的代码中,我们定义了一个 LoggingAspect 类,并使用 @Aspect 注解来指定该类是一个切面类。我们同时定义了两个方法 logBeforelogAfterReturning,并使用 @Before@AfterReturning 注解来指定使用这两个方法作为切面的通知方法。在这两个通知方法中,我们只是简单地打印了一些日志信息,但在实际项目开发中,我们可以根据实际需要来编写相应的逻辑。

3. 使用 @EnableAspectJAutoProxy 注解开启 AspectJ 注解

我们需要在 Spring 的配置文件中使用 @EnableAspectJAutoProxy 注解来开启 AspectJ 注解功能,让 Spring 框架自动识别使用注解定义的切面类并进行通知。

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}
4. 示例

现在我们可以在 UserService 中使用定义的 LoggingAspect 切面类了:

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public String getUser(long userId) {
        System.out.println("Getting user with id " + userId);
        return "User";
    }
}

可以看到,在 UserService 类中,我们没有任何与日志相关的代码,而是通过自定义的 LoggingAspect 切面类来织入日志信息,使得 UserService 类能够实现切面编程。

总结

通过上述步骤,我们可以在 Spring 中使用 AspectJ 注解来实现切面编程。AspectJ 注解不仅提供了一种更加方便快捷的方式来定义切面,还让程序员们能够更加灵活地应用切面编程技术,使得代码更加可读、可维护。