五、Spring AOP面向切面编程(基于XML方式实现)

本章概要

  • Spring AOP基于XML方式实现(了解)
  • Spring AOP对获取Bean的影响理解
    • 根据类型装配 bean
    • 使用总结

5.6 Spring AOP基于XML方式实现(了解)

  1. 准备工作
  • 加入依赖
<!-- spring-aspects会帮我们传递过来aspectjweaver -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>6.0.6</version>
</dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.0.6</version>
</dependency>
  • 准备代码

把测试基于注解功能时的Java类复制到新module中,去除所有注解。(本专栏的上一篇文章)

  1. 配置Spring配置文件
<!-- 配置目标类的bean -->
<bean id="calculatorPure" class="com.atguigu.aop.imp.CalculatorPureImpl"/><!-- 配置切面类的bean -->
<bean id="logAspect" class="com.atguigu.aop.aspect.LogAspect"/><!-- 配置AOP -->
<aop:config><!-- 配置切入点表达式 --><aop:pointcut id="logPointCut" expression="execution(* *..*.*(..))"/><!-- aop:aspect标签:配置切面 --><!-- ref属性:关联切面类的bean --><aop:aspect ref="logAspect"><!-- aop:before标签:配置前置通知 --><!-- method属性:指定前置通知的方法名 --><!-- pointcut-ref属性:引用切入点表达式 --><aop:before method="printLogBeforeCore" pointcut-ref="logPointCut"/><!-- aop:after-returning标签:配置返回通知 --><!-- returning属性:指定通知方法中用来接收目标方法返回值的参数名 --><aop:after-returningmethod="printLogAfterCoreSuccess"pointcut-ref="logPointCut"returning="targetMethodReturnValue"/><!-- aop:after-throwing标签:配置异常通知 --><!-- throwing属性:指定通知方法中用来接收目标方法抛出异常的异常对象的参数名 --><aop:after-throwingmethod="printLogAfterCoreException"pointcut-ref="logPointCut"throwing="targetMethodException"/><!-- aop:after标签:配置后置通知 --><aop:after method="printLogCoreFinallyEnd" pointcut-ref="logPointCut"/><!-- aop:around标签:配置环绕通知 --><!--<aop:around method="……" pointcut-ref="logPointCut"/>--></aop:aspect></aop:config>
  1. 测试
@SpringJUnitConfig(locations = "classpath:spring-aop.xml")
public class AopTest {@Autowiredprivate Calculator calculator;@Testpublic void testCalculator(){System.out.println(calculator);calculator.add(1,1);}
}

5.7 Spring AOP对获取Bean的影响理解

5.7.1 根据类型装配 bean

  1. 情景一
    • bean 对应的类没有实现任何接口
    • 根据 bean 本身的类型获取 bean
      • 测试:IOC容器中同类型的 bean 只有一个正常获取到 IOC 容器中的那个 bean 对象
      • 测试:IOC 容器中同类型的 bean 有多个会抛出 NoUniqueBeanDefinitionException 异常,表示 IOC 容器中这个类型的 bean 有多个
  2. 情景二
    • bean 对应的类实现了接口,这个接口也只有这一个实现类
      • 测试:根据接口类型获取 bean
      • 测试:根据类获取 bean
      • 结论:上面两种情况其实都能够正常获取到 bean,而且是同一个对象
  3. 情景三
    • 声明一个接口
    • 接口有多个实现类
    • 接口所有实现类都放入 IOC 容器
      • 测试:根据接口类型获取 bean会抛出 NoUniqueBeanDefinitionException 异常,表示 IOC 容器中这个类型的 bean 有多个
      • 测试:根据类获取bean正常
  4. 情景四
    • 声明一个接口
    • 接口有一个实现类
    • 创建一个切面类,对上面接口的实现类应用通知
      • 测试:根据接口类型获取bean正常
      • 测试:根据类获取bean无法获取原因分析:
    • 应用了切面后,真正放在IOC容器中的是代理类的对象
    • 目标类并没有被放到IOC容器中,所以根据目标类的类型从IOC容器中是找不到的

在这里插入图片描述

  1. 情景五
    • 声明一个类
    • 创建一个切面类,对上面的类应用通知
      • 测试:根据类获取 bean,能获取到

在这里插入图片描述

debug查看实际类型:

在这里插入图片描述

5.7.2 使用总结
  • 对实现了接口的类应用切面

在这里插入图片描述

  • 对没实现接口的类应用切面new

在这里插入图片描述

  • 如果使用AOP技术,目标类有接口,必须使用接口类型接收IoC容器中代理组件!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/337969.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代理IP连接不上/网速过慢?如何应对?

