spring in action学习笔记 2 AOP的例子

[size=large][b]5.实现aop的例子[/b][/size]
1.首先先来点预备类,咱定义一个表演的接口,代码如下:
    public interface Perform {
void perform();
}

就一个方法,表演节目,然后再定义2个实现类,ShowBoy和ShowGirl
    public class ShowBoy implements Perform{
public void perform() {
System.out.println("表演街舞");
}
}
public class ShowGirl implements Perform{
public void perform() {
System.out.println("表演肚皮舞");
}
}

这些要bean要让spring来帮我们管理,所以要把他们写到spring的配置文件中。现在先不写,一会统一写。
现在该干正事了,首先就是定义通知,也就是说,想在表演节目的时候插入什么事情呢?
[b]我们定义一个观众类,让他们在表演的时候,做一些动作。[/b]
public class Audience {
public Audience() {
}
public void takeSeat(){
System.out.println("观众们找到自己的座位,都坐下来了");
}
public void turnOffMobilePhone(){
System.out.println("请所有观众确定手机已经关闭");
}
public void appluad(){
System.out.println("观众们大声鼓掌,啪啦啪啦啪啦");
}
public void demandRefund(){
System.out.println("演的太差了,我们要退钱!");
}
}

从这个类定义的方法大概可以看出,找座位和关手机应该是表演前发生的,鼓掌应该是表演后发生的,而要求退钱应该是表演发生意外后发生的。
总结一下,Spring的aop通知有5种形式
Before:org.springframework.aop.MethodBeforeAdvice,这个接口代表方法之前。
After-returning: org.springframework.aop.AfterReturningAdvice,这个代表返回后
After-throwing:org.springframework.aop.ThrowsAdvice,代表抛出异常后。
Around:org.aopalliance.intercept.MethodInterceptor,代表一个方法的周围。
Introduction:org.springframework.aop.IntroductionInterceptor,代表引入
[b]现在来定义真正的通知[/b],通知不是包含应该干什么和何时干吗,那就写把。
public class AudienceAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice{
private Audience audience;

public void setAudience(Audience audience) {
this.audience = audience;
}

public void before(Method method, Object[] objects, Object o) throws Throwable {
audience.takeSeat();
audience.turnOffMobilePhone();
}

public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
audience.appluad();
}
public void afterThrowing(Throwable throwable){
audience.demandRefund();
}
}

其中该干什么在 Audience中定义的,而什么时候,就是这些接口所实现的方法,带有before,after等。都表明了什么时候。

有了通知,就[b]该定义切点了[/b]把,切点直接在配置文件里定义,这时,也顺便把通知和目标类一起定义到xml文件中。切点是干嘛的,切点是定义应该在哪些方法用切面的,他有2种定义方式,一种是用正则表达式,来匹配想要的方法,另一种是用aspectJ切点表达式。
<!--定义目标类,也就是想被织入通知的类-->
<bean id="showBoy" class="com.spring.springcase.ShowBoy"/>
<bean id="showGirl" class="com.spring.springcase.ShowGirl"/>
<!--定义了通知中的功能,此类做为通知的从属类-->
<bean id="audience" class="com.spring.springcase.Audience"/>
<!--定义通知-->
<bean id="audienceAdvice" class="com.spring.springcase.AudienceAdvice">
<property name="audience" ref="audience"/>
</bean>
<!--定义切点,声明想要的方法:spring提供的定义切点方式-->
<bean id="springpointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value=".*perform"/>
</bean>

<!--定义切点,aspectJ定义的切点方式-->
<bean id="asPectJpoincut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
<property name="expression" value="execution(* Performer+.perform(..))"/>
</bean>

现在切点也有了,就要[b]搞完整切面了[/b],完整切面也叫通知者,直接在xml中配置.
 <!--定义完整切面,把定义好的切点和通知放进来就行了 spring定义方式-->
<bean id="audienceAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut" ref="springpointcut"/>
<property name="advice" ref="audienceAdvice"/>
</bean>
<!--定义完整切面,aspectJ定义方式-->
<bean id="audienceAdvisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
<property name="expression" value="execution(* Performer+.perform(..))"/>
<property name="advice" ref="audienceAdvice"/>
</bean>


切面有了,基本的事情都好了,现在可以想办法把切面用到目标类上了,aop的原理是通过代理实现的,所以我们要[b]声明代理bean[/b]了。

首先,之前的ShowBoy和ShowGirl要改在xml中声明的id,他们现在是[b]目标类[/b],所以XML要改为
<bean id="showBoyTarget" class="com.spring.springcase.ShowBoy"/>
<bean id="showGirlTarget" class="com.spring.springcase.ShowGirl"/>

