• 【Spring】使用xml配置AOP


    1.前言

    在之前的学习中,都是使用注解的方式进行AOP的配置.其实使用xml配置文件也可以配置AOP.

    2.xml配置AOP

    xml配置AOP方法如下:

    1. 添加相关依赖

      <dependencies>
          <dependency>
              <groupId>org.springframeworkgroupId>
              <artifactId>spring-contextartifactId>
              <version>5.3.29version>
          dependency>
          <dependency>
              <groupId>org.aspectjgroupId>
              <artifactId>aspectjweaverartifactId>
              <version>1.9.7version>
          dependency>
      dependencies>    
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    2. 相关bean放到Spring容器中

      @Service
      public class StudentService {
      
          public void insert(){
              System.out.println("StudentService中的insert方法");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    3. 创建切面类注入到Spring中,我这里使用的是@Component注解,也可以在配置文件中使用Bean标签

      @Component
      public class Aspect {
          @Pointcut("execution(* com.example.service..*.*(..)")
          public void pt(){
              System.out.println("");
          }
          public void methodBefore(JoinPoint joinPoint){
              Object[] args = joinPoint.getArgs();
              Object target = joinPoint.getTarget();
              MethodSignature signature = (MethodSignature) joinPoint.getSignature();
      
              System.out.println("Before");
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    4. 在配置文件中开启组件扫描(因为我在将相应的Bean注入到Spring中时,使用的是注解,如果使用Bean标签,这一步可以省略)

      <context:component-scan base-package="com.example">
      context:component-scan>
      
      • 1
      • 2
    5. 在配置文件中配置AOP,将切面类(StudentService)中的methodBefore方法设置为前置通知

          <aop:config>
              
              <aop:pointcut id="pt" expression="execution(* com.example.service..*.*(..))"/>
      
              
              <aop:aspect ref="aspect">
                  
                  
                  <aop:before method="methodBefore" pointcut="com.example.aspect.Aspect.pt()"/>
              aop:aspect>
          aop:config>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      配置通知类型中有两种写法,一种是用pointcut-ref属性,值是定义切面时的id,另一种是使用pointcut属性,需要指定切点方法的全类名

    运行结果:
    在这里插入图片描述
    可以看到成功将StudentService中的methodBefore方法设置为前置通知了

    接下来讲一下复杂的通知如何配置,如下:

    @AfterReturning(value = "point()",returning = "ret")
    public void methodAfterReturning(JoinPoint joinPoint, Object ret){
    	// 方法体
    }
    @AfterThrowing(value = "point()",throwing = "e")
    public void methodAfterThrowing(JoinPoint joinPoint,Throwable e){
    	// 方法体
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    @AfterReturning和@AfterThrowing是有两个参数的

    以@AfterReturning为例,在切面类中添加对应的普通方法:

    @Component
    public class Aspect {
        @Pointcut("execution(* com.example.service..*.*(..))")
        public void pt(){
            System.out.println("");
        }
        public void methodBefore(JoinPoint joinPoint){
            Object[] args = joinPoint.getArgs();
            Object target = joinPoint.getTarget();
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    
            System.out.println("Before");
        }    
        public void methodAfterReturning(JoinPoint joinPoint, Object ret){
            System.out.println("AfterReturning: "+ ret);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    <aop:aspect ref="aspect">
        
        
        <aop:before method="methodBefore" pointcut="com.example.aspect.Aspect.pt()"/>
        <aop:after-returning method="methodAfterReturning" pointcut-ref="pt" returning="ret"/>
    aop:aspect>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    需要注意在设置AOP时,标签中有returning这样一个属性

    运行结果:

    在这里插入图片描述

    3. 总结

    xml配置AOP的重要步骤:

    1. 定义切面类,定义切点.
    2. 将目标类和切面类添加到Spring容器中(注解或Bean标签),如果是注解方式,需要添加组件扫描
    3. 在配置文件中配置AOP

    在实际开发中,用注解配置AOP比较多,xml配置AOP了解即可

  • 相关阅读:
    外汇天眼:SEC起诉“现金流之王”播客主持人涉嫌1100万美元庞氏骗局
    380个python日常库(爬虫、图文、音视频、机器学习、PDF、Office等等)
    docker网络模式、资源控制
    三分钟使用ngrok实现内网穿透
    python对RabbitMQ的简单使用
    自动驾驶,是“平视”还是“俯视”?
    Redis之五大基础数据结构深入、应用场景
    Discourse 的关闭主题(Close Topic )和重新开放主题
    车载毫米波雷达行业发展5——企业
    Docker部署homeassitant
  • 原文地址:https://blog.csdn.net/m0_63463510/article/details/134540500