zoukankan      html  css  js  c++  java
  • SpringBoot中AOP的配置

    AOP目的:
    面向切面编程(aspect-oriented programming,AOP)主要实现的目的是针对业务处理过程中的切面进行提取,诸如日志、事务管理和安全这样的系统服务,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。


    AOP术语详见:
    http://www.cnblogs.com/lspz/p/6365445.html


    简单例子:

    1、在浏览器中打开http://start.spring.io/,如图

    这里写图片描述

    这里写图片描述

    点击“Switch to the full version.”,勾选"Web"和AOP,然后点击“ Generate Project alt +”按钮,把文件保存到本地某个位置

    2、解压文件直接在IDEA中open,项目目录如下:

    这里写图片描述

    3.编制Example.java存于demosrcmainjavacomexampleweb下

    package com.example.web;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class Example {
    
        @RequestMapping("/")
        public String home() {
            return "Hello World!";
        }
    }
    

    4.编制WebLogAspect.java在demosrcmainjavacomexampleaop下:

    package com.example.aop;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    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;
    import java.util.Arrays;
    
    @Aspect
    @Component
    public class WebLogAspect {
        protected static org.slf4j.Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
    
        @Pointcut("execution(public * com.example.web..*.*(..))")
        public void webLog() {
        }
    
        @Before("webLog()")
        public void doBefore(JoinPoint joinPoint) throws Throwable {
            System.out.println( "进入doBefore切面");
            // 接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
    
            // 记录下请求内容
            logger.info("URL : " + request.getRequestURL().toString());
            logger.info("HTTP_METHOD : " + request.getMethod());
            logger.info("IP : " + request.getRemoteAddr());
            logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
            logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));
    
        }
    
        @AfterReturning(returning = "ret", pointcut = "webLog()")
        public void doAfterReturning(Object ret) throws Throwable {
            // 处理完请求,返回内容
            logger.info("RESPONSE : " + ret);
        }
    }
    
    

    5.运行
    通过运行程序并访问:http://localhost:8080,可以获得下面的日志输出:

    这里写图片描述


    实现AOP的切面主要有以下几个要素:

    使用@Aspect注解将一个java类定义为切面类。

    使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。

    根据需要在切入点不同位置的切入内容,5种类型的通知。

    - 使用@Before在切入点开始处切入内容
    - 使用@After在切入点结尾处切入内容
    - 使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
    - 使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
    - 使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑
    

    总结:
    使用http://start.spring.io/可以快速的搭建项目,另AOP原理主要是使用动态代理详见:

    http://www.cnblogs.com/lspz/p/6237378.html

  • 相关阅读:
    深入理解DOM节点类型第三篇——注释节点和文档类型节点
    深入理解DOM节点类型第二篇——文本节点Text
    深入学习jQuery选择器系列第八篇——过滤选择器之伪子元素选择器
    深入学习jQuery选择器系列第七篇——表单选择器
    深入学习jQuery选择器系列第六篇——过滤选择器之状态选择器
    深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器
    深入学习jQuery选择器系列第四篇——过滤选择器之属性选择器
    深入学习jQuery选择器系列第三篇——过滤选择器之索引选择器
    深入学习jQuery选择器系列第二篇——过滤选择器之子元素选择器
    RAID一个硬盘FAIL。
  • 原文地址:https://www.cnblogs.com/lspz/p/6364968.html
Copyright © 2011-2022 走看看