【Spring实战】—— 10 AOP针对参数的通知

通过前面的学习,可以了解到 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,并传递给通知类的拦截方法中。

本文转自博客园xingoo的博客,原文链接:【Spring实战】—— 10 AOP针对参数的通知,如需转载请自行联系原博主。

时间: 2024-09-26 06:58:35

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

Spring AOP中的前置通知和后置通知详解

不同版本的spring对AOP的支持有所不同,spring2.0之前,它主要针对不同类型的拦截器使用XML配置文件通过代理来实现.而spring2.0之后,它可以使用JDK5的注解来完成AOP的实现,只是几个简单标签就可以完成,使得开发更加简单,便捷.所以推荐使用后一种方法.但是很多旧的项目中使用了前一种实现方法,所以我们也应该对第一种方法有所掌握. 首先通过代码介绍spring2.0之前如何实现前后置通知 定义一个User接口: package org.spring.advice; publi

【Spring实战】—— 11 通过AOP为特定的类引入新的功能

如果有这样一个需求,为一个已知的API添加一个新的功能. 由于是已知的API,我们不能修改其类,只能通过外部包装.但是如果通过之前的AOP前置或后置通知,又不太合理,最简单的办法就是实现某个我们自定义的接口,这个接口包含了想要添加的方法. 但是JAVA不是一门动态的语言,无法再编译后动态添加新的功能,这个时候就可以使用 aop:declare-parents 来做了. 如果是可以改写的类,直接实现自定义的接口就行了,下面看看AOP是如何做的! 最开始使用的类和接口: package com.sp

【Spring开发】—— AOP之方法级拦截

前言: 前面介绍了Spring的核心模块以及相关的依赖注入等概念.这篇讲解一下spring的另一个重点,AOP面向切面编程. 说道AOP不得不提到几个概念: 切面:也就是我们自己的一些业务方法. 通知:用于拦截时出发的操作. 切点:具体拦截的某个业务点. 这样说可能还是有点抽象,举个例子,下面是一个纸糊的多面体. 每个面都是一个业务方法,我们通过刺穿每一个面,都可以进入到内部,这个面就是一个切面. 刺穿的时候会发出声响,这就是一种通知. 而具体从哪个面刺入,这就是一个切入点的选择了. 这样说,应

Spring框架与AOP思想的研究与应用

摘要 本文对Spring框架中所包含的AOP思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明了动态代理模式的可行性与有效性. 关键词 AOP:横切关注点:控制反转:动态代理 引言 Aspect Oriented Programming(AOP)是近年来计算机技术中比较热门的话题之一.其发展历史从学术领域和研发机构的运用开始,目前流行的Spring应用程序框架将AOP思想融入了整个框架的设计开发与应用当中.使用Spring框架固然给我们的编程带来了好处与便利,但是同时存在

Spring实战6-利用Spring和JDBC访问数据库

主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRepository和SpittleRepository接口,在本地启动该web服务的时候会遇到控制器无法注入对应的bean的错误,因此我决定跳过6~9章,先搞定数据库访问者一章. 在企业级应用开发中不可避免得会涉及到数据持久化层,在数据持久化层的开发过程中,可能遇到很多陷阱.你需要初始化数据库访问框架.

《Spring实战(第4版)》——第1章 Spring之旅 1.1简化Java开发

第1部分 Spring的核心 Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是依赖注入(dependency injection,DI)和面向切面编程(aspect-oriented programming,AOP). 作为本书的开始,在第1章"Spring之旅"中,我将快速介绍一下Spring框架,包括Spring DI和AOP的概况,以及它们是如何帮助读者解耦应用组件的. 在第2章"装配Bean"中

Spring实战4—面向切面编程

主要内容 面向切面编程的基本知识 为POJO创建切面 使用@AspectJ注解 为AspectJ的aspects注入依赖关系 在南方没有暖气的冬天,太冷了,非常想念北方有暖气的冬天.为了取暖,很多朋友通过空调取暖,但是空调需要耗电,也就需要交不少电费.没家都会有一个电表,每隔一段时间都会有记录员来家里收取这段时间的电费. 现在做个假设:去掉电表和电费收取员,因此也没有人定期来家里收电费.这时就需要我们隔段时间主动去电力公司交电费,尽管会有执着的家庭主妇会认真得记录每个月各个电器用了多少度电,并计

【Spring实战】—— 13 AspectJ注解切面

前面了解了典型的AOP基于配置的使用方法,下面介绍下如何依赖于注解来实现AOP. 基于注解降低了配置文件的复杂程度,但是引入了程序间的耦合,其中的优劣待用户自己判断了. 需要注意的是,确定AspectJ与JDK之间的版本,否则会报错,详情请见. 首先看一下基于注解的切面类,这时的切面不仅仅是一个POJO类了,与AOP进行了紧密的耦合.但是配置过程和方式都与原来的方式差不多. package com.spring.test.chap44; import org.aspectj.lang.annot

【Spring实战】—— 15 Spring JDBC模板使用

前一篇通过对传统的JDBC的使用操作,可以体会到使用的繁琐与复杂,套句话说,是用了20%作了真正的工作,80%作了重复的工作. 那么通过本篇,可以了解如下的内容: 1 如何配置数据源 2 如何在spring中使用模板 3 如何建立数据源的统一的基类 首先看一下如何配置数据源 我们可以使用3种方式配置数据源: 1 JNDI配置数据源 这种做法我是没用过,感觉每次都要去修改配置Tomcat之类的web容器,很是麻烦. 2 使用DBCP数据源连接池 一般情况下都是采用这种方式,对于连接池的实现,也有很