Spring boot Aop 学习案例

本文详细介绍了如何在Spring Boot项目中使用AOP(面向切面编程),通过具体示例展示了如何创建AOP类和控制器,以及如何在控制台上打印访问控制器方法时的请求方式、地址和参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pom文件中引用的,重点是AOP 

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.57</version>
        </dependency>

        <!--AOP-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>     

1.创建一个Aop类

package com.zhangxiaosan.top.system;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAopAspect {

    /***
     * 设置异常切入点,检测指定位置的包
     */
    @Pointcut("execution(* com.zhangxiaosan.top.*.controller..*.*(..))")
    public void logScanPackages(){}

    /***
     * 执行方法之前切入
     * @param joinPoint
     */
    @Before("logScanPackages()")
    public void logBeforeController(JoinPoint joinPoint){
        System.out.println("\nAop-Before->Begin:");
        System.out.println("Aop--->包名和方法:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        System.out.println("Aop---> :"+joinPoint.getTarget());
        System.out.println("Aop---> :"+joinPoint.getThis());
        System.out.println("Aop--Before->End!\n");
    }

    /***
     * 执行方法之后切入
     * @param joinPoint
     */
    @After("logScanPackages()")
    public void logAfterController(JoinPoint joinPoint){
        System.out.println("\nAop-After->Begin:");
        System.out.println("Aop--->包名和方法:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        System.out.println("Aop---> :"+joinPoint.getTarget());
        System.out.println("Aop---> :"+joinPoint.getThis());
        System.out.println("Aop--After->End!\n");
        
    }
}

2.创建一个控制器,

package com.www.zhangxiaosan.top.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@RequestMapping("/Test")
@RestController
public class TestController {
   
    
    @RequestMapping(method = RequestMethod.GET,value = "/Test1")
    public String Test1(Integer id){
       System.out.println("-----toDo-------")
        
    }
}

3.访问当前的控制器即可,在控制台下能看到如下打印:

2020-08-25 15:45:43.972  INFO 10100 --- [           main] d.s.w.p.DocumentationPluginsBootstrapper : Context refreshed
2020-08-25 15:45:43.987  INFO 10100 --- [           main] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
2020-08-25 15:45:44.017  INFO 10100 --- [           main] s.d.s.w.s.ApiListingReferenceScanner     : Scanning for api listing references
2020-08-25 15:45:44.136  INFO 10100 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8001 (http) with context path ''
2020-08-25 15:45:44.138  INFO 10100 --- [           main] 


Aop-Before->Begin:
Aop---包名和方法:com.zhangxiaosan.top.controller.TestController.Test1
Aop---> :com.zhangxiaosan.top.controller.TestController@6d0114c0
Aop---> :com.zhangxiaosan.top.controller.TestController@6d0114c0
Aop--Before->End!

------toDo------

Aop-After->Begin:
Aop---包名和方法:com.zhangxiaosan.top.controller.TestController.Test1
Aop---> :com.zhangxiaosan.top.controller.TestController@6d0114c0
Aop---> :com.zhangxiaosan.top.controller.TestController@6d0114c0
Aop--After->End!

举例,打印访问控制器中的方法时,将请求方式,请求地址,请求参数打印出来

  /***
     * 执行方法之前切入
     * @param joinPoint
     */
    @Before("logScanPackages()")
    public void logBeforeController(JoinPoint joinPoint){
        log.info("开始请求的地址:"+joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        //Object[] args = joinPoint.getArgs();
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = requestAttributes.getRequest();
        String method = request.getMethod();
        log.info("请求方式:"+method);
        Map<String, String[]> parameterMap = request.getParameterMap();
        parameterMap.forEach((key,val)->{
            for(String item : val){
                log.info("参数 "+key+" : "+item);
            }
        });

    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张帅三代

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值