相关推荐recommended
【Spring篇】详解AOP相关知识
作者:mmseoamin日期:2023-12-05

🎊专栏【Spring】

🍔喜欢的诗句:天行健,君子以自强不息。

🎆音乐分享【如愿】

🎄欢迎并且感谢大家指出小吉的问题🥰

文章目录

  • 🌺AOP简介
  • 🌺AOP作用
  • 🌺AOP核心概念
  • 🎄AOP入门案例
    • 🛸报错解决
      • 🏳️‍🌈方法一
      • 🏳️‍🌈方法二
      • 🎈结果
      • 🌺AOP切入点表达式
        • ⭐使用通配符加速配置
        • ⭐书写技巧
        • 🎍AOP通知类型

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第1张

          AOP(面向切面编程)是Spring框架中的重要组成部分。它允许在不修改原代码的情况下为程序动态地添加新的功能。如果你也想提高Spring应用的可扩展性,本文将带你深入学习Spring AOP的核心概念。

          我们将讲解AOP的作用、实现方式和关键组成部分,包括切面、通知、切入点等。并使用注解的方式实现一个简单的切面示例,让你快速了解AOP的基本用法。学完本文你将能够在Spring项目中应用AOP思想,解耦业务代码,轻松实现新的功能需求。让我们开始AOP之旅!

          🌺AOP简介

          AOP(Aspect-Oriented Programming)是面向切面编程的一种编程范式,指导开发者如何组织程序结构。它提供了一种将横切关注点(例如日志记录、性能统计、安全检查等)与业务逻辑分离的方法。

          在传统的面向对象编程中,业务逻辑通常分散在多个对象或方法中。而使用AOP,我们可以通过定义切面(Aspect)来将这些横切关注点集中起来,并将其应用到多个对象或方法上。

          切面是一个跨越多个类和方法的模块化单元,它定义了横切关注点和相应的行为。在程序运行时,AOP框架会根据切面的定义,动态地将其织入到目标对象或方法中,从而实现横切关注点的功能增强。

          🌺AOP作用

          在不影响原始设计的基础上进行功能增强

          (原代码不用改,功能就变强了)

          🌺AOP核心概念

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第2张

          【Spring篇】详解AOP相关知识,请添加图片描述,第3张

          切面描述的是 通知的共性功能 与 对应的 切入点 的关系,在 哪个切入点 上 执行哪些通知

          🎄AOP入门案例

          项目结构

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第4张

          在pom.xml文件中导入依赖

          
              
                org.springframework
                spring-context
                5.2.10.RELEASE
              
              
                org.aspectj
                aspectjweaver
                1.9.3
              
            
          

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第5张

          🛸报错解决

          这里可能会报错

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第6张

          🏳️‍🌈方法一

          切换版本号

          🏳️‍🌈方法二

          这个问题困扰了我很长时间,如何看报错,是无法访问maven的中心仓库,就考虑是maven镜像没有使用上

          然后打开设置,发现果然是这个问题

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第7张

          切换为下面的配置,问题就解决了

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第8张

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第9张

          创建BookDaoimpl类

          package com.example.dao.impl;
          import com.example.dao.BookDao;
          import org.springframework.stereotype.Repository;
          @Repository
          public class BookDaoimpl implements BookDao {
              public void save(){
                  System.out.println(System.currentTimeMillis());
                  System.out.println("book dao save ...");
              }
              public void update(){
                  System.out.println("book dao update ...");
              }
          }
          

          创建BookDao接口

          package com.example.dao;
          public interface BookDao {
              public void update();
              void save();
          }
          

          创建MyAdvice类

          在里面写入共性功能

          public void method(){
                  System.out.println(System.currentTimeMillis());
              }
          

          在里面写入切入点

          private void pt(){}
          

          MyAdvice.java

          package com.example.aop;
          import org.aspectj.lang.annotation.Aspect;
          import org.aspectj.lang.annotation.Before;
          import org.aspectj.lang.annotation.Pointcut;
          import org.springframework.stereotype.Component;
          @Component  //读到是一个bean
          @Aspect     //告诉你去识别下面的内容
          public class MyAdvice {
          //    切入点(“执行(方法)”)
              @Pointcut("execution(void com.example.dao.BookDao.update())")  //定义切入点
              private void pt(){}                                            //定义切入点
              @Before("pt()")           //绑定切入点和通知
              public void method(){
                  System.out.println(System.currentTimeMillis());
              } //定义通知
          }
          

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第10张

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第11张

          创建SpringConfig类

          package com.example.config;
          import org.springframework.context.annotation.ComponentScan;
          import org.springframework.context.annotation.Configuration;
          import org.springframework.context.annotation.EnableAspectJAutoProxy;
          @Configuration
          @ComponentScan("com.example")
          @EnableAspectJAutoProxy  //告诉程序我们要使用注解开发aop 去识别MyAdvice里面的 @Aspect
          public class SpringConfig {
          }
          

          创建App类

          package com.example;
          import com.example.config.SpringConfig;
          import com.example.dao.BookDao;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.annotation.AnnotationConfigApplicationContext;
          public class App {
              public static void main(String[] args) {
                  ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class);
                  BookDao bookDao=ctx.getBean(BookDao.class);
                  bookDao.save();
              }
          }
          

          🎈结果

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第12张

          【Spring篇】详解AOP相关知识,在这里插入图片描述,第13张

          🌺AOP切入点表达式

          • 切入点:要进行增强的方法
          • 切入点表达式:要进行增强的方法的描述方式

            【Spring篇】详解AOP相关知识,请添加图片描述,第14张

            ⭐使用通配符加速配置

            【Spring篇】详解AOP相关知识,请添加图片描述,第15张

            我们修改一下MyAdvice的代码,使用通配符表达式来写

            【Spring篇】详解AOP相关知识,在这里插入图片描述,第16张

            【Spring篇】详解AOP相关知识,在这里插入图片描述,第17张

            ⭐书写技巧

            【Spring篇】详解AOP相关知识,请添加图片描述,第18张

            🎍AOP通知类型

            【Spring篇】详解AOP相关知识,请添加图片描述,第19张

            【Spring篇】详解AOP相关知识,请添加图片描述,第20张

            AOP为我们提供了一种实现横向功能的clean方法,可以减少代码重复,降低模块间耦合。但它的使用需要我们思考非函数性需求的抽象与封装。在接下来的Spring学习中,我们还会看到AOP在事务管理等方面的典型应用。

            本文只是AOP入门,实际应用中我们还需要学习更多知识,如AspectJ的使用、AOP性能优化等。如果你有任何疑问或想法,欢迎在评论区与我互动。让我们携手学习AOP,Build更优秀的Spring应用程序!

            【Spring篇】详解AOP相关知识,在这里插入图片描述,第21张