带有Spring Boot的AOP

学习在Spring Boot应用程序中实现AOP并使用AspectJ添加不同的aop建议以支持跨领域关注,例如日志记录,概要分析,缓存和事务管理。

目录

1.使用Spring Boot设置AOP 
2.建议类型
3.结论

阅读更多:Spring AOP教程

1.使用Spring Boot设置AOP

1.1。马文

在spring boot中设置AOP需要包括spring-boot-starter-aop依赖项。它将导入spring-aopaspectjweaver依赖关系导入应用程序。[ 入门pom.xml ]

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

1.2。启用/禁用自动配置

导入以上依赖项会触发AopAutoConfiguration,它会使用@EnableAspectJAutoProxy注解启用AOP 。

如果spring.aop.auto = false位于application.properties中,则不会激活自动配置。

application.properties
#spring.aop.auto = false    //'false' disables the auto configuration

1.3。使用@Aspect创建方面

可以在Spring Boot中借助注解@Aspect注解创建一个方面,并使用@Component注解在bean容器中注册。

在方面类中,我们可以根据需要创建建议。例如,下面的类适用于com.how2codex.aop包中所有类的方法建议。它捕获方法的开始时间和结束时间,并将总的方法执行时间记录在日志文件中。

LoggingAspect.java
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
@Aspect
@Component
public class LoggingAspect
{
    private static final Logger LOGGER = LogManager.getLogger(LoggingAspect.class);
    
    @Around("execution(* com.how2codex.aop..*(..)))")
    public Object profileAllMethods(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
    {
        MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
         
        //Get intercepted method details
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getName();
         
        final StopWatch stopWatch = new StopWatch();
         
        //Measure method execution time
        stopWatch.start();
        Object result = proceedingJoinPoint.proceed();
        stopWatch.stop();
 
        //Log method execution time
        LOGGER.info("Execution time of " + className + "." + methodName + " "
                            + ":: " + stopWatch.getTotalTimeMillis() + " ms");
 
        return result;
    }
}

1.4。Demo

创建一个简单的服务类来测试以上建议。

DomainService.java
@Service
public class DomainService
{
    public Object getDomainObjectById(Long id)
    {
        try {
            Thread.sleep(new Random().nextInt(2000));
        } catch (InterruptedException e) {
            //do some logging
        }
        return id;
    }
}

创建一个测试类并执行给定的方法并注意日志。

AopSpringBootTest.java
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class AopSpringBootTest
{
    @Autowired
    private DomainService service;
    
    @Test
    public void testGetDomainObjectById()
    {
        service.getDomainObjectById(10L);
    }
}
Console
2019-11-07T21:02:58.390+0530 INFO Execution time of DomainService.getDomainObjectById :: 1145 ms

如我们所见,AOP建议已应用于服务方法。

2.咨询类型

Aspectj AOP中有五种建议。

  1. @Before:在连接点之前执行的建议,但是它不能阻止执行 Stream 前进到连接点(除非它引发异常)。
  2. @AfterReturning:连接点正常完成后要执行的建议。
  3. @AfterThrowing:如果方法因抛出异常而退出,则将执行的建议。
  4. @After:无论连接点退出的方式如何(正常或异常返回),都将执行建议。
  5. @Around:围绕连接点的建议,例如方法调用。

3.结论

使用Spring引导实现AOP只需很少的工作,并且我们准备在添加spring-boot-starter-aop依赖项后立即添加方面。

每当我们想禁用aop自动配置时,我们都可以通过切换来轻松完成 to false.

Creating aspects and advices is as simple as adding some annotations e.g。 @Aspect, @Around etc.

Happy Learning !!

saigon has written 1445 articles

Leave a Reply