【编程不良人】快速入门Spring学习笔记06---AOP

本文详细介绍了Spring的AOP(面向切面编程)概念,包括通知类型、切入点、切面的创建和配置。通过实例展示了前置通知、环绕通知、后置通知和异常通知的使用,并探讨了切入点表达式的灵活性。最后总结了IOC和AOP在Spring框架中的重要性。

配套视频:【编程不良人】快速入门Spring,SpringBoot、SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili

5.1 基本概念

AOP(Aspect Oriented Programming)编程:即 面向切面编程

其中:Aspect(切面)、Oriented(面向)、Programming(编程)

底层原理:java代理设计模式(动态代理)

好处:在保证原始业务逻辑不变的情况下,通过代理对象完成业务中的附加操作(如事务等),将业务中核心操作放在目标对象中执行,实现了附加操作和核心操作解耦。

基本概念

  • 通知(Advice):除了目标方法之外的操作都可以称之为通知,可理解为附加操作、额外功能,比如:事务通知、日志通知、性能通知......

  • 切入点(Pointcut):将开发好的通知应用于项目中的哪些组件中的哪些方法,给方法加入通知,一般通知多用于业务层,例如:UserService

  • 切面(Aspect)=通知(Advice)+切入点(Pointcut)

 AOP面向切面编程实现可分为如下几步:

  1. 开发通知类(附加功能)---新建通知

  2. 配置切面点---指定通知位置

  3. 利用通知和切入点组装切面,对通知和切入点进行绑定

5.2 编程步骤

配套视频:【编程不良人】快速入门Spring,SpringBoot、SpringCloud学不好完全是因为Spring没有掌握!_哔哩哔哩_bilibili

  # 1.引入AOP编程相关依赖
       spring-aop
       spring-expression
       spring-aspects
  ​
  # 2.开发通知类
       MethodBeforeAdvice      前置通知
       MethodInterceptor       环绕通知
       AfterReturningAdvice    后置通知 / 返回后通知
       ThrowsAdvice            异常通知
        
       MyAdvice implements  通知接口{.....}
        
      //自定义通知类:用来完成额外功能
      //自定义记录业务方法名称前置通知,前置通知即目标方法执行之前先执行的额外操作
      public class MyAdvice  implements MethodBeforeAdvice {
          @Override
          //参数1:当前调用的方法对象    
          //参数2:当前调用方法对象的参数  
          //参数3:目标对象
          public void before(Method method, Object[] args, Object target) throws Throwable {
              System.out.println("目标方法名: "+method.getName());
              System.out.println("目标方法的参数: "+args[0]);
              System.out.println("目标对象: "+target.getClass());
          }
      }
  # 3.配置切面
       a.引入aop命名空间
         <?xml version="1.0" encoding="UTF-8"?>
         <beans xmlns="http://www.springframework.org/schema/beans"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xmlns:aop="http://www.springframework.org/schema/aop"
                xsi:schemaLocation="http://www.springframework.org/schema/beans    
                                    http://www.springframework.org/schema/beans/spring-beans.xsd 
                                    http://www.springframework.org/schema/aop                                                                 http://www.springframework.org/schema/aop/spring-aop.xsd">
       b.注册通知类
           <!--注册通知类-->
           <bean id="myAdvice" class="before.MyAdvice"/>
       c.配置/组装切面 aspect = advice + pointcut
          <!--组装切面-->
          <aop:config>
              <!--配置切入点pointcut
                  id:切入点在工厂中的唯一标识
                  expression:用来指定切入项目中哪些组件中哪些方法 execution(返回值 包名.类名.方法名(参数))
                                                                      *表示任意、所有
              -->
              <aop:pointcut id="pc" expression="execution(* aop.UserServiceImpl.*(..))"/>
              <!--配置切面 advice-ref:工厂中通知id   pointcut-ref:工厂切入点唯一标识-->
              <aop:advisor advice-ref="myAdvice" pointcut-ref="pc"/>
          </aop:config>
  ​
  # 4.启动工厂测试
          ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("aop/spring.xml");
          UserService userSerivce = (UserService) context.getBean("userService");
          System.out.println(userSerivce.getClass());
          //代理对象
          userSerivce.save("小黑");

5.3 前置通知使用

EmpService.java

  
  package aop;
  ​
  /**
   * @ClassName EmpService
   * @Description 接口
   * @Author Jiangnan Cui
   * @Date 2022/4/4 18:36
   * @Version 1.0
   */
  public interface EmpService {
      void save(String name);
      String find(String name);
  }

EmpServiceImpl.java

  
  package aop;
  ​
  /**
   * @ClassName EmpServiceImpl
   * @Description EmpService实现类 原始业务对象 / 目标对象
   * @Author Jiangnan Cui
   * @Date 2022/4/4 18:37
   * @Version 1.0
   */
  public class EmpServiceImpl implements EmpService{
      @Override
      public void save(String name) {
          System.out.println("处理业务逻辑saveDao!" + name);
      }
  ​
      @Override
      public String find(String name) {
          System.out.println("处理业务逻辑findDAO!" + name);
          return name;
      }
  }

MyBeforeAdvice.java自定义前置通知

  package aop;
  ​
  import org.springframework.aop.MethodBeforeAdvice;
  ​
  import java.lang.reflect.Method;
  ​
  /**
   * @ClassName MyBeforeAdvice
   * @Description 自定义记录业务方法名称的前置通知
   * @Author Jiangnan Cui
   * @Date 2022/4/4 18:46
   * @Version 1.0
   */
  public class MyBeforeAdvice implements MethodBeforeAdvice {
      @Override
      //参数1:method表示当前执
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值