[b]现在制作一个代理[/b]:
 <!--定义代理类,第一个参数是要代理的对象,第2个是使用的切面,第3个是实现的接口-->
<bean id="showBoy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="showBoyTarget"/>
<property name="interceptorNames">
<list>
<value>audienceAdvice</value>
</list>
</property>
<property name="proxyInterfaces">
<list>
<value>com.spring.springcase.Perform</value>
</list>
</property>
</bean>


现在就把代理类伪装成showBoy了,为什么要这样,上一篇已经说过了。
现在测试一下
public class performTest extends TestCase{
ApplicationContext ctx;
@Override
protected void setUp() throws Exception {
ctx = new ClassPathXmlApplicationContext("spring-springcase.xml");
}
public void testShowBoy(){
Perform perform = (Perform)ctx.getBean("showBoy");
perform.perform();
}
}
打印结果:
观众们找到自己的座位,都坐下来了
请所有观众确定手机已经关闭
表演街舞
观众们大声鼓掌,啪啦啪啦啪啦

如果现在要[b]showGirl也代理[/b],那么就要写它的xml:
<bean id="showGril" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="showGirlTarget"/>
<property name="interceptorNames">
<list>
<value>audienceAdvice</value>
</list>
</property>
<property name="proxyInterfaces">
<list>
<value>com.spring.springcase.Perform</value>
</list>
</property>
</bean>

如果再有一个呢,那非给把你累死,发现定义代理,大部分代码是一样的,就是引用的目标类不同,这时就要把共有的代码抽出来,自己去写变换的那部分。
定义一个[b]代理的父类[/b],实现了2个参数,其中的目标类由自己写。
 <bean id="audienceProxyBase" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true">
<property name="interceptorNames">
<list>
<value>audienceAdvice</value>
</list>
</property>
<property name="proxyInterfaces">
<list>
<value>com.spring.springcase.Perform</value>
</list>
</property>
</bean>


[b]重新声明伪装类[/b]就简单很多了
    <bean id="showBoy" parent="audienceProxyBase">
<property name="target" ref="showBoyTarget"/>
</bean>
<bean id="showGirl" parent="audienceProxyBase">
<property name="target" ref="showGirlTarget"/>
</bean>

但是,许多人还是觉得要定义这么一大堆东西,还是太麻烦,没错,我也觉得是麻烦,spring有更好的实现方式。明天再接着总结。

[quote]
写的不错,不过应该吧xml文件的名称写清楚
[/quote]
[b]所有的xml都写在spring-springcase.xml这个配置文件中[/b]
使用ArcGIS Pro进行土地利用分类的机器学习与深度学习 传统的土地利用分类方法通常依赖于手动解译和规则定义,但随着机器学习和深度学习的发展,我们现在可以利用这些技术来自动化和提高分类的精度。ArcGIS Pro是一种功能强大的GIS软件,它提供了丰富的工具和功能,可以支持土地利用分类的机器学习和深度学习。我们将首先讨论数据准备和预处理的步骤,然后介绍常用的机器学习和深度学习方法,并提供相应的源代码示例。这可以通过人工标注或半自动的方式完成。数据裁剪:根据研究区域的范围,裁剪遥感影像数据,以减少计算和存储的负担,并确保只包含感兴趣的土地利用区域。 阅读详情

相关推荐

如何构建高质量的 QA 问答知识库

NLP 技术落地最普遍的场景就是智能客服,如阿里的”小蜜“,京东的“JIMI”等等。NLP 技术也广泛应用于搜索系统。无论是“智能客服”,还是“搜索系统”,构建的前提是拥有“高质量的QA知识库”。今天聊聊“如何构建高质量QA知识库。”。 历史对话数据分布分析 基于公司现有系统积累的大规模对话文本数据,需要对文本数据进行归类处理,分析每个部分数据的占比,挖掘出有价值的文本通过 NLP 相关技术进行商业价值转化。下文以医疗领域来举例说明,通过输入对象,可以将文本分为客服输入和用户输入两部分。挖掘相关问题,主要从

Jiassheng的博客 2153

Spring| AOP之 引入(Introductions)

在看此文章之前,你可能已经知道了,Spring是通过Before、After、AfterRunning、AfterThrowing以及Around 共5中通知方式为目标方法增加切面功能,比如一个需要在目标类执行一个目标方法之前和之后分别打印一份日志,就可以建立一个切面在这个方法前后打印日志。 但是如果我想在此目标类中再增加一个目标方法是,该怎么办呢? 最简单的办法就是在建立此目标类的时候,增加此方...

