Spring AOP官方文档学习笔记(三)之基于xml的Spring AOP

这篇具有很好参考价值的文章主要介绍了Spring AOP官方文档学习笔记(三)之基于xml的Spring AOP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.声明schema,导入命名空间

(1)如果我们想要使用基于xml的spring aop,那么,第一步,我们需要在xml配置文件中声明spring aop schema,导入命名空间,如下这是一个标准的模板

<?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 https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!-- //... -->

</beans>

(2)在xml配置文件中,所有的切面以及通知等都必须放置于<aop:config>标签内

2.声明一个切面

//定义一个切面类Logger,在其中声明一个前置通知
public class Logger {

    public void beforePrint() {
        System.out.println("before...");
    }
}

<!-- xml配置文件 -->
<beans ....>
    <!-- 将切面类注册为spring的一个bean -->
    <bean id="logger" class="cn.example.spring.boke.Logger"></bean>

    <aop:config>
        <!-- 使用<aop:aspect>标签,来定义一个切面,其中id的值需唯一,ref用来引用切面类 -->
        <aop:aspect id="aspect" ref="logger">
            <!-- 在<aop:aspect>标签内部,我们可以定义5种通知,在这里使用<aop:before>标签来定义一个前置通知,其中method指定通知方法,它只能是Logger这个切面类中的方法,pointcut指定切入点表达式 -->
            <aop:before method="beforePrint" pointcut="execution(* cn.example.spring.boke.ExampleA.*(..))"></aop:before>
        </aop:aspect>
    </aop:config>

</beans>

3.声明一个切入点

<beans ....>

    <bean id="logger" class="cn.example.spring.boke.Logger"></bean>

    <aop:config>
        <!-- 使用<aop:pointcut>标签来定义一个切入点,其中id的值唯一,expression即为切入点表达式 -->
        <!-- 之后,在通知标签内部,使用pointcut-ref来引用这个切入点 -->
        <aop:pointcut id="common" expression="execution(* cn.example.spring.boke.ExampleA.*(..))"/>

        <!-- 在基于xml的切入点表达式中 &&, || 以及 ! 分别被替换为了 and, or 与 not,如下面这个例子 -->
        <aop:pointcut id="mix" expression="execution(public * *(..)) and @args(org.springframework.stereotype.Component)"/>

        <aop:aspect id="aspect" ref="logger">
            <aop:before method="beforePrint" pointcut-ref="common"></aop:before>
        </aop:aspect>
    </aop:config>
</beans>

4.声明一个通知

//切面类
public class Logger {
    public void beforePrint() {
        System.out.println("before...");
    }

    public void afterReturningPrint(Object returnVal) {
        System.out.println(returnVal);
        System.out.println("afterReturning...");
    }

    public void afterThrowingPrint(Throwable throwable) {
        System.out.println(throwable);
        System.out.println("afterThrowing...");
    }

    public void afterPrint() {
        System.out.println("after...");
    }

    public void aroundPrint(ProceedingJoinPoint joinPoint) {
        try {
            System.out.println("before...");
            joinPoint.proceed();
            System.out.println("after...");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        } finally {
            System.out.println("finally...");
        }
    }
}

<aop:config>
    <aop:pointcut id="common" expression="execution(* cn.example.spring.boke.ExampleA.*(..))"/>

    <aop:aspect id="aspect" ref="logger">
        <!-- 使用<aop:before>声明前置通知 -->
        <aop:before method="beforePrint" pointcut-ref="common"></aop:before>

        <!-- 使用<aop:after-returning>声明返回通知,其中使用returning属性来声明获取切入点执行后的返回值,与前面基于注解的示例相同 -->
        <aop:after-returning method="afterReturningPrint" pointcut-ref="common" returning="returnVal"></aop:after-returning>

        <!-- 使用<aop:after-throwing>声明异常通知,其中使用throwing属性来声明获取切入点执行异常后所抛出的异常,与前面基于注解的示例相同 -->
        <aop:after-throwing method="afterThrowingPrint" pointcut-ref="common" throwing="throwable"></aop:after-throwing>

        <!-- 使用<aop:after>声明后置通知 -->
        <aop:after method="afterPrint" pointcut-ref="common"></aop:after>
  
        <!-- 使用<aop:around>声明环绕通知,具体的注意事项与前面基于注解的示例相同 -->
        <aop:around method="aroundPrint" pointcut-ref="common"></aop:around>
    </aop:aspect>
