`

SpringBoot切面AOP

阅读更多
1. SpringBoot切面AOP

SpringBoot提供了强大AOP支持,这里补充说明AOP原介绍;
AOP切面主要是切方法,我们一般搞一些日志分析和事务操作,要用到切面,类似拦截器;

@Aspect注解是切面注解类

@Pointcut切点定义

@Before是方法执行前调用

@After是方法执行后调用

@AfterReturning方法执行返回值调用

Service层本身就可以切入事务,所以我们这类搞个常用的 切controller层方法
每个执行controller层的方法 都记录下请求Url,访问者IP 执行类方法参数等信息;


pom.xml

<dependencies>
    <dependency>
        <groupId>apache-log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.15</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

src/main/java/com/andrew/aspect/RequestAspect.java

package com.andrew.aspect;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
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.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.andrew.entity.Student;

@Aspect
@Component
public class RequestAspect {
    private static Logger logger = Logger.getLogger(RequestAspect.class);
    @Pointcut("execution(public * com.andrew.controller.*.*(..))")
    public void log() {
    }
    @Before("log()")
    public void doBefore(JoinPoint joinPoint) {
        logger.info("方法执行前...");
        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = sra.getRequest();
        logger.info("url:" + request.getRequestURI());
        logger.info("ip:" + request.getRemoteHost());
        logger.info("method:" + request.getMethod());
        logger.info("class_method:" + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        logger.info("args:" + joinPoint.getArgs());
        Student student = (Student) joinPoint.getArgs()[0];
        System.out.println(student);
    }
    @After("log()")
    public void doAfter(JoinPoint joinPoint) {
        logger.info("方法执行后...");
    }
    @AfterReturning(returning = "result", pointcut = "log()")
    public void doAfterReturning(Object result) {
        logger.info("方法返回值:" + result);
    }
}

src/main/resources/log4j.properties

log4j.rootLogger=DEBUG, Console ,File  
  
#Console    
log4j.appender.Console=org.apache.log4j.ConsoleAppender    
log4j.appender.Console.layout=org.apache.log4j.PatternLayout    
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

http://localhost:8000/studentAdd.html
d 22 提交
console打印
2018-06-14 23:38:13,085 [http-nio-8000-exec-2] INFO  [com.andrew.aspect.RequestAspect] - 方法执行前...
  2018-06-14 23:38:13,086 [http-nio-8000-exec-2] INFO  [com.andrew.aspect.RequestAspect] - url:/student/add
  2018-06-14 23:38:13,086 [http-nio-8000-exec-2] INFO  [com.andrew.aspect.RequestAspect] - ip:0:0:0:0:0:0:0:1
  2018-06-14 23:38:13,086 [http-nio-8000-exec-2] INFO  [com.andrew.aspect.RequestAspect] - method:POST
  2018-06-14 23:38:13,087 [http-nio-8000-exec-2] INFO  [com.andrew.aspect.RequestAspect] - class_method:com.andrew.controller.StudentController.add
  2018-06-14 23:38:13,087 [http-nio-8000-exec-2] INFO  [com.andrew.aspect.RequestAspect] - args:[Ljava.lang.Object;@46202a02
  Student [id=null, name=d, age=22]
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into t_student (age, name, id) values (?, ?, ?)
2018-06-14 23:38:13,368 [http-nio-8000-exec-2] INFO  [com.andrew.aspect.RequestAspect] - 方法执行后...
  2018-06-14 23:38:13,368 [http-nio-8000-exec-2] INFO  [com.andrew.aspect.RequestAspect] - 方法返回值:添加成功
分享到:
评论

相关推荐

    SpringBoot中的AOP+自定义注解(源代码)

    1.1 `@AspectJ` 切面类 1.2 `@Pointcut` 创建切入点 1.3 通知 1.4 Spring AOP 和 AspectJ AOP 有什么区别? 2. 在 SpringBoot 中使用 Aop 功能 2.0 创建一个SpringBoot项目 2.1 引入 POM 依赖 2.1.1 引入springboot ...

    解决springboot的aop切面不起作用问题(失效的排查)

    解决SpringBoot的AOP切面不起作用问题排查 SpringBoot中的AOP(Aspect-Oriented Programming)切面是指在业务逻辑中添加的额外功能,以实现日志记录、安全检查、事务管理等功能。但是,在实际开发中,我们可能会...

    springBoot+aop+自定义注解+本地线程实现统一接口日志及接口响应时长

    核心原理:通过自定义注解实现每个接口的描述及所在模块还有接口的操作类型,通过拦截器及访问方法后的切面aop记录接口的总耗时,在接口请求前在本地线程记录请求的参数,接口请求后记录返回参数及记录请求日志 ...

    springboot实现消息转换、切面AOP和Redis缓存

    在本项目中,我们将探讨如何在SpringBoot中实现消息转换、切面编程(AOP)以及使用Redis作为缓存。 ### 消息转换 在SpringBoot中,消息转换是处理应用程序与外部系统之间数据交换的过程。Spring提供了`...

    SpringBoot AOP切面类三种写法(源代码)

    目录 SpringBoot AOP 写法一: @Before("execution(* com.bjpowernode.springboot07.javabean.Man.eat(..))") 一、AOP开发 1.1 概述 1.2使用方法 1.3创建项目并添加maven依赖 ...2.3 切面类(不一样的地方

    SpringBoot中AOP与切面编程的技术解析及应用实例

    内容概要:本文详细介绍了SpringBoot中AOP与切面编程的基础理论及其具体应用场景。首先解释了AOP的基本概念,包括切面、连接点、通知、切点等。接着讨论了AOP在SpringBoot中的作用与优势,如代码解耦、统一管理和...

    spring切面AOP所使用的jar包

    Spring框架的AOP(面向切面编程)是其核心特性之一,它允许开发者在不修改原有代码的情况下,通过切面来插入额外的功能,比如日志记录、事务管理、性能监控等。在Spring AOP中,主要涉及到两个重要的库:...

    Springboot整合Aop.zip

    为了解决这一问题,面向切面编程(Aspect-Oriented Programming,简称 AOP)应运而生。AOP 的核心思想是将分散在各处的横切关注点(如日志、事务管理、安全性检查等)集中起来进行处理,从而减少代码冗余,提高模块...

    SpringBoot+AOP+TraceID.pdf

    在 SpringBoot 中,AOP 可以通过使用 @Aspect 注解来标注一个类,使其成为一个切面(Aspect)。切面可以包含多个通知(Advice),这些通知可以在方法的执行前、执行后、抛出异常时等不同时机执行。例如,在本文档中...

    Spring Boot Aspect 切面 AOP 拦截器 Interceptor 监控control请求耗时

    在Spring Boot应用中,面向切面编程(AOP)是一种强大的设计模式,它允许我们以声明式的方式插入代码,比如日志记录、事务管理或权限检查。Aspect是AOP的核心概念,它封装了关注点,使得我们可以将这些关注点与业务...

    SpringBoot整合aop面向切面编程过程解析

    SpringBoot整合AOP面向切面编程过程解析 AOP(Aspect Oriented Programming),即面向切面编程,是一种编程技术,通过预编译方式和运行期动态代理实现程序功能的统一维护。AOP是Spring框架中的一个重要内容,它通过...

    springboot-AOP实现多数据源动态切换(Druid连接池)

    1. **Spring AOP(面向切面编程)**:AOP是Spring框架的核心特性之一,它允许我们定义方法拦截器或切面来跨多个点应用横切关注点。在这里,我们使用AOP来在运行时动态改变数据源。 2. **Druid连接池**:Druid是阿里...

    springBoot+aop 简单demo

    而AOP(Aspect Oriented Programming,面向切面编程)则是Spring框架的一个重要特性,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强或日志记录等操作。现在我们来详细探讨Spring Boot集成AOP的基本...

    SpringBoot+AOP日志

    在本项目中,"SpringBoot+AOP日志"是一个基于Spring Boot框架的日志管理系统,它利用了Spring Boot的便利性和AOP(面向切面编程)技术来实现对应用程序日志的高效、统一处理。让我们深入探讨一下这个项目的核心知识...

    springboot面试题aop.docx

    AOP允许开发者定义“切面”,这些切面封装了关注点,比如日志记录、事务管理等,从而将它们与业务逻辑分离。在Spring Boot中,可以使用@Aspect注解定义切面,@Before、@After、@Around等注解控制切面何时执行。此外...

    springboot+aspect实现springaop拦截指定方法.zip

    综上所述,SpringBoot结合AspectJ实现SpringAOP拦截指定方法,主要涉及到Spring AOP的原理、切点和通知的定义、自定义注解的使用,以及如何在SpringBoot项目中整合AspectJ进行更复杂的切面编程。通过这些知识点,...

    springboot 脱敏自定义注解

    在Spring Boot应用中,我们可以通过自定义注解和Spring AOP(面向切面编程)来实现这一功能。下面将详细解释这个主题。 首先,了解Spring AOP的概念。AOP是面向切面编程,它允许我们在不修改源代码的情况下,通过预...

    SpringBoot如何使用AOP+Redis实现接口限流实现全过程(值得珍藏)

    总结:通过 Spring Boot 结合 AOP 和 Redis,我们可以轻松实现接口限流,保护系统免受过量请求的影响。这种方式既灵活又高效,能够适应各种不同的限流需求。在实践中,根据实际情况调整限流策略,结合监控工具,可以...

    springboot spring aop 拦截器注解方式实现脱敏

    在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...

    springBoot - 使用Aop统计方法时间

    在Spring Boot应用中,我们可以利用AOP(面向切面编程)来实现方法执行时间的统计。AOP是一种编程范式,允许我们定义横切关注点,例如日志、事务管理或性能监控,然后将这些关注点与核心业务逻辑分离。在本场景下,...

Global site tag (gtag.js) - Google Analytics