通过前面的学习,可以了解到 Spring的AOP可以很方便的监控到方法级别的执行 ,针对于某个方法实现通知响应。

那么对于方法的参数如何呢?

  比如我们有一个方法,每次传入了一个字符串,我想要知道每次传入的这个字符串是神马?这又如何办到呢!

  举个Action上面的例子,一个思考者(thinker),每次在思考时,都会传入一个字符串作为思考的内容。

  我们想要每次获取到这个思考的内容,实现一个通知。因此读心者可以通过AOP直接监控到每次传入的内容。

源码参考

  首先看一下思考者的接口和实现类:

package com.spring.test.aopmind;

public interface Thinker {
void thinkOfSomething(String thoughts);
}
package com.spring.test.aopmind;

public class Volunteer implements Thinker{
private String thoughts;
public void thinkOfSomething(String thoughts) {
this.thoughts = thoughts;
}
public String getThoughts(){
return thoughts;
}
}

  下面是读心者的接口和实现类:

package com.spring.test.aopmind;

public interface MindReader {
void interceptThoughts(String thougths);
String getThoughts();
}
package com.spring.test.aopmind;

public class Magician implements MindReader{
private String thoughts;
public void interceptThoughts(String thougths) {
System.out.println("Intercepting volunteer's thoughts");
this.thoughts = thougths;
}
public String getThoughts() {
return thoughts;
}
}

  接着配置好bean.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="magician" class="com.spring.test.aopmind.Magician"/>
<bean id="xingoo" class="com.spring.test.aopmind.Volunteer" /> <aop:config proxy-target-class="true">
<aop:aspect ref="magician">
<aop:pointcut id="thinking"
expression="execution(* com.spring.test.aopmind.Thinker.thinkOfSomething(String)) and args(thoughts)"/>
<aop:before pointcut-ref="thinking" method="interceptThoughts" arg-names="thoughts"/>
</aop:aspect>
</aop:config>
</beans>

  测试类如下

package com.spring.test.aopmind;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
Thinker thinker = (Thinker)ctx.getBean("xingoo");
thinker.thinkOfSomething("吃点啥呢!");
}
}

  执行结果:

Intercepting volunteer's thoughts

讲解说明

  在配置文件中:

  在<aop:before>中指明了要传入的参数thoughts

  在<aop:pointcut>切点中通过AspectJ表达式锁定到特定的方法和参数thoughts

  这样,当执行到方法thinkOfSomething()之前,就会触发aop,得到参数thoughts,并传递给通知类的拦截方法中。

【Spring实战】—— 10 AOP针对参数的通知的更多相关文章

  1. 《Spring实战》第4章--面向切面的Spring--处理通知中的参数(经验总结)

    今天学习<Spring实战>第4章<面向切面的Spring>,根据4.3.3小节写出如下切面类: package proxy; import java.util.HashMap ...

  2. 开涛spring3(6.6) - AOP 之 6.6 通知参数

    前边章节已经介绍了声明通知,但如果想获取被被通知方法参数并传递给通知方法,该如何实现呢?接下来我们将介绍两种获取通知参数的方式. 使用JoinPoint获取:Spring AOP提供使用org.asp ...

  3. spring学习 十二 AspectJ-based的通知入门 带参数的通知

    第一步:编写通知类 package com.airplan.pojo; import org.aspectj.lang.ProceedingJoinPoint; public class Advice ...

  4. 10.Spring——框架的AOP

    1.Spring 框架的 AOP 2.Spring 中基于 AOP 的 XML架构 3.Spring 中基于 AOP 的 @AspectJ 1.Spring 框架的 AOP Spring 框架的一个关 ...

  5. spring中的AOP 以及各种通知 配置

    理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...

  6. Spring实战(十一) 在Spring XML中配置AOP

    如果你没有源码,不能为通知类添加注解,又不想将AspectJ注解放入到你的代码中,必须选择XML配置了. 1.Spring XML配置文件 解析参考:http://www.cnblogs.com/bi ...

  7. Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

    1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...

  8. spring aop的五种通知类型

    昨天在腾讯课堂看springboot的视频,老师随口提问,尼玛竟然回答错了.特此记录! 问题: Spring web项目如果程序启动时出现异常,调用的是aop中哪类通知? 正确答案是: 异常返回通知. ...

  9. spring学习 十一 AspectJ-based的通知入门 不带参数的通知

    AspectJ-Based方式的AOP,通知类不需要实现任何接口,且前置通知,后置通知,环绕通知,异常通知都可以写在一个类中,下面先实现一个简单的,不带参数的通知. 第一步定义通知类,通知类中的通知( ...

随机推荐

  1. 修改chrome背景色

    参考:http://blog.csdn.net/jvortex/article/details/73895288 1.新建一个文件夹,比如customcss,包含custom.css和manifest ...

  2. Js与标签属性

    关于在JS中设置标签属性 2017-10-09 23:04 by 清风221, 12790 阅读, 0 评论, 收藏, 编辑 Attribute 该属性主要是用来在标签行内样式,添加.删除.获取属性. ...

  3. 4.整体架构和Smart Scan

    寻道时间: 外圈,比内圈要多, 即外圈是比较快的. 第一次创建grid disk 时,是创建外圈,用于存放数据的,内圈存储归档这些数据 CellCLI> CREATE GRIDDISK ALL ...

  4. Android报错

      Error:Execution failed for task ':app:processDebugResources'. > com.android.ide.common.process. ...

  5. rsync 参数配置说明[转]

    rsync 特性 可以镜像保存整个目录树和文件系统. 可以很容易做到保持原来文件的权限.时间.软硬链接等等. 无须特殊权限即可安装. 快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修 ...

  6. 如何透过上层div点击下层的元素解决方法

    一.问题描述 笔者是在些一个登录界面时遇到这个问题的,需求是点击登录按钮出现登录悬浮框,初始化时登录悬浮框是display:none的,但笔者发现登录框那一块区域的input框无法响应点击时间,也无法 ...

  7. HTML5之WebSocket && https://zhuanlan.zhihu.com/p/23467317

    在认识websocket之前,我们必须了解的是websocket有什么用? 他能解决我们遇到的什么问题? 如果没用,那么我们就么有使用它的必要的. websocket就是建立起全双工协议的,提高了效率 ...

  8. Java for循环的几种用法分析

    J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...

  9. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  10. 03-struts2获得servetAPI

    1 原理 三个域合一的时候相同的键值对以小的域为准.ActionContext 对象创建:每次请求的时候都会创建一个与请求对应的 ActionContext 对象.ActionContext 销毁:请 ...