Spring AOP(三)--XML方式实现

本文介绍通过XML方式实现Spring AOP,在上一篇中已经介绍了通过注解+java配置的方式,这篇文章主要是看XML中怎么配置,直接上代码了:

一、创建一个连接点

1⃣️定义接口

注意⚠️:可以定义接口,也可以不定义,定义接口时使用jdk动态代理,不定义接口时使用cglib动态代理;

1 //定义一个接口
2 public interface CoderProjectService {
3     public void getProjectInfo(CoderProject coderProject);
4 }

2⃣️接口实现类

 1 //创建一个类来处理业务逻辑,作为要织入切面中的被代理对象
 2 public class CoderProjectServiceImpl implements CoderProjectService {
 3 
 4     @Override
 5     public void getProjectInfo(CoderProject coderProject) {
 6         System.out.println("项目名称:" + coderProject.getProjectName() + "--项目版本号:" + coderProject.getProjectVersion()
 7                 + "--项目描述:" + coderProject.getProjectDesc());
 8     }
 9 
10 }

因为我要配置引入功能,所以顺便定义要引入的接口及实现类

3⃣️创建引入接口

1 /*
2  * 定义一个新接口,用来做一些验证
3  */
4 public interface CheckExist {
5     public boolean checkIsEmpty(CoderProject project);
6 }

4⃣️引入接口实现类

 1 /*
 2  * 定义一个类,增加一些验证逻辑,对被代理对象逻辑进行增强或完善
 3  */
 4 public class CheckExistImp implements CheckExist {
 5 
 6     @Override
 7     public boolean checkIsEmpty(CoderProject project) {
 8         return project != null;
 9     }
10 
11 }

二、创建一个切面

 1 /*
 2  * 定义一个切面,没有任何注解,需要在XML中进行配置
 3  */
 4 public class XmlAspect {
 5 
 6     // 引入增强类
 7     public CheckExistImp checkExistImp;
 8 
 9     public void before(CoderProject pro) {
10         System.out.println("项目名称: " + pro.getProjectName() + "before...");
11     }
12 
13     public void around(ProceedingJoinPoint pjp) {
14         System.out.println("around before...");
15         try {
16             pjp.proceed();
17         } catch (Throwable e) {
18             e.printStackTrace();
19         }
20         System.out.println("around after...");
21     }
22 
23     public void after() {
24         System.out.println("after...");
25     }
26 
27     public void afterThrowing() {
28         System.out.println("afterThrowing...");
29     }
30 
31     public void afterReturning() {
32         System.out.println("afterReturning...");
33     }
34 }

这个切面就是一个简单的类,不过提供了四种通知的方法,并且前置通知含有参数,同时也将引入类作为属性添加进来,之前的所有注解都会在XML文件中配置。

三、配置spring-aop-xml.xml配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 5         http://www.springframework.org/schema/beans/spring-beans.xsd 
 6         http://www.springframework.org/schema/aop 
 7         http://www.springframework.org/schema/aop/spring-aop.xsd">
 8     <!--定义切面bean -->
 9     <bean id="xmlAspect" class="com.hyc.aop.xml.XmlAspect"></bean>
10     <!-- 定义被代理对象bean -->
11     <bean id="coderProjectService" class="com.hyc.aop.xml.CoderProjectServiceImpl"></bean>
12     <!-- 定义切面的配置:注解 -->
13     <aop:config>
14         <aop:aspect ref="xmlAspect">
15             <!--定义一个切点 -->
16             <aop:pointcut id="getProjectInfo"  expression="execution(* com.hyc.aop.xml.CoderProjectServiceImpl.getProjectInfo(..))" />
17             <!-- 定义四类通知-->
18             <aop:before method="before" pointcut="execution(* com.hyc.aop.xml.CoderProjectServiceImpl.getProjectInfo(..))  and args(pro))"/>
19             <aop:after method="after" pointcut-ref="getProjectInfo"/>
20             <aop:after-returning method="afterReturning" pointcut-ref="getProjectInfo"/>
21             <aop:after-throwing method="afterThrowing" pointcut-ref="getProjectInfo"/>
22             <!-- 定义环绕通知 -->
23             <aop:around method="around" pointcut-ref="getProjectInfo"/>
24             <!--定义增强类  -->
25             <aop:declare-parents types-matching="com.hyc.aop.xml.CoderProjectServiceImpl+" implement-interface="com.hyc.aop.xml.CheckExist" default-impl="com.hyc.aop.xml.CheckExistImp"/>
26         </aop:aspect>
27     </aop:config>
28     
29     <!-- 定义一个project bean,用来传给接入点方法 -->
30     <bean id="project" class="com.hyc.pojo.CoderProject">
31         <property name="id" value="1" />
32         <property name="projectName" value="云管理平台" />
33         <property name="projectVersion" value="V1.0" />
34         <property name="projectDesc" value="云存储管理平台" />
35     </bean>
36 </beans>