</aop:config>

5.优先级

<beans ....>

    <bean id="logger" class="cn.example.spring.boke.Logger"></bean>

    <bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>

    <aop:config>
        <aop:pointcut id="common" expression="execution(* cn.example.spring.boke.ExampleA.*(..))"/>
        <!-- 可使用<aop:aspect/>标签中的order属性来声明不同切面类的优先级 -->
        <aop:aspect id="aspect" ref="logger" order="1">
            <!-- 在同一切面类中,不同切面的优先级与切面声明的顺序有关,如下由于<aop:before/>标签声明于<aop:around/>标签之前,因此before的优先级高于around -->
            <aop:before method="beforePrint" pointcut-ref="common"></aop:before>

            <aop:around method="aroundPrint" pointcut-ref="common"></aop:around>
        </aop:aspect>
    </aop:config>

</beans>

6.声明一个引介

public class ExampleA{

}

//希望向ExampleA中添加方法doSomething()
public interface Extention {
    void doSomething();
}

//doSomething()方法默认的实现
public class ExtentionImpl implements Extention{

    @Override
    public void doSomething() {
        System.out.println("doSomething...");
    }
}

<beans ....>

    <bean id="logger" class="cn.example.spring.boke.Logger"></bean>

    <bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>

    <aop:config>

        <aop:aspect id="aspect" ref="logger">
            <!-- 在<aop:aspect/>标签中,使用<aop:declare-parents/>标签便可声明一个引介,其中types-matching属性值对应@DeclareParents注解中的value属性值,default-impl属性值对应@DeclareParents注解中的defaultImpl属性值,implement-interface表明父类型,与基于注解的配置一致 -->
            <aop:declare-parents types-matching="cn.example.spring.boke.*" implement-interface="cn.example.spring.boke.Extention" default-impl="cn.example.spring.boke.ExtentionImpl"></aop:declare-parents>
        </aop:aspect>
    </aop:config>

</beans>

//使用引介,与基于注解的配置一致
Extention exampleA = (Extention)ctx.getBean("exampleA");

7.Advisors

(1) 除了使用<aop:aspect/>标签外,我们还可以使用<aop:advisor/>标签来声明一个切面,不过使用<aop:advisor/>时,其所指向的bean必须要实现对应的Advice接口,如下文章来源地址https://www.toymoban.com/news/detail-433247.html

//若要定义前置通知,则必须实现MethodBeforeAdvice接口,其他相应的通知也有对应的接口
public class Logger implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("advisor before...");
    }
}

<beans ....>

    <bean id="logger" class="cn.example.spring.boke.Logger"></bean>

    <bean id="exampleA" class="cn.example.spring.boke.ExampleA"></bean>

    <aop:config>
        <aop:pointcut id="common" expression="execution(* cn.example.spring.boke.ExampleA.*(..))"/>
        <!-- 使用<aop:advisor/>标签来定义一个切面,与前面的<aop:aspect/>标签相比,不需要在其内部声明具体的通知标签了,在底层原理上,<aop:advisor/>与<aop:aspect/>是相似的,只是<aop:advisor/>的使用方式变了而已,且该标签一般专用于事物管理上 -->
        <aop:advisor advice-ref="logger" pointcut-ref="common"></aop:advisor>
    </aop:config>

</beans>