YvesHe的专栏 1744

SAP ALV表格F4搜索帮助不触发DATA_CHANGE?3步排查搞定

本文针对SAP ALV表格中F4搜索帮助选择值后,DATA_CHANGE事件不触发的经典问题,提供了三步系统性排查方法。核心在于理解F4值回写机制,并需在事件处理中手动填充修改表以通知ALV控件数据变更,从而确保后续校验、自动计算等依赖DATA_CHANGE的逻辑能正常执行。

c2d3e4f的博客 1134

Spring实现AOP(使用API接口、使用自定义类、使用注解)

AOP 不改变原有的业务,增加功能 AOP在Spring中的作用 横切关注点:跨越应用程序多个模块的方法或功能,于我们业务逻辑无关,但需要关注的部分 切面(aspect):横切关注点被模块化的特殊对象,是一个类 通知(Adivce):切面必须要完成的工作,类中的一个方法 目标(Target):被通知的对象 代理(Proxy):向目标对象应用通知后创建的对象 切入点(PointCut):切面通知 执行的“地点”的定义 连接点(JointPoint):于切入点匹配的执行点 SpringAOP中,通过Ad

haoyun的博客 1060

android11-修改屏幕显示方向和触摸方向

参数0表示12点钟方向显示参数90表示3点钟方向显示参数180表示6点钟方向显示参数270表示9点钟方向显示。

Paper_Love的博客 2118

MySQL8.2.0下载安装

4、点击No thanks,just start my download,就是只是开始下载的意思,点击下载,等待下载完成。5、新建空白行,或直接双击紧挨的空白行,把复制的mysql的安装路径bin路径复制粘贴过来,确定,确定,确定。1、上面点击finish后,自动勾选了run mysql配置,自动会打开配置页面,点击Next。1、双击安装包,进入安装流程,勾选我同意 I accept,next。2、根据自己需要选择,我选的第二个,可以自己改安装路径。2、默认,点击Next,记住默认端口3306。

m0_59681797的博客 1万+

Spring in Action 阅读(5)—— Spring MVC应用程序示例

@Controller注解声明控制器,构造型(stereotype)的注解,基于@Component注解。目的就是辅助实现组件扫描。 带有@RequestMapping注解。 它的value属性指定了这个方法所要处理的请求路径,method属性细化了它所处理的HTTP 方法。在本例中,当收到对“/”的HTTP GET请求时,就会调用home()方法。 当控制器在类级别上添加@RequestMa...

qq_17236715的博客 212

从AMCL到SLAM Toolbox:在Nav2中实现高精度纯定位的实践指南

本文详细介绍了从AMCL迁移到SLAM Toolbox纯定位模式的实践指南,帮助开发者在Nav2中实现高精度定位。通过对比AMCL与SLAM Toolbox的性能差异,提供环境配置、参数调优、Nav2集成等关键步骤,显著提升机器人在动态环境中的定位精度和重定位效率。

weixin_29292535的博客 148

阅读Spring in action 实现书中实例时遇到的问题(一)

在Spring实战中第五章最后提到了validate校验表单信息 使用javaAPI validate验证表单时要导入 &lt;dependency&gt;                      &lt;groupId&gt;org.hibernate&lt;/groupId&gt;                      &lt;artifactId&gt;hibernate-va...

weixin_41283112的博客 298

浅谈MOS管的发热原因和解决办法

解读一下开关管发热原因,解决方案和开关损耗测试。

qq_45508321的博客 1万+

万字长文,YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

Coding... 1万+

利用SPring AOP配置切面的一个例子

这个例子,就是对于DukePerformer类,在它的演奏方法perform执行前,输出观众找座位takeSeat和关手机turnOffPhone,在执行后,输出观众鼓掌applaud。 将代码提取出来,独立于一个模块中,就是切面编程。主要还是为了松散耦合。 首先定义Duke

卧龙居 2万+

Visual Studio Code + MCP Server + Claude Code 三件套进行 ABAP 开发

本文介绍了如何在Visual Studio Code中利用Claude Code和SAP官方提供的MCP Server进行ABAP开发。作者分享了19年ABAP开发经验,从手动编码到如今通过自然语言生成高质量代码的技术演进。详细说明了配置步骤:启用ADT MCP Server、安装Claude Code扩展、配置.claude.json文件,并验证MCP Server的14个功能。通过实例演示了如何用自然语言指令让Claude Code创建包含冒泡排序实现和单元测试的ABAP类,展示了MCP Server在

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1297

【引用】spring in action学习笔记 2 AOP的例子-DoubleEO