当您使用代理时&#xff0c;您可能会遇到不同的代理错误代码显示代理IP连不通、访问失败、网速过慢等种种问题。 在本文中中&#xff0c;我们将讨论您在使用代理IP时可能遇到的常见错误、发生这些错误的原因以及解决方法。 一、常见代理服务器错误 当您尝试访问网站时&#…

10个最容易被忽视的 FastAPI 实用功能

FastAPI是一种现代、高性能的Python Web框架&#xff0c;用于构建Web应用程序和API。 它基于Python的异步编程库asyncio和await语法&#xff0c;以及类型注解和自动文档生成等特性&#xff0c;提供了快速、易用和可靠的开发体验&#xff0c;接下来本文将介绍10项被忽视的FastA…

Qt/QML编程学习之心得:hicar手机投屏到车机中控的实现(32)

hicar,是华为推出的一款手机APP,有百度地图、华为音乐,更多应用中还有很多对应手机上装在的其他APP,都可以在这个里面打开使用,对开车的司机非常友好。但它不仅仅是用在手机上,它还可以投屏到车机中控上,这是比较神奇的一点。 HiCar本质上是一套智能投屏系统,理论上所有…

React Native 桥接原生常量

一、编写并注册原生常量方法 在 SmallDaysAppModule 这个模块中有一个方法 getConstans &#xff0c;重载这个方法就可将自定义的常量返回&#xff0c;系统会自行调用该方法并返回定义的常量将其直接注入到 JS 层&#xff0c;在 JS 层直接获取即可。 二、JS 层获取原生常量&am…

Vulnhub靶机:Corrosion1

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;corrosion:1&#xff08;10.0.2.12&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/c…

MongoDB快速实战与基本原理

MongoDB 介绍 什么是 MongoDB MongoDB 是一个文档数据库&#xff08;以 JSON 为数据模型&#xff09;&#xff0c;由 C 语言编写&#xff0c;旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。文档来自于“JSON Document”&#xff0c;并非我们一般理解的 PDF、WORD 文档…

构建数字化美食未来:深入了解连锁餐饮系统的技术实现

在当今数字化时代&#xff0c;连锁餐饮系统的设计与开发已成为餐饮业成功经营的重要一环。本文将深入研究连锁餐饮系统的技术实现&#xff0c;结合代码演示&#xff0c;为技术开发者和餐饮业者提供深刻的理解。 1. 技术选型与系统架构 在开始设计开发前&#xff0c;首先要考…

您的计算机已被.LIVE勒索病毒感染?恢复您的数据的方法在这里!

引言&#xff1a; 在数字时代&#xff0c;.LIVE勒索病毒如暗夜中的黑暗调&#xff0c;威胁着个人和企业的数字安全。本文将深入介绍.LIVE勒索病毒的特征&#xff0c;提供解密数据的方法&#xff0c;并讨论预防措施&#xff0c;让我们共同筑起数字世界的防护之墙。数据的重要性…

【MYSQL】MYSQL 的学习教程(十一)之 MySQL 不同隔离级别,都使用了哪些锁

聊聊不同隔离级别下&#xff0c;都会使用哪些锁&#xff1f; 1. MySQL 锁机制 对于 MySQL 来说&#xff0c;如果只支持串行访问的话&#xff0c;那么其效率会非常低。因此&#xff0c;为了提高数据库的运行效率&#xff0c;MySQL 需要支持并发访问。而在并发访问的情况下&…

CMU15-445-Spring-2023-Project #2 - B+Tree

前置知识&#xff1a;参考上一篇博文 CMU15-445-Spring-2023-Project #2 - 前置知识&#xff08;lec07-010&#xff09; CHECKPOINT #1 Task #1 - BTree Pages 实现三个page class来存储B树的数据。 BTree Page internal page和leaf page继承的基类&#xff0c;只包含两个…

软件测试|好用的pycharm插件推荐(五)——Translation

前言 在我们的日常工作中&#xff0c;经常会遇到需要查看各个第三方库源码的问题&#xff0c;在很多情况下&#xff0c;我们的英语能力不能够满足我们完全读懂源码&#xff0c;所以我们就需要借助翻译工具来帮助我们理解第三方库的源码&#xff0c;如果我们将源码复制再使用其…

使用Vivado Design Suite平台板、将IP目录与平台板流一起使用

使用Vivado Design Suite平台板流 Vivado设计套件允许您使用AMD目标设计平台板&#xff08;TDP&#xff09;创建项目&#xff0c;或者已经添加到板库的用户指定板。当您选择特定板&#xff0c;Vivado设计工具显示有关板的信息&#xff0c;并启用其他设计器作为IP定制的一部分以…