到了这里,关于Spring AOP官方文档学习笔记(三)之基于xml的Spring AOP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring MVC官方文档学习笔记(二)之DispatcherServlet

    1.DispatcherServlet入门 (1) Spring MVC是以前端控制器模式(即围绕着一个中央的Servelt, DispatcherServlet)进行设计的,这个DispatcherServlet为请求的处理提供了一个共用的算法,即它都会将实际的请求处理工作委托给那些可配置的组件进行执行,说白了,DispatcherServlet的作用就是进行统一调度,并

    2024年02月07日
    浏览(82)
  • Spring MVC官方文档学习笔记(一)之Web入门

    注: 该章节主要为原创内容,为后续的Spring MVC内容做一个先行铺垫 1.Servlet的构建使用 (1) 选择Maven - webapp来构建一个web应用 (2) 构建好后,打开pom.xml文件,一要注意打包方式为war包,二导入servlet依赖,如下 (3) 替换webapp/WEB-INF/web.xml文件为如下内容,采用Servlet 3.1版本 (4) 在

    2024年02月03日
    浏览(43)
  • ros2官方文档(基于humble版本)学习笔记

    由于市面上专门讲ROS 2开发的书籍不多,近期看完了《ROS机器人开发实践》其中大部分内容还是基于ROS 1写的,涉及topic,service,action等一些重要的概念,常用组件,建模与仿真,应用(机器视觉,机器语音,SLAM,机械臂),最后一章写了ROS 2的安装,话题通信和服务通信的示

    2024年02月11日
    浏览(42)
  • ROS 2官方文档(基于humble版本)学习笔记(二)

    今天继续总结CLI 工具章的学习 理解节点(node) ROS 2图是一个ROS 2元件同时处理数据的网络,如果将它们全部映射并可视化它们,则包括所有可执行文件以及它们之间的连接。 ROS中的每个节点(node)都应该只为了单个的、模块化的目的而设计的,例如控制车轮电动机或从激光

    2024年02月10日
    浏览(44)
  • 12、Spring之基于xml的AOP

    阅读本文前,建议先阅读Spring之基于注解的AOP 创建名为spring_aop_xml的新module,过程参考9.1节 12.2.1.1、定义前置通知的功能 12.2.1.2、配置前置通知到切面 12.2.1.3、测试使用效果 由控制台日志可知,切面类的前置通知(方法),通过切入点表达式,作用到了目标方法的连接点上

    2024年02月12日
    浏览(40)
  • 机器人强化学习环境mujoco官方文档学习记录(一)——XML

    鉴于研究生课题需要,开始在mujoco中配置仿真环境。而官方文档中各种对象参数纷繁复杂,且涉及mujoco底层计算,不便于初学者进行开发设计。因此本文将MJCF模型的常用对象参数进行总结。 本文档仅供学习参考,如有问题欢迎大家学习交流。 本章是MuJoCo中使用的MJCF建模语言

    2024年02月02日
    浏览(57)
  • 【Spring进阶系列丨第九篇】基于XML的面向切面编程(AOP)详解

    1.1.1、beans.xml中添加aop的约束 1.1.2、定义Bean ​ 问题:我们上面的案例经过测试发现确实在调用业务方法之前增加了日志功能,但是问题是仅仅能针对某一个业务方法进行增强,而我们的业务方法又有可能有很多,所以显然一个一个的去配置很麻烦,如何更加灵活的去配置呢

    2024年04月18日
    浏览(55)
  • 学习笔记-elstaciElasticSearch7.17官方文档

    特征 适用于所有 Elasticsearch API 的强类型请求和响应。 所有 API 的阻塞和异步版本。 在创建复杂的嵌套结构时,使用流畅的构建器和功能模式允许编写简洁但可读的代码。 通过使用对象映射器(例如 Jackson 或任何 JSON-B 实现)无缝集成应用程序类。 将协议处理委托给一个 h

    2024年02月14日
    浏览(47)
  • Flink|《Flink 官方文档 - 部署 - 概览》学习笔记

    学习文档:《Flink 官方文档 - 部署 - 概览》 学习笔记如下: 上图展示了 Flink 集群的各个构建(building blocks)。通常来说: 客户端获取 Flink 应用程序代码,将其转换为 JobGraph,并提交给 JobManager JobManager 将工作分配给 TaskManager,并在那里执行实际的算子操作 在部署 Flink 时,

    2024年01月19日
    浏览(55)
  • Spring学习笔记(四)AOP介绍

            AOP的全称是Aspect Oriented Programming,即 面向切面编程 。和OOP(面向对象编程)不同,AOP主张将程序中相同的业务逻辑进行 横向隔离 ,并将重复的业务逻辑抽取到一个独立的模块中,以达到 提高程序可重用性和开发效率的目的 。                在传统的业务处理代

    2024年02月21日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包