![从企业级开发到云原生微服务:Spring Boot实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/257/33831257/b_33831257.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.7 AOP
AOP(Aspect-Oriented Programming,面向切面编程)可以添加额外行为到现有指定条件的一批Bean上,但是我们并不需要修改Bean的代码,这样可对额外行为和Bean本身的行为实现关注隔离。
在学习AOP之前,先来熟悉下面的概念。
◎切面:Aspect,编写额外行为的地方。
◎连接点:Join Point,被拦截的方法。
◎切点:PointCut,通过条件匹配一批连接点。
◎建言:Advice,对于每个连接点需要做的行为。
◎目标对象:符合指定条件的Bean。
在使用AOP开发之前,需要使用@EnableAspectJAutoProxy注解来开启对AspectJ的支持,Spring Boot已经自动做了配置,所以无须额外声明。
下面编写一个使用AOP来记录操作日志的例子。编写一个注解,作为切点拦截条件。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_77_01.jpg?sign=1739690575-ofWUixbiAwJzklf42pMZyVIzWbTGpgNw-0-80292be4a2ff828775ffed184687bec8)
目标对象:
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_77_02.jpg?sign=1739690575-QmRQsWpRzLVLJR4dGZAtcY8TA1Zm3QfF-0-247235a13be7bb6c1bd48c332bdada81)
下面是最重要的部分,编写切面部分的代码。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_78_01.jpg?sign=1739690575-Zm5FuFZLBCjFgpNmfh2FrRDgG8veVD1C-0-65c7ff25640052e1ed82cab3797e2752)
a.使用@Aspect定义一个切面。
b.使用@Pointcut,它会将所有注解了@Logging注解的方法作为条件。
c.使用@Before建言,它使用的切点annotationPointCut()会针对符合切点条件的Bean执行beforeAnnotationPointCut()方法里的行为。
d.joinPoint代表被拦截的方法,可以从joinPoint中获得方法的签名信息。
e.通过joinPoint获得被拦截方法的参数。
f.通过joinPoint获得被拦截方法的注解信息。
g.使用@AfterReturning建言,可以获得被拦截方法的返回值retName。
在JavaConfig中执行下面的代码,结果如图3-17所示。
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_78_02.jpg?sign=1739690575-vKo6iQQ22qGrh2ljXO6sd8v6HkfZsB75-0-54e8ae9a03d4cf1bba28fbc86242ef39)
![](https://epubservercos.yuewen.com/E5E2EB/18096059808236406/epubprivate/OEBPS/Images/37792_79_01.jpg?sign=1739690575-1n1qvMtVrGbvI4k7mxlXKWb1NLVUHD4C-0-b351808f531428d51fd793683fdeef20)
图3-17