Springboot整合AOP拦截器

2020-11-24 14:47:57 浏览数 (1)

1、AOP(面向切面编程)是Spring提供的重要技术工具,其主要功能是对业务层的方法调用进行拦截处理。SpringBoot默认情况下并没有配置AOP拦截器,需要在项目中手动引入spring-boot-starter-aop依赖库后才可以使用。

修改pom.xml配置文件,配置spring-boot-starter-aop依赖库,如下所示:

代码语言:javascript复制
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 5     https://maven.apache.org/xsd/maven-4.0.0.xsd">
 6     <modelVersion>4.0.0</modelVersion>
 7     <parent>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-starter-parent</artifactId>
10         <version>2.3.5.RELEASE</version>
11         <relativePath /> <!-- lookup parent from repository -->
12     </parent>
13     <groupId>com.example</groupId>
14     <artifactId>demo</artifactId>
15     <version>0.0.1-SNAPSHOT</version>
16     <name>demo</name>
17     <description>Demo project for Spring Boot</description>
18 
19     <properties>
20         <java.version>1.8</java.version>
21         <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
22     </properties>
23 
24     <dependencies>
25         <dependency>
26             <groupId>org.springframework.boot</groupId>
27             <artifactId>spring-boot-starter-web</artifactId>
28         </dependency>
29 
30         <dependency>
31             <groupId>org.springframework.boot</groupId>
32             <artifactId>spring-boot-starter-test</artifactId>
33             <scope>test</scope>
34             <exclusions>
35                 <exclusion>
36                     <groupId>org.junit.vintage</groupId>
37                     <artifactId>junit-vintage-engine</artifactId>
38                 </exclusion>
39             </exclusions>
40         </dependency>
41         <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
42         <dependency>
43             <groupId>org.hibernate</groupId>
44             <artifactId>hibernate-validator</artifactId>
45             <version>6.1.0.Final</version>
46         </dependency>
47         <dependency>
48             <groupId>org.springframework.boot</groupId>
49             <artifactId>spring-boot-starter-thymeleaf</artifactId>
50         </dependency>
51         <!-- aop -->
52         <dependency>
53             <groupId>org.springframework.boot</groupId>
54             <artifactId>spring-boot-starter-aop</artifactId>
55         </dependency>
56     </dependencies>
57 
58     <build>
59         <plugins>
60             <plugin>
61                 <groupId>org.springframework.boot</groupId>
62                 <artifactId>spring-boot-maven-plugin</artifactId>
63             </plugin>
64         </plugins>
65         <resources>
66             <resource>
67                 <directory>src/main/resources</directory>
68                 <includes>
69                     <include>**/*.properties</include>
70                     <include>**/*.yml</include>
71                     <include>**/*.xml</include>
72                     <include>**/*.p12</include>
73                     <include>**/*.html</include>
74                     <include>**/*.jpg</include>
75                     <include>**/*.png</include>
76                 </includes>
77             </resource>
78         </resources>
79     </build>
80 
81 </project>

搞一个业务层接口,然后搞一个业务层接口实现子类。

代码语言:javascript复制
1 package com.demo.service;
2 
3 public interface UserService {
4 
5     public String login(String username, String password);
6 }
代码语言:javascript复制
 1 package com.demo.service.impl;
 2 
 3 import org.springframework.stereotype.Service;
 4 
 5 import com.demo.service.UserService;
 6 
 7 @Service
 8 public class UserServiceImpl implements UserService {
 9 
10     @Override
11     public String login(String username, String password) {
12         if (username.equals("admin") && password.equals("123456")) {
13             return "success!!!";
14         }
15         return "fail!!!";
16     }
17 
18 }

定义AOP程序类,对业务方法进行拦截,这里使用环绕通知处理。

代码语言:javascript复制
 1 package com.demo.aop;
 2 
 3 import java.util.Arrays;
 4 
 5 import org.aspectj.lang.ProceedingJoinPoint;
 6 import org.aspectj.lang.annotation.Around;
 7 import org.aspectj.lang.annotation.Aspect;
 8 import org.slf4j.Logger;
 9 import org.slf4j.LoggerFactory;
10 import org.springframework.stereotype.Component;
11 
12 /**
13  * 定义业务层拦截
14  * 
15  * @author Aiyufei
16  *
17  */
18 @Component
19 @Aspect
20 public class ServiceAspect {
21 
22     private Logger log = LoggerFactory.getLogger(ServiceAspect.class);
23 
24     /**
25      * 环绕通知
26      * 
27      * @param point
28      * @return
29      * @throws Throwable
30      */
31     @Around("execution(* com.demo.service..*.*(..))")
32     public Object arroudInvoke(ProceedingJoinPoint point) throws Throwable {
33         this.log.info("the before 执行参数:  "   Arrays.toString(point.getArgs()));
34         Object proceed = point.proceed(point.getArgs());
35         this.log.info("the after 返回结果:"   proceed);
36         return proceed;
37     }
38 
39 }

搞一个控制层类,如下所示:

代码语言:javascript复制
 1 package com.demo.controller;
 2 
 3 import org.springframework.beans.factory.annotation.Autowired;
 4 import org.springframework.stereotype.Controller;
 5 import org.springframework.web.bind.annotation.RequestMapping;
 6 import org.springframework.web.bind.annotation.RequestParam;
 7 import org.springframework.web.bind.annotation.ResponseBody;
 8 
 9 import com.demo.service.UserService;
10 
11 @Controller
12 public class SpringBootController {
13 
14     @Autowired
15     private UserService userService;
16 
17     @RequestMapping(value = "/login")
18     @ResponseBody
19     public String hello(@RequestParam(value = "username") String username,
20             @RequestParam(value = "password") String password) {
21         System.out.println("hello world!!!");
22         String login = userService.login(username, password);
23         return login;
24     }
25 
26 }

使用postman测试一下,如下所示:

由于将切入点设置在了所有的业务层上,所以在调用UserService接口方法时会自动执行AOP拦截。

0 人点赞