小言_互联网的博客

[SpringBoot] AOP-AspectJ 切面技术

297人阅读  评论(0)

 ✨✨个人主页:沫洺的主页

 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

💖💖如果文章对你有所帮助请留下三连✨✨

🍭AspectJ简介

  1. 它不属于spring;

  2. AspectJ是一个AOP的框架;

  3. 定义了AOP语法;

  4. 有一个专门的编译器用来生成遵守Java字节编码规范的Class文件

🍢什么是AspectJ 

  • AspectJ是使用面向切面的一个框架
  • 它扩展了Java语言(它本身也是一种语言)
  • 支持原生Java代码 有自己的编译器
  • 将代码翻译成Java字节码文件
  • 是为了方便编写AOP代码而出现的
  • 使用AOP编程的三个重点 通知 切点 织入

🍡实现AOP的方式

🍬原生使用切面

添加AOP坐标


   
  1. <dependency>
  2. <groupId>org.springframework.boot </groupId>
  3. <artifactId>spring-boot-starter-aop </artifactId>
  4. </dependency>

创建增强类MyAOP

对service层下的所有类的所有方法进行增强


   
  1. @Component
  2. @Aspect
  3. public class MyAOP {
  4. //定义切点
  5. @Pointcut("execution(* com.moming.service.*.*(..))")
  6. public void point (){}
  7. @Before("point()")
  8. public void before (){
  9. System.out.println( "===>前置通知");
  10. }
  11. @After("point()")
  12. public void after (){
  13. System.out.println( "===>后置通知");
  14. }
  15. @Around("point()")
  16. public Object arround (ProceedingJoinPoint pjp) throws Throwable {
  17. System.out.println( "===>环绕前");
  18. Object resules = pjp.proceed();
  19. System.out.println( "===>环绕后");
  20. return resules;
  21. }
  22. @AfterReturning(value = "point()",returning = "ret")
  23. public void returning (JoinPoint jp, String ret){
  24. Object[] args = jp.getArgs();
  25. System.out.println( "返回后通知获取参数: "+Arrays.toString(args));
  26. System.out.println( "===>返回后通知,返回值: "+ret);
  27. }
  28. @AfterThrowing("point()")
  29. public void throwing (){
  30. System.out.println( "===>异常通知");
  31. }
  32. }

service/OrderService


   
  1. @Service
  2. public class OrderService {
  3. public String order (int id){
  4. System.out.println( "===>目标方法:订单业务ID:"+id);
  5. return "001202210121010";
  6. }
  7. }

启动类测试


   
  1. @SpringBootApplication
  2. public class App2 {
  3. public static void main (String[] args) {
  4. ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
  5. OrderService bean = context.getBean(OrderService.class);
  6. System.out.println(bean.order( 1));
  7. }
  8. }

无异常时

有异常时,后续代码就不再执行了

补充配置说明


   
  1. //两种占位符
  2. //* 代表的是一个单词,b* 代表的是以b开头的单词。 例如 bds
  3. //.. 通配符 ,代表的是0个或者多个匹配项

🍫通过注解使用切面 

声明注解NeedCut


   
  1. @Documented
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Target({ElementType.TYPE,ElementType.METHOD})
  4. public @interface NeedCut {
  5. }

切换注解


   
  1. @Component
  2. @Aspect
  3. public class MyAOP {
  4. //定义切点
  5. @Pointcut("@annotation(com.moming.annotation.NeedCut)")
  6. public void point (){}
  7. @Before("point()")
  8. public void before (){
  9. System.out.println( "===>前置通知");
  10. }
  11. @After("point()")
  12. public void after (){
  13. System.out.println( "===>后置通知");
  14. }
  15. @Around("point()")
  16. public Object arround (ProceedingJoinPoint pjp) throws Throwable {
  17. System.out.println( "===>环绕前");
  18. Object resules = pjp.proceed();
  19. System.out.println( "===>环绕后");
  20. return resules;
  21. }
  22. @AfterReturning(value = "point()",returning = "ret")
  23. public void returning (JoinPoint jp, String ret){
  24. Object[] args = jp.getArgs();
  25. System.out.println( "返回后通知获取参数: "+Arrays.toString(args));
  26. System.out.println( "===>返回后通知,返回值: "+ret);
  27. }
  28. @AfterThrowing("point()")
  29. public void throwing (){
  30. System.out.println( "===>异常通知");
  31. }
  32. }

使用注解@NeedCut


   
  1. @Service
  2. public class OrderService {
  3. @NeedCut
  4. public String order (int id){
  5. System.out.println( "===>目标方法:订单业务ID:"+id);
  6. return "001202210121010";
  7. }
  8. public void add (){
  9. System.out.println( "===>添加订单");
  10. }
  11. }

测试


   
  1. @SpringBootApplication
  2. public class App2 {
  3. public static void main (String[] args) {
  4. ConfigurableApplicationContext context = SpringApplication.run(App2.class, args);
  5. OrderService bean = context.getBean(OrderService.class);
  6. System.out.println(bean.order( 01));
  7. System.out.println( "-------------------");
  8. bean.add();
  9. }
  10. }

使用@NeedCut注解的方法才进行增强


转载:https://blog.csdn.net/HeyVIrBbox/article/details/127525756
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场