Spring boot + Aop 冷不防 2022-05-20 08:15 83阅读 0赞 pom.xml的写法如下:(具体的解释在Spring官网上都有介绍,不在赘述) <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.springframework</groupId> <artifactId>gs-rest-service</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </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-starter-aop</artifactId> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <scope>test</scope> </dependency> </dependencies> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project> maven工程的目录结构如下: ![这里写图片描述][70] Greeting.java package org.springframework.gs_rest_service; public class Greeting { private final long id; private final String content; public Greeting(long id, String content) { this.id = id; this.content = content; } public long getId() { return id; } public String getContent() { return content; } } GreetingController.java package org.springframework.gs_rest_service; import java.util.concurrent.atomic.AtomicLong; //import org.aspectj.lang.annotation.Aspect; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class GreetingController { private static final String template = "Hello, %s!"; private final AtomicLong counter = new AtomicLong(); @RequestMapping("/greeting") public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { return new Greeting(counter.incrementAndGet(), String.format(template, name)); } } HttpAspect.java(切面类) package org.springframework.gs_rest_service; 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(* org.springframework.gs_rest_service.GreetingController.*(..))") 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 org.springframework.gs_rest_service; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 如下为运行结果,很明显自行了在方法前后执行了相关的操作,实现AOP的效果。 ![这里写图片描述][70 1] [70]: /images/20220520/e53e411419a04fd8a64ff945b20178b6.png [70 1]: /images/20220520/b7a634d7ed4d4b1a84d35b4280280f0f.png
还没有评论,来说两句吧...