SpringBoot学习笔记:整合aop

Posted 听风者-better

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot学习笔记:整合aop相关的知识,希望对你有一定的参考价值。

本文介绍SpringBoot整合aop(面向切面编程)

一.创建一个SpringBoot项目

  1. 引入相应的依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    
  2. 实现AOP切面

    @Component
    @Aspect
    public class AopComponent 
    
    
  3. 常用的注解

    @Pointcut:定义一个切面,做一些处理的切入点

    @Before:在切面方法之前执行方法

    @After:在切面方法之后执行方法

    @AfterReturning:在切面方法执行完毕之后,对其返回值做处理

    @AfterThrowing:在切面方法执行抛出异常时进行处理

    @Around:在切面方法执整改过程中参与执行

二.编写具体实现代码

  1. 添加切面方法

    @Component
    @Aspect
    public class AopComponent 
    
        Logger logger = LoggerFactory.getLogger(AopComponent.class);
    
        /**
         * execution(* com.twy.aop.service..*.*(..)) 表达式为例,语法如下:
         * execution() 为表达式主体
         * 第一个 * 号的位置:表示返回值类型, * 表示所有类型
         * 包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,
         * com.twy.aop.service 包、子包下所有类的方法
         * 第二个 * 号的位置:表示类名, * 表示所有类
         * *(..) :这个星号表示方法名, * 表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数
         */
        @Pointcut("execution(* com.twy.aop.service..*.*(..))")
        public void test() 
    
        
    
        @Before(value = "test()")
        public void berfore(JoinPoint joinPoint) 
            String name = joinPoint.getSignature().getName();
            logger.info("前置方法:", name);
        
    
        @After(value = "test()")
        public void after(JoinPoint joinPoint) 
            String name = joinPoint.getSignature().getName();
            logger.info("后置方法:", name);
        
    
        @AfterReturning(value = "test()", returning = "result")
        public void afterReturning(JoinPoint joinPoint, Object result) 
            String name = joinPoint.getSignature().getName();
            logger.info("后置返回方法:,结果:", name, result);
        
    
        @AfterThrowing(value = "test()", throwing = "e")
        public void afterReturning(JoinPoint joinPoint, Exception e) 
            String name = joinPoint.getSignature().getName();
            logger.info("后置抛出异常方法:,抛出异常:", name, e.getMessage());
        
    
        @Around(value = "test()")
        public void around(ProceedingJoinPoint proceedingJoinPoint) 
            logger.info("环绕开始方法");
            try 
                Object obj = proceedingJoinPoint.proceed();
                logger.info("返回结果:", obj);
             catch (Throwable throwable) 
                logger.info("抛出异常:", throwable.getMessage());
                throwable.printStackTrace();
            
            logger.info("环绕结束方法");
        
    
    
    
  2. 创建接口

    @Component
    public class TestService 
        public String test(Integer id) 
            return "test";
        
    
    
  3. 创建调用接口请求

     @RestController
     public class TestController 
    
         @Autowired
         public TestService testService;
     
      	 @GetMapping("/test")
         public String test(Integer id) 
          	return testService.test(id);
         
    
     
    

三、测试

这里可以看出@Around里返回了结果,@AfterReturning没有返回结果,@Around@AfterReturning@AfterThrowing先进行处理,因此我们需要注意这三个注解同时使用时的冲突

以上是关于SpringBoot学习笔记:整合aop的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot学习笔记之表单验证@Valid与AOP切面

springboot学习笔记-5 springboot整合shiro

springboot学习笔记-5 springboot整合shiro

SpringBoot整合AOP

SpringBoot学习笔记:整合mybatis

springboot学习笔记-5 springboot整合shiro