AOP的配置方式有2种方式:xml配置和AspectJ注解方式。今天我们就来实践一下xml配置方式。

我采用的jdk代理,所以首先将接口和实现类代码附上
package com.tgb.aop;
public interface UserManager {
public String findUserById(int userId);
}
package com.tgb.aop;
public class UserManagerImpl implements UserManager {
public String findUserById(int userId) {
System.out.println("---------UserManagerImpl.findUserById()--------");
if (userId <= 0) {
throw new IllegalArgumentException("该用户不存在!");
}
return "张三";
}
}
单独写一个Advice通知类进行测试。这个通知类可以换成安全性检测、日志管理等等。
package com.tgb.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* Advice通知类
* 测试after,before,around,throwing,returning Advice.
* @author Admin
*
*/
public class XMLAdvice {
/**
* 在核心业务执行前执行,不能阻止核心业务的调用。
* @param joinPoint
*/
private void doBefore(JoinPoint joinPoint) {
System.out.println("-----doBefore().invoke-----");
System.out.println(" 此处意在执行核心业务逻辑前,做一些安全性的判断等等");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doBefore()------");
}
/**
* 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
*
* 注意:当核心业务抛异常后,立即退出,转向After Advice
* 执行完毕After Advice,再转到Throwing Advice
* @param pjp
* @return
* @throws Throwable
*/
private Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("-----doAround().invoke-----");
System.out.println(" 此处可以做类似于Before Advice的事情");
//调用核心逻辑
Object retVal = pjp.proceed();
System.out.println(" 此处可以做类似于After Advice的事情");
System.out.println("-----End of doAround()------");
return retVal;
}
/**
* 核心业务逻辑退出后(包括正常执行结束和异常退出),执行此Advice
* @param joinPoint
*/
private void doAfter(JoinPoint joinPoint) {
System.out.println("-----doAfter().invoke-----");
System.out.println(" 此处意在执行核心业务逻辑之后,做一些日志记录操作等等");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doAfter()------");
}
/**
* 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行此Advice
* @param joinPoint
*/
private void doReturn(JoinPoint joinPoint) {
System.out.println("-----doReturn().invoke-----");
System.out.println(" 此处可以对返回值做进一步处理");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doReturn()------");
}
/**
* 核心业务逻辑调用异常退出后,执行此Advice,处理错误信息
* @param joinPoint
* @param ex
*/
private void doThrowing(JoinPoint joinPoint,Throwable ex) {
System.out.println("-----doThrowing().invoke-----");
System.out.println(" 错误信息:"+ex.getMessage());
System.out.println(" 此处意在执行核心业务逻辑出错时,捕获异常,并可做一些日志记录操作等等");
System.out.println(" 可通过joinPoint来获取所需要的内容");
System.out.println("-----End of doThrowing()------");
}
}
只有Advice还不行,还需要在application-config.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"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="userManager" class="com.tgb.aop.UserManagerImpl"/>
<!--<bean id="aspcejHandler" class="com.tgb.aop.AspceJAdvice"/>-->
<bean id="xmlHandler" class="com.tgb.aop.XMLAdvice" />
<aop:config>
<aop:aspect id="aspect" ref="xmlHandler">
<aop:pointcut id="pointUserMgr" expression="execution(* com.tgb.aop.*.find*(..))"/>
<aop:before method="doBefore" pointcut-ref="pointUserMgr"/>
<aop:after method="doAfter" pointcut-ref="pointUserMgr"/>
<aop:around method="doAround" pointcut-ref="pointUserMgr"/>
<aop:after-returning method="doReturn" pointcut-ref="pointUserMgr"/>
<aop:after-throwing method="doThrowing" throwing="ex" pointcut-ref="pointUserMgr"/>
</aop:aspect>
</aop:config>
</beans>
编一个客户端类进行测试一下:
package com.tgb.aop;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Client {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
//可以查找张三
userManager.findUserById(1);
System.out.println("=====我==是==分==割==线=====");
try {
// 查不到数据,会抛异常,异常会被AfterThrowingAdvice捕获
userManager.findUserById(0);
} catch (IllegalArgumentException e) {
}
}
}
结果如图:
值得注意的是Around与Before和After的执行顺序。3者的执行顺序取决于在xml中的配置顺序。图中标记了3块,分别对应Before,Around,After。其中②中包含有③。这是因为aop:after配置到了aop:around的前面,如果2者调换一下位置,这三块就会分开独立显示。如果配置顺序是aop:after -> aop:around ->aop:before,那么①和③都会包含在②中。这种情况的产生是由于Around的特殊性,它可以做类似于Before和After的操作。当安全性的判断不通过时,可以阻止核心业务逻辑的调用,这是Before做不到的。
使用xml可以对aop进行集中配置。很方便而简单。可以对所有的aop进行配置,当然也可以分开到单独的xml中进行配置。当需求变动时,不用修改代码,只要重新配置aop,就可以完成修改操作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# aop
# xml配置
# spring4
# xml
# Spring基于XML配置AOP详解
# Java_Spring之XML 的 AOP 配置
# Spring中基于XML的AOP配置详解
# Spring boot AOP通过XML配置文件声明的方法
# spring中aop的xml配置方法实例详解
# Spring使用AspectJ注解和XML配置实现AOP
# Spring 使用xml配置AOP的过程详解
# 可通过
# 所需要
# 类似于
# 以对
# 错误信息
# 返回值
# 的是
# 这是
# 就会
# 要在
# 转到
# 不存在
# 这种情况
# 它可以
# 如图
# 就来
# 这是因为
# 该用户
# 开到
# 很方便
相关文章:
如何在Windows 2008云服务器安全搭建网站?
网站代码制作软件有哪些,如何生成自己网站的代码?
制作网站的模板软件,网站怎么建设?
广州建站公司哪家好?十大优质服务商推荐
建站之星如何实现五合一智能建站与营销推广?
建站之星收费标准详解:套餐费用及年费价格表一览
如何通过宝塔面板实现本地网站访问?
建站之星代理商如何保障技术支持与售后服务?
行程制作网站有哪些,第三方机票电子行程单怎么开?
如何自定义建站之星网站的导航菜单样式?
Swift中循环语句中的转移语句 break 和 continue
开心动漫网站制作软件下载,十分开心动画为何停播?
如何在腾讯云服务器上快速搭建个人网站?
如何在阿里云通过域名搭建网站?
太原网站制作公司有哪些,网约车营运证查询官网?
建站主机如何安装配置?新手必看操作指南
如何在阿里云高效完成企业建站全流程?
如何快速搭建高效香港服务器网站?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何选择香港主机高效搭建外贸独立站?
如何批量查询域名的建站时间记录?
建站之星伪静态规则如何正确配置?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何挑选最适合建站的高性能VPS主机?
如何挑选高效建站主机与优质域名?
香港服务器WordPress建站指南:SEO优化与高效部署策略
定制建站策划方案_专业建站与网站建设方案一站式指南
Python多线程使用规范_线程安全解析【教程】
北京专业网站制作设计师招聘,北京白云观官方网站?
如何选择建站程序?包含哪些必备功能与类型?
高端网站建设与定制开发一站式解决方案 中企动力
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
制作农业网站的软件,比较好的农业网站推荐一下?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
中山网站推广排名,中山信息港登录入口?
网站制作公司排行榜,抖音怎样做个人官方网站
如何访问已购建站主机并解决登录问题?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何用VPS主机快速搭建个人网站?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
建站之星如何快速更换网站模板?
建站主机是否等同于虚拟主机?
利用JavaScript实现拖拽改变元素大小
香港服务器租用每月最低只需15元?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
高防服务器如何保障网站安全无虞?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
*请认真填写需求信息,我们会在24小时内与您取得联系。