Spring AOP(三)--XML方式实现
本文介绍通过XML方式实现Spring AOP,在上一篇中已经介绍了通过注解+java配置的方式,这篇文章主要是看XML中怎么配置,直接上代码了:
一、创建一个连接点
1⃣️定义接口
注意⚠️:可以定义接口,也可以不定义,定义接口时使用jdk动态代理,不定义接口时使用cglib动态代理;
//定义一个接口
public interface CoderProjectService {
public void getProjectInfo(CoderProject coderProject);
}
2⃣️接口实现类
//创建一个类来处理业务逻辑,作为要织入切面中的被代理对象
public class CoderProjectServiceImpl implements CoderProjectService { @Override
public void getProjectInfo(CoderProject coderProject) {
System.out.println("项目名称:" + coderProject.getProjectName() + "--项目版本号:" + coderProject.getProjectVersion()
+ "--项目描述:" + coderProject.getProjectDesc());
} }
因为我要配置引入功能,所以顺便定义要引入的接口及实现类
3⃣️创建引入接口
/*
* 定义一个新接口,用来做一些验证
*/
public interface CheckExist {
public boolean checkIsEmpty(CoderProject project);
}
4⃣️引入接口实现类
/*
* 定义一个类,增加一些验证逻辑,对被代理对象逻辑进行增强或完善
*/
public class CheckExistImp implements CheckExist { @Override
public boolean checkIsEmpty(CoderProject project) {
return project != null;
} }
二、创建一个切面
/*
* 定义一个切面,没有任何注解,需要在XML中进行配置
*/
public class XmlAspect { // 引入增强类
public CheckExistImp checkExistImp; public void before(CoderProject pro) {
System.out.println("项目名称: " + pro.getProjectName() + "before...");
} public void around(ProceedingJoinPoint pjp) {
System.out.println("around before...");
try {
pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("around after...");
} public void after() {
System.out.println("after...");
} public void afterThrowing() {
System.out.println("afterThrowing...");
} public void afterReturning() {
System.out.println("afterReturning...");
}
}
这个切面就是一个简单的类,不过提供了四种通知的方法,并且前置通知含有参数,同时也将引入类作为属性添加进来,之前的所有注解都会在XML文件中配置。
三、配置spring-aop-xml.xml配置文件
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--定义切面bean -->
<bean id="xmlAspect" class="com.hyc.aop.xml.XmlAspect"></bean>
<!-- 定义被代理对象bean -->
<bean id="coderProjectService" class="com.hyc.aop.xml.CoderProjectServiceImpl"></bean>
<!-- 定义切面的配置:注解 -->
<aop:config>
<aop:aspect ref="xmlAspect">
<!--定义一个切点 -->
<aop:pointcut id="getProjectInfo" expression="execution(* com.hyc.aop.xml.CoderProjectServiceImpl.getProjectInfo(..))" />
<!-- 定义四类通知-->
<aop:before method="before" pointcut="execution(* com.hyc.aop.xml.CoderProjectServiceImpl.getProjectInfo(..)) and args(pro))"/>
<aop:after method="after" pointcut-ref="getProjectInfo"/>
<aop:after-returning method="afterReturning" pointcut-ref="getProjectInfo"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="getProjectInfo"/>
<!-- 定义环绕通知 -->
<aop:around method="around" pointcut-ref="getProjectInfo"/>
<!--定义增强类 -->
<aop:declare-parents types-matching="com.hyc.aop.xml.CoderProjectServiceImpl+" implement-interface="com.hyc.aop.xml.CheckExist" default-impl="com.hyc.aop.xml.CheckExistImp"/>
</aop:aspect>
</aop:config> <!-- 定义一个project bean,用来传给接入点方法 -->
<bean id="project" class="com.hyc.pojo.CoderProject">
<property name="id" value="1" />
<property name="projectName" value="云管理平台" />
<property name="projectVersion" value="V1.0" />
<property name="projectDesc" value="云存储管理平台" />
</bean>
</beans>
注意⚠️:在使用aop配置之前,要先引入相关的命名空间,如上面代码中的红色加粗部分。
其他的配置及含义都在注释中有接受,不再赘述;
四、创建测试方法
@Test
public void testAopByXml() {
// 动态生成切面
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring-aop-xml.xml");
// 获取被代理对象
CoderProjectService coderProjectService = (CoderProjectService) context.getBean("coderProjectService");
// 获取项目类(参数)
CoderProject project = (CoderProject) context.getBean("project");
// 获取增强类(将被代理对象强制转化成增强类)
CheckExist cd = (CheckExist) coderProjectService;
if (cd.checkIsEmpty(project)) {
coderProjectService.getProjectInfo(project);
} else {
System.out.println("被代理对象不能为空");
}
}
测试结果如下:
项目名称: 云管理平台before...
around before...
项目名称:云管理平台--项目版本号:V1.0--项目描述:云存储管理平台
around after...
afterReturning...
after...
可以看到按照Sprinf AOP规定的流程执行了方法,但是就如在上一篇文章中提到的,使用XML方式时,around的before方法会在before方法之后执行。
其实从实现过程就能看出来,注解方式比XML要简单,因为XML要配置很多东西,而且容易出错,所以一般来说以注解为主,XML为辅。
Spring AOP(三)--XML方式实现的更多相关文章
- spring aop 使用xml方式的简单总结
spring aop的 xml的配置方式的简单实现: 1.编写自己的切面类:配置各个通知类型 /** * */ package com.lilin.maven.service.aop; import ...
- 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)
Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式 √ id:标识容器中的bean.id唯一. √ cl ...
- Spring AOP 不同配置方式产生的冲突问题
Spring AOP的原理是 JDK 动态代理和CGLIB字节码增强技术,前者需要被代理类实现相应接口,也只有接口中的方法可以被JDK动态代理技术所处理:后者实际上是生成一个子类,来覆盖被代理类,那么 ...
- 【Spring AOP】Spring AOP的使用方式【Q】
Spring AOP的三种使用方式 经典AOP使用方式 改进XML配置方式 基于注解的方式 第1种方式可以作为理解spring配置AOP的基础,是最原始的配置方式,也体现了spring处理的过程. 使 ...
- spring aop 使用注解方式总结
spring aop的注解方式:和xml的配置方式略有区别,详细如下: 1.首先还是建立需要的切面类:切面类里面定义好切点配置,以及所有的需要实现的通知方法. /** * */ package com ...
- spring-第十八篇之spring AOP基于XML配置文件的管理方式
1.在XML配置文件中配置切面.切入点.增强处理.spring-1.5之前只能使用XML Schema方式配置切面.切入点.增强处理. spring配置文件中,所有的切面.切入点.增强处理都必须定义在 ...
- 6.Spring【AOP】XML方式
1.AOP术语 1. Joinpoint(连接点):所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点 2. Pointcut(切入点):所谓切 ...
- Spring AOP 的实现方式(以日志管理为例)
一.AOP的概念 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充,流行的AOP框架有Sping AOP.Aspect ...
- 5.3 Spring5源码--Spring AOP使用接口方式实现
Spring 提供了很多的实现AOP的方式:Spring 接口方式,schema配置方式和注解. 本文重点介绍Spring使用接口方式实现AOP. 使用接口方式实现AOP以了解为目的. 更好地理解动态 ...
随机推荐
- react 组件的生命周期 超简版
组件从被创建到被销毁的过程称为组件的 生命周期: 通常,组件的生命周期可以被分为三个阶段:挂载阶段.更新阶段.卸载阶段: 一.挂载阶段 这个阶段组件被创建,执行初始化,并被挂载到DOM中,完成组件的第 ...
- iOS中消息的传递机制
本文中,会经常提及接收者[recipient]和发送者[sender].在消息传递机制中具体是什么意思,我们可以通过一个示例来解释:一个table view是发送者,而它的delegate就是接收者. ...
- 缓冲(cache)和缓存(buffer)
缓存: 指把常用数据存储到可以快速获取的区域,以备重复利用 一般叫做cache. 缓存能提高效率 缓冲: 是指在数据流转过程中,不同层次速度不一致时,利用缓冲区来缓解上下层之间速率问题(性能差异) 一 ...
- windows api(GDI)实现图片旋转
GDI实现图片旋转,博主在网上找了好多资料,都不太如意. 并且在尝试中发现,如果先用SetViewportOrgEx将HDC上的坐标原点移动到图片中心:再在HDC上的获取每个点,用三角函数进行变换,算 ...
- 2018-8-10-使用-ahk-让普通键盘变为Dvorak键盘
title author date CreateTime categories 使用 ahk 让普通键盘变为Dvorak键盘 lindexi 2018-08-10 19:16:51 +0800 201 ...
- bootstrap table 实现固定悬浮table 表头并可以水平滚动
在开发项目中,需要将表格头部固定,而且表格大多数情况下是会水平滚动的.项目的css框架是bootstrap 3,故也可以叫做bootstrap table. 需要实现的是:表格头部固定,并且支持水平滚 ...
- C++ AOP手法
1.代理模式 2.模版 3.NVI(non-virtual interface) 参考:https://www.cnblogs.com/qicosmos/p/4772389.html <effe ...
- Vim ---- 默认打开行号
Vim有非常迅速跳转到某一行行首的方法,例如 :n 或者 nG,n 表示到第 n 行. 但是Vim的显示行号功能默认是关闭的. 可用一下方法使Vim默认显示行号: 在配置文件 .vimrc 中,输入 ...
- swiper 插件里面嵌套可滚动内容
在移动端使用swiper的整屏滚动,如果slide里面有滚动内容的话,滚动的时候会整个页面一起滚动,如果想里面的滚动区域单独滚动的话,可以在初始化swiper的时候添加上 noSwipingClass ...
- Joomla - 部署(线上部署)
一.线上部署 线上部署可以理解为把本地网站迁移到线上,使用 akeeba backup 进行备份和迁移即可 参考 Joomla - akeeba backup(joomla网站备份.迁移扩展)的第三. ...