注意⚠️:在使用aop配置之前,要先引入相关的命名空间,如上面代码中的红色加粗部分。

其他的配置及含义都在注释中有接受,不再赘述;

四、创建测试方法

 1     @Test
 2     public void testAopByXml() {
 3         // 动态生成切面
 4         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring-aop-xml.xml");
 5         // 获取被代理对象
 6         CoderProjectService coderProjectService = (CoderProjectService) context.getBean("coderProjectService");
 7         // 获取项目类(参数)
 8         CoderProject project = (CoderProject) context.getBean("project");
 9         // 获取增强类(将被代理对象强制转化成增强类)
10         CheckExist cd = (CheckExist) coderProjectService;
11         if (cd.checkIsEmpty(project)) {
12             coderProjectService.getProjectInfo(project);
13         } else {
14             System.out.println("被代理对象不能为空");
15         }
16     }

测试结果如下:

1 项目名称: 云管理平台before...
2 around before...
3 项目名称:云管理平台--项目版本号:V1.0--项目描述:云存储管理平台
4 around after...
5 afterReturning...
6 after...

可以看到按照Sprinf AOP规定的流程执行了方法,但是就如在上一篇文章中提到的,使用XML方式时,around的before方法会在before方法之后执行。

其实从实现过程就能看出来,注解方式比XML要简单,因为XML要配置很多东西,而且容易出错,所以一般来说以注解为主,XML为辅。

转载于:https://www.cnblogs.com/hellowhy/p/9721258.html

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

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

相关文章

3.X内核下设备树–platform设备驱动

1。历史的车轮总是向前&#xff0c;技术更替。在linus 同学发出那句 WFK 后内核进入了设备树时代&#xff08;站在驱动工程师角度&#xff09;。 前几天我已经被mach-imx 中的文件折磨的夜不能眠。我终于在一个清晨&#xff0c;喝完一杯咖啡后决定放弃蹩脚的传统device描述方式…

六核cpu安装SQL Server 2005时报错,提示启动服务失败

2019独角兽企业重金招聘Python工程师标准>>> 新买的IBM3650M4的服务器上安装SQL server2005 安装到一半时&#xff0c;报"提示&#xff1a;SQL Server 服务无法启动。"错。 一开始以为是操作系统的问题&#xff0c;先重装了一遍&#xff0c;还是不行&…

postgis数据库优化_PostgreSQL批量导入性能优化

现在很多企业都将数据库逐渐由Mysql转向了更加强大而且开源的PostgreSQL数据库。在数据迁移过程中&#xff0c;PostgreSQL数据库导入大量数据时候非常缓慢&#xff0c;本文我们就来说说PostgreSQL数据库批量导入数据时的优化方法和策略。概述考虑PostgreSQL数据库批量导入数据时…

智能家居 (1) ——智能家居整体功能框架

目录 智能家居整体功能框架图硬件部分清单往期文章智能家居整体功能框架图 可作为大学生毕业设计内容,亦可作求职面试话术使用 使用的硬件平台:树莓派3B(型号),CortexA53(架构),博通BCM2837(芯片) 软件平台:Linux,内核版本3.14 本项目实现的功能是通过手机app、…

docker下交叉编译环境配置

为什么在docker中搭建开发环境&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之…

jparepository查询所有_JPA – JpaRepository 中使用的查询方法

默认方法User usernew User();userRepository.findAll();userRepository.findOne(1l);userRepository.save(user);userRepository.delete(user);userRepository.count();userRepository.exists(1l);自定义查询User findByUserName(String userName);也使用一些加一些关键字And、…

Spring jdbc 对象Mapper的简单封装

一般查询实体的时候&#xff0c;都需要这么使用/** * 根据id查询 * * return */ public Emp queryEmpById(Integer id) { String sql "select * from emp where empno ?"; ParameterizedRowMapper<Emp> mappe…

网络编程知识预备(1) ——了解OSI网络模型

参考&#xff1a;简单了解OSI网络模型 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-18 20:07:09 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114968802?spm1001.2014.3001.5502 根据需求摘抄自下面这篇文章&#xff0c;内容非常详…

完全内核移植–kernel3.15.3

