您的位置:首页 > 科技 > 能源 > 深圳网站建设网站优化服务_百度快照投诉中心官网_如何做网络推广人员_网页制作平台有哪些

深圳网站建设网站优化服务_百度快照投诉中心官网_如何做网络推广人员_网页制作平台有哪些

2024/11/17 4:33:23 来源:https://blog.csdn.net/qq_34041723/article/details/142172567  浏览:    关键词:深圳网站建设网站优化服务_百度快照投诉中心官网_如何做网络推广人员_网页制作平台有哪些
深圳网站建设网站优化服务_百度快照投诉中心官网_如何做网络推广人员_网页制作平台有哪些

Spring boot面向切面的编程

官方文档

https://docs.spring.io/spring-boot/reference/features/aop.html#page-title

aop默认的配置

aop默认的代理方式CGLib

spring.aop.proxy-target-class=true

启用JDK代理修改配置

To use JDK proxies instead, set configprop:spring.aop.proxy-target-class to false.

spring.aop.proxy-target-class=false

关于aop的开启配置

If AspectJ is on the classpath, Spring Boot’s auto-configuration will automatically enable AspectJ auto proxy such that @EnableAspectJAutoProxy is not required.

只要引入aspectjweaver就默认开启aop

项目准备

springboot

  • spring boot 3.3.3

  • Jdk17

添加依赖

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.22</version>
</dependency>

添加依赖后自动启用AspectJ

更多官方文档:https://docs.spring.io/spring-framework/reference/core/aop/ataspectj.html

编写配置类

package com.demo.springbootaop.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Aspect
@Order(1)
@Component
public class MyAspect {//切入点@Pointcut("execution(* com.demo.springbootaop.controller.*.*(..))")public void dsPointCut() {}/*** 通知类型* Around 环绕通知* Before 前置通知* AfterReturning 后置通知* AfterThrowing 异常通知* After 最终通知* */@Around("dsPointCut()")public Object around(ProceedingJoinPoint point) throws Throwable {System.out.println("环绕通知开始。。。。 ");Object proceed = point.proceed();System.out.println("环绕通知结束。。。。 ");return proceed;}
}

当有两个切面在同一个配置类里面时执行顺序

package com.demo.springbootaop.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Aspect
@Order(1)
@Component
public class MyAspect {//切入点/*** 如何匹配切入点* execution(返回值类型 包名.类名.方法名(参数))* 更多匹配类型参考官方文档:<a href="https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/pointcuts.html">...</a>*/@Pointcut("execution(* com.demo.springbootaop.controller.*.*(..))")public void dsPointCut() {}/*** 根据注解切入* "@Annotation(com.demo.springbootaop.annotation.MyAnnotation)"*/@Pointcut("(@within(org.springframework.web.bind.annotation.RestController))")public void pcAnnotation() {}/*** 通知类型* Around 环绕通知* Before 前置通知* AfterReturning 后置通知* AfterThrowing 异常通知* After 最终通知**/@Around("pcAnnotation()")public Object aroundRestController(ProceedingJoinPoint point) throws Throwable {System.out.println("RestController环绕通知开始。。。。 ");Object proceed = point.proceed();System.out.println("RestController环绕通知结束。。。。 ");return proceed;}@Around("dsPointCut()")public Object around(ProceedingJoinPoint point) throws Throwable {System.out.println("环绕通知开始。。。。 ");Object proceed = point.proceed();System.out.println("环绕通知结束。。。。 ");return proceed;}
}

执行结果

环绕通知开始。。。。 
RestController环绕通知开始。。。。 
RestController环绕通知结束。。。。 
环绕通知结束。。。。 

暂时不确定一个配置类里面多个切入点执行顺序是如何设定的

多个配置类

package com.demo.springbootaop.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Aspect
@Order(2)
@Component
public class MyAspect {/*** 如何匹配切入点* execution(返回值类型 包名.类名.方法名(参数))* 更多匹配类型参考官方文档:<a href="https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/pointcuts.html">...</a>*/@Pointcut("execution(* com.demo.springbootaop.controller.*.*(..))")public void dsPointCut() {}/*** 通知类型* Around 环绕通知* Before 前置通知* AfterReturning 后置通知* AfterThrowing 异常通知* After 最终通知**/@Around("dsPointCut()")public Object around(ProceedingJoinPoint point) throws Throwable {System.out.println("环绕通知开始。。。。 ");Object proceed = point.proceed();System.out.println("环绕通知结束。。。。 ");return proceed;}}
package com.demo.springbootaop.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Aspect
@Order(1)
@Component
public class MyAspect1 {//切入点/*** 根据注解切入* "@Annotation(com.demo.springbootaop.annotation.MyAnnotation)"*/@Pointcut("(@within(org.springframework.web.bind.annotation.RestController))")public void pcAnnotation() {}/*** 如何匹配切入点* execution(返回值类型 包名.类名.方法名(参数))* 更多匹配类型参考官方文档:<a href="https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/pointcuts.html">...</a>*//*** 通知类型* Around 环绕通知* Before 前置通知* AfterReturning 后置通知* AfterThrowing 异常通知* After 最终通知**/@Around("pcAnnotation()")public Object aroundRestController(ProceedingJoinPoint point) throws Throwable {System.out.println("RestController环绕通知开始。。。。 ");Object proceed = point.proceed();System.out.println("RestController环绕通知结束。。。。 ");return proceed;}
}

执行结果

RestController环绕通知开始。。。。 
环绕通知开始。。。。 
环绕通知结束。。。。 
RestController环绕通知结束。。。。

结论:

@Order(1)

值越小优先级越高

注意:环绕通知 先执行的后结束,后执行的先结束

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com