`

实现Spring AOP 应用的几种方式(转载)

阅读更多
转载地址:http://blog.csdn.net/mawujun1234/archive/2008/04/22/2314190.aspx

spring开发aop应用有三种方法:

一:Spring 1.2版本中通过ProxyFactoryBean来实现aop,即通过动态代理来实现的,Aspect必须继承MethodBeforeAdvice,MethodAfterAdvice等

<!--被代理的对象-->

<bean id="man" class="Man">
<property name="name">
<value type="java.lang.String">张三</value>
</property>
</bean>

<!--继承了MethodBeforeAdvice类的 Aspect->
<bean id="fbi" class="FBI" />

<bean id="civilian"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref bean="man" />
</property>

<property name="interceptorNames">
<list>
<value>fbi</value>
</list>
</property>
</bean>

二:Spring 2.0 AOP 应用

需要改的是FBI 这个类,而且它也不需要再实现某些接口了

public class FBI {
public void before(JoinPoint point){
Man man = (Man)point.getTarget();
System.err.println("FBI 发现" + man.getName() + "正在进行 " +
point.getSignature().getName() + " 活动。");
}
}

注意这个类里面的方法 before(JoinPoint),方法名可以是任意的,可以带一个JoinPoint 类
型的参数,也可以不带参数直接写成before(),但是这个连接点(JoinPoint)对象带来了所
有和这次方法调用有关的信息,包括方法参数,目标对象等等,所以一般要做日志记录的话
会带上它。
接下来是测试类的代码,和以前的几乎没有任何不同,只不过现在直接访问的是man
这个bean。

<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-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="fbi" class="FBI" />
<bean id="man" class="Man">
<property name="name">
<value type="java.lang.String">张三</value>
</property>
</bean>
<aop:config>
<aop:pointcut id="manPointcut"
expression="execution(* Man.*(..))" />
<aop:aspect id="beforeExample" ref="fbi">
<aop:before pointcut-ref="manPointcut" method="before" />
</aop:aspect>
</aop:config>
</beans>

1. 配置文件的开头加入了aop 命名空间,如代码中粗斜体所示。
2. 使用aop:config 标签来定义AOP,不是使用ProxyFactoryBean 来定义一个新的
bean。

一个是人的对象,另
一个则是联邦调查局的探员。而aop:config 中定义了所有的AOP 设置信息。aop:pointcut
定义了一个切入点,id 给出了这个切入点的唯一名字,而expression 定义了切入点的表达
式,那么这个定义到底表示了什么信息呢?它的意思是表示一种场景,即执行(execution)
Man 对象的所有方法的这种情况,这就是表达式execution(* Man.*(..))的意义所在,
Man.*(..)表示Man 类的所有方法。接下来呢,需要定义一个切面,用aop:aspect 来定义,
它的ref 属性指定了这个切面所对应的bean 定义的id,这里指向fbi 这个bean 类;子标签
aop:before 则指示了当发生了名为manPointcut 的切入点(情况)前(用pointcut-ref 属性
指定,pointcut-ref=”manPointcut”),就调用名为before 的方法,这个方法位于aspect 里
面的引用的那个bean 中,这里是fbi(即ref=”fbi”)。其实Spring 执行到这里后,会自动的
把这些代码翻译成底层的Bean 定义(后台依然会采用ProxyFactoryBean 这样的机制),
然后把对应的获取bean 的操作直接委托给代理类,这就是为什么上文提到的测试类只需要
访问原来的man 这个bean,对应的拦截类就会被执行的原因。从这里看到Spring 2.0 中要
定义一个AOP 的bean 类,仍然是比较复杂的,XML 文件和概念都增加了很多,需要读者
慢慢来学习和理解。

三使用标注(@AspectJ)实现AOP

的一个库来做切点(pointcut)解析和匹配。
为了在Spring 配置中使用@AspectJ aspects,你必须首先启用Spring 对基于@AspectJ
aspects 的配置支持,自动代理(autoproxying)基于通知是否来自这些切面。 自动代理是
指Spring 会判断一个bean 是否使用了一个或多个切面通知,并据此自动生成相应的代理
以拦截其方法调用,并且确认通知是否如期进行。
通过在你的Spring 的配置文件中引入下列元素来启用Spring 对@AspectJ 的支持:
<aop:aspectj-autoproxy/>
也可以通过在你的application context 中添加如下定义来启用@AspectJ 支持:
<bean
class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyC
reator" />
你需要在你的应用程序的classpath 中引入两个AspectJ 库:aspectjweaver.jar 和
aspectjrt.jar。我们这里用的MyEclipse,在添加Spring 开发功能时已经自动的加入了这些
类库文件,无需手工配置了。
定义切面Aspect:在启用@AspectJ 支持的情况下,在application context 中定义的任意带有一个@Aspect 切面(拥有@Aspect 标注)的bean 都将被Spring 自动识别并用于
配置在Spring AOP。
定义切入点Pointcut:现在通过在 @AspectJ 标注风格的 AOP 中,一个切入点签名
通过一个普通的方法定义来提供,并且切入点表达式使用 @Pointcut 标注来表示(作为切
入点签名的方法必须返回 void 类型)。代码可以参考清单10.12。
好了,引用了这么些文档,我们需要介绍这个基于标注的新的AOP项目了,这个项目
的名字是Spring2_0AOPAspectJ,如前一节所示加入了Spring核心和AOP类库后,就可以
开发了。那么相比较10.4.1 使用aop 标签实现AOP一节,这一个项目的代码仅仅有两个地
方要改。首先我们要修改FBI类的源码,加入标注来实现切面和切入点定义,如下所示:
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
/**
* 联邦调查局的探员将您的所有行动都记录在案。
* @author BeanSoft
*/
@Aspect
public class FBI {
@Before("execution(* Man.*(..))")
public void before(JoinPoint point){
Man man = (Man)point.getTarget();
System.err.println("FBI 发现" + man.getName() + "正在进行 " +
point.getSignature().getName() + " 活动。");
}
}
清单10.12 加入了Aspect 标注的FBI 类
这个类中的@Before 后面的"execution(* Man.*(..))"是切入点所对应的切入点点表达式,其意
义和上一节的是一致的,仍然表示的是执行 Man 类的所有方法时将触发此方法的执行。
使用了这种写法后,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/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<aop:aspectj-autoproxy/><bean id="fbi" class="FBI" />
<bean id="man" class="Man">
<property name="name">
<value type="java.lang.String">张三</value>
</property>
</bean>
</beans>

1. 加入了粗斜体的<aop:aspectj-autoproxy/>定义;
2. 去掉了<aop:config>标签部分。
可以看到使用这种方式后,AOP 的开发和配置变的极其简单。这就是JDK 1.5 引入标注开
发后带来的好处。当然弱点嘛,那就是要修改配置必须重新编译源代码了。
注意:在这里你不能去掉<bean id="fbi" class="FBI" />这一个bean的定义,否
则自动AOP代理对象就没有机会被创建并工作了,那样的话man对象被代理也就无从谈起
了。

四开发环绕通知(Around Advice)AOP 应用

@Aspect
public class FBI {
@Around("execution(* Man.*(..))")
public Object before(ProceedingJoinPoint point) throws Throwable {
Man man = (Man)point.getTarget();
System.err.println("FBI 发现" + man.getName() + "即将正在进行 " +
point.getSignature().getName() + " 活动。");
// 禁止张三泡MM
if(point.getSignature().getName().equals("mm")) {
System.err.println("FBI 将阻止 " + man.getName() + " 泡MM。");
} else if(point.getSignature().getName().equals("sayHelp")) {
System.err.println("FBI 将欺骗 " + man.getName() + " 的朋友告
诉他们他很好。");
return "我是 " + man.getName() + " ,我现在过的很好。";
} else {Object object = point.proceed();
System.err.println("FBI 发现" + man.getName() + "已经完成了 " +
point.getSignature().getName() + " 活动。");
return object;
}
return null;
}
}

现在张三不光是不能泡MM 了,当他求救的时候,FBI 还可以直接拦截并修改,将其请求的
信息“救我,我是张三!”改成“我是张三,我现在过的很好。”,这样通过欺骗行为,张三
的朋友永远也不知道发生了什么事。

/**
* 具有聊QQ和泡MM以及求救三个行为的人对象,还有一个用户名属性。
* @author BeanSoft
*/
public class Man {
private String name;
public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
public void qq() {
System.out.println("我在聊QQ");
}
public void mm() {
System.out.println("我在泡MM");
}
public String sayHelp() {
return "救我,我是" + getName();
}
}
分享到:
评论

相关推荐

    Spring-Security-3应用的11个步骤.docx

    Spring Security 还提供了一种表达式语言,允许在配置中定义访问规则,实现对Web和方法访问的灵活控制。 **配置Spring Security:** 配置过程通常涉及以下几个步骤: 1. **Web.xml配置** - 配置Spring Security的...

    springmybatis

    下面对这几个配置文件解释下: 1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 ...

    《数据结构》(02331)基础概念

    内容概要:本文档《数据结构》(02331)第一章主要介绍数据结构的基础概念,涵盖数据与数据元素的定义及其特性,详细阐述了数据结构的三大要素:逻辑结构、存储结构和数据运算。逻辑结构分为线性结构(如线性表、栈、队列)、树形结构(涉及根节点、父节点、子节点等术语)和其他结构。存储结构对比了顺序存储和链式存储的特点,包括访问方式、插入删除操作的时间复杂度以及空间分配方式,并介绍了索引存储和散列存储的概念。最后讲解了抽象数据类型(ADT)的定义及其组成部分,并探讨了算法分析中的时间复杂度计算方法。 适合人群:计算机相关专业学生或初学者,对数据结构有一定兴趣并希望系统学习其基础知识的人群。 使用场景及目标:①理解数据结构的基本概念,掌握逻辑结构和存储结构的区别与联系;②熟悉不同存储方式的特点及应用场景;③学会分析简单算法的时间复杂度,为后续深入学习打下坚实基础。 阅读建议:本章节内容较为理论化,建议结合实际案例进行理解,尤其是对于逻辑结构和存储结构的理解要深入到具体的应用场景中,同时可以尝试编写一些简单的程序来加深对抽象数据类型的认识。

    【工业自动化】施耐德M580 PLC系统架构详解:存储结构、硬件配置与冗余设计

    内容概要:本文详细介绍了施耐德M580系列PLC的存储结构、系统硬件架构、上电写入程序及CPU冗余特性。在存储结构方面,涵盖拓扑寻址、Device DDT远程寻址以及寄存器寻址三种方式,详细解释了不同类型的寻址方法及其应用场景。系统硬件架构部分,阐述了最小系统的构建要素,包括CPU、机架和模块的选择与配置,并介绍了常见的系统拓扑结构,如简单的机架间拓扑和远程子站以太网菊花链等。上电写入程序环节,说明了通过USB和以太网两种接口进行程序下载的具体步骤,特别是针对初次下载时IP地址的设置方法。最后,CPU冗余部分重点描述了热备功能的实现机制,包括IP通讯地址配置和热备拓扑结构。 适合人群:从事工业自动化领域工作的技术人员,特别是对PLC编程及系统集成有一定了解的工程师。 使用场景及目标:①帮助工程师理解施耐德M580系列PLC的寻址机制,以便更好地进行模块配置和编程;②指导工程师完成最小系统的搭建,优化系统拓扑结构的设计;③提供详细的上电写入程序指南,确保程序下载顺利进行;④解释CPU冗余的实现方式,提高系统的稳定性和可靠性。 其他说明:文中还涉及一些特殊模块的功能介绍,如定时器事件和Modbus串口通讯模块,这些内容有助于用户深入了解M580系列PLC的高级应用。此外,附录部分提供了远程子站和热备冗余系统的实物图片,便于用户直观理解相关概念。

    某型自动垂直提升仓储系统方案论证及关键零部件的设计.zip

    某型自动垂直提升仓储系统方案论证及关键零部件的设计.zip

    2135D3F1EFA99CB590678658F575DB23.pdf#page=1&view=fitH

    2135D3F1EFA99CB590678658F575DB23.pdf#page=1&view=fitH

    agentransack文本搜索软件

    可以搜索文本内的内容,指定目录,指定文件格式,匹配大小写等

    Windows 平台 Android Studio 下载与安装指南.zip

    Windows 平台 Android Studio 下载与安装指南.zip

    Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-windows-zip.zip.002)

    Android Studio Meerkat 2024.3.1 Patch 1(android-studio-2024.3.1.14-windows.zip)适用于Windows系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/90557033 part2: https://download.csdn.net/download/weixin_43800734/90557035

    4-3-台区智能融合终端功能模块技术规范(试行).pdf

    国网台区终端最新规范

    4-13-台区智能融合终端软件检测规范(试行).pdf

    国网台区终端最新规范

    【锂电池剩余寿命预测】Transformer-GRU锂电池剩余寿命预测(Matlab完整源码和数据)

    1.【锂电池剩余寿命预测】Transformer-GRU锂电池剩余寿命预测(Matlab完整源码和数据) 2.数据集:NASA数据集,已经处理好,B0005电池训练、B0006测试; 3.环境准备:Matlab2023b,可读性强; 4.模型描述:Transformer-GRU在各种各样的问题上表现非常出色,现在被广泛使用。 5.领域描述:近年来,随着锂离子电池的能量密度、功率密度逐渐提升,其安全性能与剩余使用寿命预测变得愈发重要。本代码实现了Transformer-GRU在该领域的应用。 6.作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。

    基于android的家庭收纳App的设计与实现.zip

    Android项目原生java语言课程设计,包含LW+ppt

    大学生入门前端-五子棋vue项目

    大学生入门前端-五子棋vue项目

    二手车分析完整项目,包含源代码和数据集,包含:XGBoost 模型,训练模型代码,数据集包含 10,000 条二手车记录的数据集,涵盖车辆品牌、型号、年份、里程数、发动机缸数、价格等

    这是一个完整的端到端解决方案,用于分析和预测阿联酋(UAE)地区的二手车价格。数据集包含 10,000 条二手车信息,覆盖了迪拜、阿布扎比和沙迦等城市,并提供了精确的地理位置数据。此外,项目还包括一个基于 Dash 构建的 Web 应用程序代码和一个训练好的 XGBoost 模型,帮助用户探索区域市场趋势、预测车价以及可视化地理空间洞察。 数据集内容 项目文件以压缩 ZIP 归档形式提供,包含以下内容: 数据文件: data/uae_used_cars_10k.csv:包含 10,000 条二手车记录的数据集,涵盖车辆品牌、型号、年份、里程数、发动机缸数、价格、变速箱类型、燃料类型、颜色、描述以及销售地点(如迪拜、阿布扎比、沙迦)。 模型文件: models/stacking_model.pkl:训练好的 XGBoost 模型,用于预测二手车价格。 models/scaler.pkl:用于数据预处理的缩放器。 models.py:模型相关功能的实现。 train_model.py:训练模型的脚本。 Web 应用程序文件: app.py:Dash 应用程序的主文件。 callback

    《基于YOLOv8的船舶航行违规并线预警系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    《基于YOLOv8的工业布匹瑕疵分类系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    CodeCount.exe

    此为代码审查工具 可查 文件数,字节数,总行数,代码行数,注释行数,空白行数,注释率等

    商业数据分析与Python实现:企业破产概率及抽样技术解析(复现论文或解答问题,含详细可运行代码及解释)

    内容概要:本文档涵盖了一项关于企业破产概率的详细分析任务,分为书面回答和Python代码实现两大部分。第一部分涉及对业务类型和破产状态的边际分布、条件分布及相对风险的计算,并绘制了相应的二维条形图。第二部分利用Python进行了数据处理和可视化,包括计算比值比、识别抽样技术类型、分析鱼类数据集以及探讨辛普森悖论。此外,还提供了针对鱼类和树木数据的统计分析方法。 适合人群:适用于有一定数学和编程基础的学习者,尤其是对统计学、数据分析感兴趣的大学生或研究人员。 使用场景及目标:①帮助学生掌握统计学概念如边际分布、条件分布、相对风险和比值比的实际应用;②教授如何用Python进行数据清洗、分析和可视化;③提高对不同类型抽样技术和潜在偏见的理解。 其他说明:文档不仅包含了理论知识讲解,还有具体的代码实例供读者参考实践。同时提醒读者在完成作业时需要注意提交格式的要求。

    MCP快速入门实战,详细的实战教程

    MCP快速入门实战,详细的实战教程

Global site tag (gtag.js) - Google Analytics