zoukankan      html  css  js  c++  java
  • Spring Boot学习——AOP编程的简单实现

           首先应该明白一点,AOP是一种编程范式,是一种程序设计思想,与具体的计算机编程语言无关,所以不止是Java,像.Net等其他编程语言也有AOP的实现方式。AOP的思想理念就是将通用逻辑从业务逻辑中分离出来。

           本文将通过一个HTTP请求的例子简单的讲解Spring Boot中AOP的应用,步骤如下:

           第一步,添加依赖

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

           第二步,创建AOP方法的类

    package *; //自己定义
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    
    import javax.servlet.http.HttpServletRequest;
    
    
    @Aspect
    @Component
    public class HttpAspect {
        //使用org.slf4j.Logger,这是Spring实现日志的方法
        private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
    
        /**
         * 定义AOP扫描路径
         * 第一个注解只扫描aopTest方法
         */
        //@Pointcut("execution(public * com.aston.reader.controller.StudentController.aopTest())")
        @Pointcut("execution(public * com.aston.reader.controller.StudentController.*())")
        public void log(){}
    
        /**
         * 记录HTTP请求开始时的日志
         */
        @Before("log()")
        public void doBefore(JoinPoint joinPoint){
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            //URL
            logger.info("url={}", request.getRequestURI());
            //method
            logger.info("method={}", request.getMethod());
            //ip
            logger.info("ip={}",request.getRemoteAddr());
            //类方法
            logger.info("class={} and method name = {}",joinPoint.getSignature().getDeclaringTypeName(),joinPoint.getSignature().getName());
            //参数
            logger.info("参数={}",joinPoint.getArgs());
        }
    
        /**
         * 记录HTTP请求结束时的日志
         */
        @After("log()")
        public void doAfter(){
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            logger.info("url = {} end of execution", request.getRequestURL());
        }
    
        /**
         * 获取返回内容
         * @param object
         */
        @AfterReturning(returning = "object",pointcut = "log()")
        public void doAfterReturn(Object object){
            logger.info("response={}",object.toString());
        }
    }

           第三步,创建试验方法

    package *; //自己定义
    
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    public class StudentController {
    
        @GetMapping(value = "/aoptest")
        public String aopTest(){
            return " AOP test success!";
        }
    
    }

           第四步,启动程序,访问 http://127.0.0.1:8080/aoptest 查看结果。

  • 相关阅读:
    数据库Connection.OPEN()异常情况下 耗时很久才回应
    System.Threading.Tasks.TaskExceptionHolder.Finalize() 系统错误c#
    WCF双向通讯netTCP
    并行LINQ PLinq
    winform调用http
    kindle电子书的资源网站
    vscode设置中文语言
    Python拼接路径
    Python查看已安装模块
    Python查看模块版本
  • 原文地址:https://www.cnblogs.com/aston/p/7257657.html
Copyright © 2011-2022 走看看