Springboot核心注解,springboot+自定義注解實現靈活的切面配置

 2023-12-06 阅读 33 评论 0

摘要:利用aop我們可以實現業務代碼與系統級服務例如日志記錄、事務及安全相關業務的解耦,使我們的業務代碼更加干凈整潔。   最近在做數據權限方面的東西,考慮使用切面對用戶訪問進行攔截,進而確認用戶是否對當前數據有訪問權限,而我們的項目是sprin

利用aop我們可以實現業務代碼與系統級服務例如日志記錄、事務及安全相關業務的解耦,使我們的業務代碼更加干凈整潔。

  最近在做數據權限方面的東西,考慮使用切面對用戶訪問進行攔截,進而確認用戶是否對當前數據有訪問權限,而我們的項目是springboot項目,所以花時間研究了下springboot下切面的實現。

  1、首先加入相關maven依賴:

  

Springboot核心注解、復制代碼

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

復制代碼

  2、編寫控制器

  

復制代碼

@RestControllerpublic class HelloController {@RequestMapping("/add1")  public String addData1(String deviceId) {return "success";}@RequestMapping("/add2")  public String addData2(String deviceId) {return "success";}@RequestMapping("/add3")  public String addData3(String deviceId) {return "success";}}

spring自定義注解,復制代碼

  3、配置切面

  

1

2

springboot切面編程,3

4

5

6

7

java自定義注解實現,8

9

10

11

12

ssm框架注解大全,13

14

15

16

17

@SpringBootApplication,18

19

20

21

22

jsonpropertyorder注解,23

@Aspect

@Component

public?class?TestAspect {

????@Pointcut("execution(public * com.example.demo.controller.HelloController.add*(..))")

面向切面編程常用的注解、????public?void?addAdvice(){}??

????@Around("addAdvice()")

????public?Object Interceptor(ProceedingJoinPoint pjp){

????????Object result =?null;?

????????Object[] args = pjp.getArgs();

怎么通過注解開發一個切面類,????????if(args !=?null?&& args.length >0) {

????????????String deviceId = (String) args[0];

?????????????if(!"03".equals(deviceId)) {

?????????????????return?"no anthorization";

?????????????}

????????}?????

????????try?{

????????????result =pjp.proceed();

????????}?catch?(Throwable e) {

????????????e.printStackTrace();

????????}??

????????return?result;

????}

}

  這樣下來我們就實現了一個簡單切面,在切面中實現自己的數據安全認證,此處只做一個簡單判斷,測試如下:

  

  

  4、但是這樣的切面不夠靈活,所以我們添加一個自定義注解

  

1

2

3

4

5

6

@Documented?

@Retention(RetentionPolicy.RUNTIME)?

@Target(ElementType.METHOD)?

public?@interface?MyAnnotation {

?????

}

  5、修改切面類

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

@Aspect

@Component

public?class?TestAspect {

????@Pointcut("execution(public * com.example.demo.controller.HelloController.add*(..)) && @annotation(com.example.demo.controller.MyAnnotation)"?)

????public?void?addAdvice(){}??

????@Around("addAdvice()")

????public?Object Interceptor(ProceedingJoinPoint pjp){

????????Object result =?null;?

????????Object[] args = pjp.getArgs();

????????if(args !=?null?&& args.length >0) {

????????????String deviceId = (String) args[0];

?????????????if(!"03".equals(deviceId)) {

?????????????????return?"no anthorization";

?????????????}

????????}?????

????????try?{

????????????result =pjp.proceed();

????????}?catch?(Throwable e) {

????????????e.printStackTrace();

????????}??

????????return?result;

????}

}

  6、修改控制器,給需要切面的方法上加上注解

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

@RestController

?

public?class?HelloController {

?

????@MyAnnotation

????@RequestMapping("/add1")?

????public?String addData1(String deviceId) {

????????return?"success";

????}

?

????@RequestMapping("/add2")?

????public?String addData2(String deviceId) {

????????return?"success";

????}

????@RequestMapping("/add3")?

????public?String addData3(String deviceId) {

????????return?"success";

????}

?????

}

  通過自定義注解,我們可以靈活的添加切面,在需要使用切面的方法上添加注解,測試如下:

  

  

  

  實際開發中我們可以將"execution(public * com.example.demo.controller.HelloController.add*(..)) && @annotation(com.example.demo.controller.MyAnnotation)"改為"execution(public * com.example.demo.controller.*.*(..)) && @annotation(com.example.demo.controller.MyAnnotation)",這樣在controller包下,只有我們加上@MyAnnotation注解的方法切面方法才會起作用。

?

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/187299.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息