好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringBoot AOP使用笔记

1. 启用aop

a. 在类上添加@aspect注解

b. 注入该类, 可以使用@component进行注入到spring容器中

2. 通过pointcut对象创建切入点

a. 在某个方法使用类似下面的方法进行注入

?

1

2

3

@pointcut ( "execution(* com.sguess.service.iaopservice.*(..))" )

   private void pointcut() {

   }

i. 其中,execution表达式为
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)  
ii. 注意, pointcut()方法名是后面切入的时候需要使用的
iii. 方法内可以什么也不写, 写了也调不到
iv. 也可以创建多个pointcut,例如再创建一个

?

1

2

3

@pointcut ( "execution(* com.sguess.service.iaopservice.fun1(..))" )

     private void pointcut2() {

     }

这个的方法名就位pointcut2, 方法名不一样.  

b. 创建after方法,before方法

?

1

2

3

4

@after (value = "pointcut()" )

   public void doafter() {

     system.out.println( "do aop after function 01" );

   }

i. after方法是指, 在配置了的切入点被执行后, 执行该方法. 
ii. value中的pointcut() 是我们前面在创建@pointcut中的方法名. 也就是说,是通过方法名和切入点进行匹配的. 
iii. 这个的方法名可以随便起. 
iv. before方法同理

c. 带return的after方法,

?

1

2

3

4

@afterreturning (returning = "str" , pointcut = "pointcut()" )

   public void doafterreturning(string str) throws exception {

     system.out.println( "return value is: " + str);

   }

i. afterreturn是指在被切入的方法执行后, 获取其返回值, 再执行该方法. 注意关键, 这个可以进行操作返回值. 
ii. returning = "str",是指, 假设切入方法的返回的值变量名为str
doafterreturning(string str)方法的参数变量名必须和和returning保持一致, 这里也叫作str. 然后才能在方法体中使用.
iii. pointcut = "pointcut()"同样是指前面声明的pointcut方法名

3. 通过注解, 使用切入点

a. 监听方法参数

?

1

2

3

4

5

6

7

8

9

10

11

12

@before ( "execution(public int com.sguess.service.*(int, int))" )

   public void beformethod(joinpoint point) {

     string methodname = point.getsignature().getname();

     list<object> args = arrays.aslist(point.getargs());

     system.out.println( "before functionname:" + methodname + ",parametername:" + args);

   }

   @after ( "execution(public int com.sguess.service.*(int, int))" )

   public void aftermethod(joinpoint point) {

     string methodname = point.getsignature().getname();

     list<object> args = arrays.aslist(point.getargs());

     system.out.println( "after functionname:" + methodname + ",parametername:" + args);

   }

4. 执行顺序:

a.around的方法优先于before/after执行,after优先于afterreturn. 

i. 代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

@before ( "execution(public int com.sguess.service.*.*(int, int))" )

       public void beformethod(joinpoint point) {

         system.out.println( "before function" );

       }

       @after ( "execution(public int com.sguess.service.*.*(int, int))" )

       public void aftermethod(joinpoint point) {

         system.out.println( "after function" );

       }

       @afterreturning ( "execution(public int com.sguess.service.*.*(int, int))" )

       public void afterreturnmethod(joinpoint point) {

         system.out.println( "afterreturn function" );

       }

       @afterthrowing (value = "execution(public int com.sguess.service.*.*(int, int))" , throwing = "e" )

       public void afterreturningthrowing(joinpoint point, exception e) {

         system.out.println( "afterreturnthrowing function" );

       }

       @around ( "execution(public int com.sguess.service.*.*(int, int))" )

       public object aroundmethod(proceedingjoinpoint pdj) {

         system.out.println( "start aroundfunction" );

         object result = null ;

         try {

           system.out.println( "around process start" );

           result = pdj.proceed();

           system.out.println( "around process end" );

         } catch (throwable e) {

           system.out.println( "around process exception" );

         }

         system.out.println( "after around process" );

         return result;

       }

     }

执行结果:

start aroundfunction
around process start
before function
around process end
after around process
after function
afterreturn function

5.小结:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

@afterreturning (returning = "str" , pointcut = "pointcut()" )

public void doafterreturning(string str) throws exception {

   system.out.println( "return value is: " + str);

}

@before ( "execution(public int com.sguess.service.*.*(int, int))" )

public void beformethod(joinpoint point) {

   string methodname = point.getsignature().getname();

   list<object> args = arrays.aslist(point.getargs());

   system.out.println( "before functionname:" + methodname + ",parametername:" + args);

}

@after ( "execution(public int com.sguess.service.*.*(int, int))" )

public void aftermethod(joinpoint point) {

   string methodname = point.getsignature().getname();

   list<object> args = arrays.aslist(point.getargs());

   system.out.println( "after functionname:" + methodname + ",parametername:" + args);

}

@afterthrowing (value = "execution(public int com.sguess.service.*.*(int, int))" , throwing = "e" )

public void afterreturningthrowing(joinpoint point, exception e) {

   string methodname = point.getsignature().getname();

   list<object> args = arrays.aslist(point.getargs());

   system.out.println( "afterreturningthrowing functionname:" + methodname + ",parametername:" + args + ",exception:" + e);

}

@around ( "execution(public int com.sguess.service.*.*(int, int))" )

public object aroundmethod(proceedingjoinpoint pdj) {

     system.out.println( "start aroundfunction" );

     object result = null ;

     try {

         system.out.println( "around process start" );

         result = pdj.proceed();

         system.out.println( "around process end" );

     } catch (throwable e) {

         system.out.println( "around process exception" );

     }

     system.out.println( "after around process" );

     return result;

}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接

原文链接:https://blog.csdn.net/sanpic/article/details/82800017

查看更多关于SpringBoot AOP使用笔记的详细内容...

  阅读:16次