ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring框架 - AOP(三) >> 基于 XML 的 AOP 开发

2021-01-28 12:57:19  阅读:24  来源: 互联网

标签:XML aop Spring AOP 切点 通知 返回值 execution public


1.基于 XML 的 AOP 开发

1.1 快速入门

①导入 AOP 相关坐标
< !-- 导入spring的context坐标,context依赖aop – >
在这里插入图片描述

②创建目标接口和目标类(内部有切点)

public interface TargetInterface {
    public void method();
}

public class Target implements TargetInterface {
    @Override
    public void method() {
        System.out.println("Target running....");
    }
}

③创建切面类(内部有增强方法)

public class MyAspect {
    //前置增强方法
    public void before(){
        System.out.println("前置代码增强.....");
    }
}

④将目标类和切面类的对象创建权交给 spring

<!--配置目标类-->
<bean id="target" class="com.itheima.aop.Target"></bean>
<!--配置切面类-->
<bean id="myAspect" class="com.itheima.aop.MyAspect"></bean>

⑤在 applicationContext.xml 中配置织入关系
导入aop命名空间

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

配置切点表达式和前置增强的织入关系

  • method是指在切面类中配置的增强方法的名字。
    在这里插入图片描述

⑥测试代码
在这里插入图片描述
⑦测试结果
在这里插入图片描述

1.2 XML 配置 AOP 详解

1.切点表达式的写法

表达式语法:

execution([修饰符] 返回值类型 包名.类名.方法名(参数))
  • 访问修饰符可以省略

  • 返回值类型、包名、类名、方法名可以使用星号* 代表任意
    (被增强方法的返回值类型)

  • 包名与类名之间一个点 . 代表当前包下的类,两个点 … 表示当前包及其子包下的类

  • 参数列表可以使用两个点 … 表示任意个数,任意类型的参数列表

例如:

execution(public void com.itheima.aop.Target.method())	
execution(void com.itheima.aop.Target.*(..))
execution(* com.itheima.aop.*.*(..))
execution(* com.itheima.aop..*.*(..))
execution(* *..*.*(..))

2.通知的类型

通知的配置语法:

<aop:通知类型 method=“切面类中方法名” pointcut=“切点表达式"></aop:通知类型>

在这里插入图片描述
around环绕方法的写法:
在这里插入图片描述

3.切点表达式的抽取

当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用 pointcut-ref 属性代替 pointcut 属性来引用抽取后的切点表达式。

<aop:config>
    <!--引用myAspect的Bean为切面对象-->
    <aop:aspect ref="myAspect">
        <aop:pointcut id="myPointcut" expression="execution(* com.itheima.aop.*.*(..))"/>
        <aop:before method="before" pointcut-ref="myPointcut"></aop:before>
    </aop:aspect>
</aop:config>

1.3 知识要点

aop织入的配置

<aop:config>
    <aop:aspect ref=“切面类”>
        <aop:before method=“通知方法名称” pointcut=“切点表达式"></aop:before>
    </aop:aspect>
</aop:config>

通知的类型:前置通知、后置通知、环绕通知、异常抛出通知、最终通知

切点表达式的写法:

execution([修饰符] 返回值类型 包名.类名.方法名(参数))

2.环绕通知方法的写法和理解

在目标方法执行之前和之后都可以执行额外代码的通知。

在环绕通知中必须显式的调用目标方法,否则目标方法不会执行。

这个显式调用是通过ProceedingJoinPoint来实现的,可以在环绕通知中接收一个此类型的形参,spring容器会自动将该对象传入,这个参数必须处在环绕通知的第一个形参位置。

ProceedingJoinPoint是JoinPoint的子类,要注意,只有环绕通知可以接收ProceedingJoinPoint,而其他通知只能接收JoinPoint。

配置方式:
在这里插入图片描述

环绕通知需要返回返回值,否则真正调用者将拿不到返回值,只能得到一个null。

环绕通知有以下能力

控制目标方法是否执行
目标方法执行之前或之后执行额外代码
控制是否返回返回值
改变返回值
环绕通知虽然有这样的能力,但一定要慎用(因为在里面可以修改方法的返回值等信息),要小心不要破坏了软件分层的“高内聚 低耦合”的目标。

坏绕通知方法解释转载于:https://blog.csdn.net/qq_32224047/article/details/107144542?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

标签:XML,aop,Spring,AOP,切点,通知,返回值,execution,public
来源: https://blog.csdn.net/qq_44785877/article/details/113283279

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有