目标平台 明远智睿 EK314 CPU I.MAX6Q内核版本 3.15.3编译器 arm-none-linux-gnueabi-gcc-4.8.3 1。下载纯净内核 2。配置Makefile 3。拷贝cp imx_v6_v7_defconfig .config 4。# make menuconfig 退出保存 5。#make zImage 进行第一次编译&#xff0c;看能否通过 6。修改…

antd表格显示分页怎么取消_真相!Word里怎么也删不掉的文档空白页原来是这样...

大家好&#xff0c;我是你们的海宝老师在Word里&#xff0c;经常会遇到这种情况&#xff1a;文档莫名其妙地多出一个或多个空白页&#xff0c;没啥内容却怎么也删不掉。不着急&#xff0c;咱们来一一分析。1、标题前的空白页像这种标题前面有空白&#xff0c;基本就是【段落】设…

ubuntu 搜狗安装搜狗输入法(fcitx)亲测有用

安装搜狗拼音输入法网上很多方法&#xff0c;总结了一下&#xff0c;下面的方法绝对可以&#xff0c;第一步&#xff1a;Ubuntu 默认是安装了ibus.所以删除它sudo apt-get remove ibus对于已经安装老版本的fcitx,删掉再装.sudo apt-get remove fcitx*删除依赖库sudo apt-get au…

网络编程知识预备(2) ——三次握手与四次挥手、流量控制(滑动窗口)、拥塞控制、半连接状态、2MSL

参考&#xff1a;浅显易懂的三次握手与四次挥手 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-19 09:33:20 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114990198?spm1001.2014.3001.5502 参考&#xff1a;&#xff08;四十七&…

面向对象2

python之路——面向对象进阶 阅读目录 isinstance和issubclass反射setattr  delattr  getattr  hasattr__str__和__repr____del__item系列__getitem__  __setitem__  __delitem____new____call____len____hash____eq__回到顶部isinstance和issubclass isinstance(obj…

linux命令deploy_linux命令:du 命令

Linux du命令也是查看使用空间的&#xff0c;但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看&#xff0c;还是和df命令有一些区别的.1&#xff0e;命令格式&#xff1a;du [选项][文件]2&#xff0e;命令功能&#xff1a;显示每个文件和目录的磁盘使用空…

DM9000网卡原理与基地址设置

从上面可以看出DM9000的地址总线就一根&#xff0c;它不像CS8900那样地址总线和数据总线都齐全。而这里只有一根地址线(CMD)&#xff0c;16跟数据线&#xff0c;所以可以确定位宽为16位&#xff0c;而地址线为什么只有一根&#xff0c;这是DM9000决定的&#xff0c;看手册可以知…

采购订单接收备注为必输项

应用 Oracle Inventory 层 Level Function 函数名 Funcgtion Name RCV_RCVRCERC 表单名 Form Name RCVRCERC 说明 Description 采购订单接收备注为必输项 条件 Condition 触发器事件 Tirgger Event WHEN-NEW-FORM-INSTANCE 触发器对象 Tirgger Object…

网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系

参考&#xff1a;SOCKET,TCP,HTTP之间的区别与联系 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-19 11:54:01 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/114992140?spm1001.2014.3001.5502 参考&#xff1a;TCP连接、Http连接与S…

debian 9 安装后的配置,debian 9 开发环境。

注意&#xff1a;以下命令用sudo或者以root用户进行 一.Xterm&#xff08;在安装KDE桌面情况下&#xff09;的配置&#xff08;可以黏贴&#xff0c;复制&#xff09;&#xff1a; 首先在根目录下编辑文件.Xresources(没有可以创建) rootdebian:~# vim ~/.Xresources rootdebi…

mysql 左连接 怎么走索引_mysql left join查询没走索引

SELECTt0.ID as id,t0.NAME as name,t0.PHONE as phone,t0.CITY_CODE as cityCode,t0.SHOOTING_TIME as shootingTime,t0.REMARK as remark,t0.SOURCE_FROM as sourceFrom,-- 平台来源t0.REFER as refer,t0.UPDATE_TIME as updateTime,CONCAT(IFNULL(t0.SHOOTING_NAME,),t1.SHO…

嵌入式RT3070 AP模式移植

环境&#xff1a;ubuntu1~14.04.3 编译器&#xff1a;arm-none-linux-gnueabi-gcc-4.8.3 无线网卡为RT3070&#xff0c;驱动分为STA驱动和SoftAP驱动两种&#xff0c;STA驱动支持无线网卡工作在STA模式下&#xff0c;而SoftAP的驱动支持无线网卡工作在软AP的模式下&#xff0…