基于xml配置的AOP

目录

xml方式AOP快速入门

xml方式AOP配置详解


xml方式AOP快速入门

xml方式配置AOP的步骤

  1. 导入AOP相关坐标
XML 复制代码
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.13</version>
    </dependency>

2.准备目标类,准备增强类,并配置给Spring管理

3.配置切点表达式(哪些方法被增强)

4.配置织入(切点被哪些通知方法增强,是前置增强还是后置增强)

XML 复制代码
    <aop:config>
<!--        配置切入点  目的是指定哪些方法增强-->
        <aop:pointcut id="myPointCut1" expression="execution(void com.hsf.service.Impl.UserServiceImpl.show01())"/>
<!--        配置织入 目的是要执行哪些切入点与通知结合-->
        <aop:aspect ref="advice">
<!--          配置前置增强  -->
            <aop:before method="beforeAdvice" pointcut-ref="myPointCut1"></aop:before>
        </aop:aspect>

    </aop:config>
xml方式AOP配置详解

切点表达式的配置方式

XML 复制代码
<aop:config>
<!--        配置切入点  目的是指定哪些方法增强-->
        <aop:pointcut id="myPointCut1" expression="execution(void com.hsf.service.Impl.UserServiceImpl.show01())"/>
<!--        配置织入 目的是要执行哪些切入点与通知结合-->
        <aop:aspect ref="advice">
<!--          配置前置增强  -->
            <aop:before method="beforeAdvice" pointcut-ref="myPointCut1"></aop:before>
        </aop:aspect>

    </aop:config>
XML 复制代码
<aop:before method="beforeAdvice" pointcut="execution(void com.hsf.service.Impl.UserServiceImpl.show01())"></aop:before>

切点表达式的配置语法

  • 访问修饰符可以省略不写

  • 返回值类型,某一级包名,类名,方法名可以使用*表示所有

  • 包名与类名之间使用单点,表示该包下面的类,使用双点..表示该包及其子包下的类

  • 参数列表可以使用两个点..表示任意参数

通知的类型

XML 复制代码
        <aop:aspect ref="advice">
<!--          配置前置增强  -->
            <aop:before method="beforeAdvice" pointcut="execution(void com.hsf.service.Impl.UserServiceImpl.show01())"></aop:before>
            <aop:after-throwing method="error" pointcut-ref="myPointCut1"></aop:after-throwing>
            <aop:after-returning method="afterAdvice" pointcut="execution(void com.hsf.service.Impl.UserServiceImpl.show01())"></aop:after-returning>
            <aop:around method="arround" pointcut-ref="myPointCut1"></aop:around>
            <aop:after method="nessccrsy" pointcut-ref="myPointCut1"></aop:after>
        </aop:aspect>
java 复制代码
    public Object arround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕前通知");
        Object res = proceedingJoinPoint.proceed();
        System.out.println("环绕后通知");
        return  res;
    }
java 复制代码
    public void beforeAdvice(JoinPoint joinPoint){
        System.out.println(joinPoint.getTarget());
        System.out.println("前置的增强");
    }
XML 复制代码
      <aop:after-throwing method="error" pointcut-ref="myPointCut1" throwing="e"></aop:after-throwing>
  • AOP的配置的两种方式

    • 使用<advisor>配置切面

    • 使用<aspect>配置切面

    Spring定义了一个Advice接口,实现该接口的类都可以作为通知类出现

XML 复制代码
<aop:advisor advice-ref="myadvice2" pointcut-ref="myPointCut1"></aop:advisor>
java 复制代码
package com.hsf.advice;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;


import java.lang.reflect.Method;

public class Myadvice2 implements MethodBeforeAdvice, AfterReturningAdvice, MethodInterceptor {
//前置增强
  @Override
  public void before(Method method, Object[] objects, Object o) throws Throwable {
      System.out.println("before>>>>>");
}
//后置增强
    @Override
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println("after>>>>");
    }
//环绕通知
   @Override
   public Object invoke(MethodInvocation methodInvocation) throws Throwable {
       System.out.println("环绕前通知方法");
       Object res = methodInvocation.getMethod().invoke(methodInvocation.getThis(), methodInvocation.getArguments());
       System.out.println("环绕后通知方法");
       return res;
}
}

advisor与aspect的不同点:

语法形式不同:

  • advisor是通过实现接口来确认通知的类型

  • aspect是通过配置确认通知的类型,更加灵活

可配置的切面数量不同

  • 一个advisor只能配置一个固定通知和一个切点表达式

  • 一个aspect可以配置多个通知和多个切点表达式任意组合

使用场景不同:

  • 允许随意搭配情况下可以使用ascpect进行配置

  • 如果通知类型单一,切面单一的情况下可以使用advisor进行配置

  • 在通知类型已经固定,不用人为指定通知类型时,可以使用advisor进行配置

相关推荐
小坏讲微服务7 小时前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发
老鼠只爱大米8 小时前
Java设计模式之外观模式(Facade)详解
java·设计模式·外观模式·facade·java设计模式
vx_dmxq2118 小时前
【微信小程序学习交流平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·微信小程序·小程序·idea
9号达人8 小时前
优惠系统演进:从"实时结算"到"所见即所得",前端传参真的鸡肋吗?
java·后端·面试
AAA简单玩转程序设计8 小时前
Java进阶小妙招:ArrayList和LinkedList的"相爱相杀"
java
lkbhua莱克瓦248 小时前
集合进阶8——Stream流
java·开发语言·笔记·github·stream流·学习方法·集合
20岁30年经验的码农8 小时前
Java Elasticsearch 实战指南
java·开发语言·elasticsearch
okseekw8 小时前
Java 中的注释与关键字的初步学习
java
luv_sw8 小时前
JavaSE-面向对象-构造器
java
okseekw8 小时前
Java 中的类型转换:结合实战代码深入解析
java