5.实现aop的例子 1.首先先来点预备类,咱定义一个表演的接口,代码如下:  Java代码  public interface Perform {   void perform();   }       就一个方法,表演节目,然后再定义2个实现类,ShowBoy和ShowGirl  Java代码      public class ShowBoy implement...

有时间记录一点点 195

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring AOP 学习笔记 【Spring in action】

1、DI:对象与对象之间的解耦;AOP:功能与对象之间的解耦; 2、通知(Advice):定义切面的工作是什么、何时被调用【what、when】 3、切点(Ponitcut):定义切面的功能在何处执行【where】 4、切面(Aspect):通知+切点=切面,定义功能是什么,在何时何地完成其功能【what、when、where】 5、在spring文件中如果使用aop标签,需要在中加上

hqq1007的博客 441

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring in Action之AOP

Spring in Action之AOP

Vincent的博客 482

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring In Action 学习笔记(三) AOP

个人学习Spring In Action学习笔记系列 (三) AOP 源码地址 https://github.com/spring-projects/spring-framework U4 通知Bean 4.1 AOP简介 切面有助于实现交叉事务的模块化,每个模块是为特定领域提供服务,比如日志和安全就是一个交叉事务。 在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行...

panjianlongWUHAN的专栏 608

Spring in Action -- AOP篇

1、什么是面向切面编程? 概念:通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 2、AOP术语 2.1、通知(Advice) 在AOP术语中,切面的工作被称为通知、 Spring切面可以应用5中类型的通知 前置通知(Before):在目标方法被调...

JISOOLUO的博客 314

spring aop对Struts2的action拦截时出现异常

     方法一:引用http://sulong.me/archives/51:不要让Action继承ActionSupport。      用spring做为struts2的ObjectFactory,用spring来生成action,并对action的方法加上aop时,不要使Action继承于ActionSupport,否则会出现类似于以下的异常:  java.lang.NoS...

lilywangcn 262

Spring In Action 学习笔记(一)

个人学习Spring In Action学习笔记系列 (一) 源码地址 https://github.com/spring-projects/spring-framework U1 开始Spring之旅 1.1什么是Spring Spring是一个开源框架,为简化企业级应用开发应运而生。Spring是一个轻量级的DI和AOP容器框架 轻量级 基于POJO可以打成一个2.5MB的JAR包,...

panjianlongWUHAN的专栏 772

Spring in Action 第一部分学习笔记

Spring in Action是一本讲解Spring的经典书籍,全书分为三个部分,第一部分介绍Spring框架的核心知识。第二部分在此基础上深入介绍Spring应用程序的常用元素,最后一个部分展示Spring怎么与其它应用和服务进行集成。以下是笔者阅读第一部分记录的读书笔记,共勉。 第一章 Spring之旅 1.1 简化JAVA开发-Spring最根本使命 1.激发POJO的潜能:POJO

森林里的一天 1710

Spring in Action 4读书笔记之使用标签创建AOP

在之前的读书笔记Spring in Acton 4读书笔记之AOP原理及Spring对AOP的支持中,讲到Spring对AOP的支持包含四方面: Spring基于代理的经典的AOP 使用XML配置将纯POJO转化为aspect 使用Spring的@Aspect标签,创建aspect Spring不创建aspect,只注入(引用)AspectJ框架的aspect Spring in Action(Spring实战)的第四章第三节(4.3 Creating annotated aspects)讲述了其中第三

谈谈IT 160

【Spring in Action】Spring的AOP基础知识及切面运用

前言 一温故知新 二AOP切面的使用 三总结分析 四Spring AOP 使用接口注入为API引入新功能

haibo_bear的博客 402

Spring in Action 学习笔记—第一章 开始Spring之旅(转贴)

Spring in Action 学习笔记—第一章开始Spring之旅 (转贴之http://blog.youkuaiyun.com/qutr/)在本章中,作者简单的介绍了Spring的由来,发展以及怎样简化J2EE开发,和Spring的易用性。其中重点介绍了Spring的核心概念:反向控制(IoC)和AOP(Aspect Oriented Programming)。最后给出了Spring和其他框架的

Liang Tang's 专栏 5868

struts2中实现spring的aop

struts2中实现spring的aop 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显

sinat_22201155的博客 756

Spring Aop 例子(Spring in action)

<br /><?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.o

This is my house! 1547
上一篇: spring in action学习笔记 1 (许多自己的理解,欢迎拍砖)
下一篇: spring in action学习笔记 3 AOP的自动代理
iteye_17543
博客等级 码龄8年 2粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值