转载地址: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 还提供了一种表达式语言,允许在配置中定义访问规则,实现对Web和方法访问的灵活控制。 **配置Spring Security:** 配置过程通常涉及以下几个步骤: 1. **Web.xml配置** - 配置Spring Security的...
下面对这几个配置文件解释下: 1.Configuration.xml 是 mybatis 用来建立 sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 ...
11KW OBC两电平pfc+cllc仿真源码实现:单相与三相兼容版双向控制研究,11KW OBC两电平pfc+cllc仿真源码实现:单相与三相兼容版,实现双向控制策略,11KW OBC两电平pfc+cllc仿真,源代码实现。 注意:已成单相,三相兼容版仿真文件。 双向控制。 ,核心关键词:11KW OBC两电平pfc; CLLC仿真; 源代码实现; 单相三相兼容; 双向控制。,11KW OBC单相与三相兼容版仿真:两电平PFC+CLLC双向控制源代码实现
3GPP R15 38.331 5G NR无线资源控制(RRC)协议规范解析
五运六气YUNQI_V471_SRC_D1023
19考试真题最近的t63.txt
基于MATLAB的牛拉法电力系统潮流计算程序,结合BPA方法,附参考文献,适合基础学习与拓展创新,基于MATLAB的牛拉法电力系统潮流计算程序:涵盖基础学习与拓展创新,附参考文献,牛拉法电力系统潮流计算 MATLAB编写潮流计算程序 BPA计算潮流 另外包含参考文献 这个程序把潮流计算的一般流程包括了,非常适合基础学习,并进一步的进行拓展创新 ,牛拉法; 电力系统潮流计算; MATLAB; BPA计算; 程序编写; 流程; 基础学习; 创新拓展,基于MATLAB的牛拉法电力系统潮流计算程序:基础学习与拓展创新指南
YOLOv11m权重文件
高一-语文-2025年1月张家界市高一期末联考-缺考不计、违纪不计、0分不计_2025-01-16-12-21 (1).zip
android kotlin 版本的贪吃蛇游戏
19考试真题最近的t57.txt
基于疫情封控区域的生活物资配送优化模型:结合遗传算法与模拟退火,实现时间最短和综合满意率最高的路径优化。,疫情下封控区域生活物资配送优化模型:结合遗传算法与模拟退火算法求解路径优化问题,实现时间与满意率双重目标优化。,模型及MATLAB代码:考充分考虑并结合疫情下封控区域生活物资配送问题及车辆路径问题的特点构建物资配送优化模型。 在一般单一目标——时间最短的基础上,加入综合满意率优化目标的路径优化问题 关键词:遗传算法、改进、模拟 火算法,路径优化、CVRP 完整模型+代码+注释 主要内容:以配送时间最短及综合满足率最高为目标,充分考虑并结合疫情下封控区域生活物资配送问题及车辆路径问题的特点构建物资配送优化模型,为疫情下生活物资配送找到了更好的思路。 在模型设计与求解问题上,首先设计标准遗传算法,继而对算法加以改进,最后设计出了改进遗传-模拟 火算法对模型进行求解。 还有参数灵敏度分析等。 服务内容:脚本 工具 部分展示如下: ,关键词:疫情下物资配送;车辆路径问题;优化模型;遗传算法;改进;模拟退火算法;CVRP;参数灵敏度分析;脚本工具;时间最短;综合满意率。 核心关键词用分号分
## 01、数据介绍 动态能力理论最早由提斯(Teece)与皮萨洛(Pisano)于1994年正式提出,他们将动态能力定义为“能够创造新产品和新过程,以及对变化的市场环境做出响应的一系列能力”。 动态能力具体体现在吸收能力、创新能力和适应能力三个方面。这些能力使公司能够快速适应市场变化,抓住新的商业机会,从而保持或提升竞争优势。 数据名称:上市公司-动态能力数据 数据年份:2012-2023年 ## 02、相关数据及指标 证券代码 证券名称 年份 Symbol RD IA ACV DC
基于ASIO的插件式服务器,支持TCP, UDP, 串口,Http, Websocket,统一化的数据接口,隔离开发人员和IO之间的操作。可以快速迭代。PSS 是针对不同 IO 逻辑的插件管理系统。您可以忽略 IO 建立的细节,构建自己的 logic 应用程序。PSS 封装了 Tcp、udp、kcp、串行端口、http、websocket 和 ssl 的统一接口。您可以使用 配置文件 或 统一接口 来创建和使用它们。logic plug-in 是完成数据到达后的 logic 处理,全部以动态库的形式加载,将 IO 和 logic 本身的耦合分开。简单的逻辑开发。本项目由三部分组成 (1) 主机(2) 数据包分析插件(3) 逻辑处理插件。您可以实现后两个插件来完成您的业务逻辑部署。
电机控制器源码:通用无感BLDC方波控制,高效参数化启动,转速达12w,环控系统一键调节,电机控制器源码:通用无感BLDC方波控制,高效调速,参数宏定义便捷调试,最高电转速达12w,电机控制器,低压无感BLDC方波控制,全部源码,方便调试移植 1.通用性极高,图片中的电机,一套参数即可启动。 2. ADC方案 3.电转速最高12w 4.电感法和普通三段式 5.按键启动和调速 6.开环,速度环,限流环 7.参数调整全部宏定义,方便调试 代码全部源码 ,电机控制器;低压无感BLDC方波控制;全部源码;通用性极高;电转速最高12w;电感法与普通三段式;按键启动调速;开环、速度环、限流环;参数调整宏定义。,通用电机控制器:低压无感BLDC方波控制源码,支持高转速12W,便捷调试移植
基于MPC的电动汽车分布式协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的电动汽车协同自适应巡航控制:上下分层控制与仿真结果展示,基于MPC的分布式电动汽车协同自适应巡航控制,采用上下分层控制方式,上层控制器采用模型预测控制mpc方式,产生期望的加速度,下层根据期望的加速度分配扭矩;仿真结果良好,能够实现前车在加减速情况下,规划期望的跟车距离,产生期望的加速度进行自适应巡航控制。 ,关键词:MPC(模型预测控制); 分布式电动汽车; 协同自适应巡航控制; 上下分层控制方式; 期望加速度; 扭矩分配; 仿真结果良好; 前车加减速; 跟车距离。,基于MPC的分层控制电动汽车自适应巡航系统,仿真实现前车加减速跟车距离自适应
多维度购电与售电模型构建及基于CVaR与WOA优化的收益风险评估方法研究,基于CVaR风险评价及WOA优化的新型售电公司购售电模型与策略仿真研究,建立了一个电公司的购电侧模型和电侧模型,其中购电侧模型包括长期市场业务,现市场业务,可再生能源购电市场业务,分布式电源购电市场业务以及储能租赁市场业务五种类型。 电侧包括均 电价合同和实时电价合同两种类型。 然后在购电模型的基础上,提出了一种基于CVaR的购电收益风险评价方法。 根据电公司的CVaR购电收益风险数学模型,提出了一种基于WOA优化算法的新型购电收益计算方法。 该方法将购电收益风险计算公式作为WOA优化算法的目标函数,然后通过WOA的鲸鱼行走觅食、鲸鱼包围以及鲸鱼螺旋捕食三个步骤计算电公司的最优购电策略。 最后,通过MATLAB仿真工具对本文所研究的基于WOA优化的新型购电收益计算方法进行了仿真分析。 仿真结论验证了通过WOA优化算法得到的购电策略为最优购电策略。 matlab代码 仿真平台:MATLAB平台 代码具有一定的深度和创新性,注释清晰 ,关键词: 1. 购电侧模型; 2. 售电侧模型; 3. 长期/现货/可再生
迅雷软件下载原理介绍.md
## 01、数据简介 碳排放是指在人类活动中,如能源消耗、工业生产、交通运输、农业活动等过程中向大气中释放的二氧化碳等温室气体的行为。这些温室气体在大气中形成隔热层,导致地球气温升高,引发全球气候变化。分行业碳排放则是指按照不同的经济活动或产业部门来划分和统计碳排放量。 按省市县整理成面板数据,其中包括电力行业、工业过程、工业燃烧、建筑物能源、浪费、农业、燃料能源和运输八种指标排放量各省市县的最大值、最小值、平均值、总和。 数据名称:省市县分行业碳排放月度数据 数据年份:2023年 ## 02、相关数据 name 指标 时间 数值 更多数据 ## 03、数据截图