pom引入aop的依赖
1 | <!--引入aop的依赖--> |
application.properties配置aop
1 | spring.aop.auto=true |
ProceedingJoinPoint joinPoint
继承JoinPoint
常用方法
1、JoinPoint#getArgs()->Objcet[]
返回参数列表
2、ProceedingJoinPoint#proceed()
正常运行函数,参数由上级传入
3、ProceedingJointPoint#proceed(Object[])
正常运行函数,函数的入口参数为指定的Object数组
4、procced()
返回值便是执行切面函数之后的返回值
切面常用函数
1、@Around()
入口参数ProceedingJoinPoint joinpoint
出口参数Object
通常是joinpoint.proceed()返回的结果作为出口参数。
使用around方法的时候,如果没有返回数据通常就是出口参数问题。在对controller层做切面的时候,around的方法没有返回值。也就是前台没有返回值了。在joinpoint中可以拿到要加载参数和返回的参数。proceed的入口参数使用getArgs()获得。出口参数使用joinpoint.proceed()方法返回。使用around就要处理joint。使用空的around会跳过切面函数的执行。
2、@Before()
3、@After()
4、@AfterReturning()
5、@AfterThrowing()
切面函数的执行次序
1.@Around ->joinpint.proceed()开始->@Before->proceed对应的函数->@After->@AfterReturning
使用注解来实现统一的日志管理
1、建立一个注解名为MyLog.这个注解是用来定位那个函数需要记录日志的
1 | package com.longquanxiao.springboot.annocation; |
2、建立一个切面的实现类,将切点定位到注解中。这样只要使用了这个注解就会使用该切面
1 | package com.longquanxiao.springboot.aspect; |
3、建立切面要切的类和函数
其中有一个函数print使用了@MyLog注解,print2不是用注解
1 | package com.longquanxiao.springboot.service; |
4、测试
1 |
|
5、输出的结果
1 | ----------------------------------------------- |
6、给print2也打上日志注解,输出的结果如下
1 | ----------------------------------------------- |
在切面函数中,每个函数都可以传入JoinPoint对象来获取相应的参数和设置相应的参数。在around中可以传入一个不同的参数,ProceedingJoinPoint 是JointPoint的子类。拥有proceed()方法。可以按需的调用被代理的函数。
获得日志注解传进来的值
1、在@Around()
中value使用@annotation(logInstance)
和argNames="joinPoint,logInstance"
Around的处理函数接收两个参数joinPoint,logInstance
如果只有参数列表只有joinpoint可以省略public Object around(ProceedingJoinPoint joinPoint,MyLog logInstance) throws Throwable{}
这样在函数中想要传进来的参数值便可以用logInstance.value()
获得了。注意其中的参数问题,logInstance
在annotation中使用,在参数列表中使用。
2、只要注解的值
1 |
|
3、可不可以要该函数上另外注解的值呢?
3.1 为了去了解是否可以使用该注解切面获得该函数上其它注解的值。做出了如下的实验。
(1) 新建一个名为MyDescroption的注解
1 | /** |
(2)将切面中的@Around方法,更改成
1 |
|
(3) 将注解打入函数中
1 |
|
输出结果:
1 | description value = print2 |
(4)结论:将切点切入函数中,函数上所有的注解被获得和使用