zoukankan      html  css  js  c++  java
  • 【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,并传递给通知类的拦截方法中。

  • 相关阅读:
    芯片难题
    permutation
    小凸玩矩阵
    gender
    NOI2019序列非启发式做法
    莫比乌斯函数&莫比乌斯反演
    「雅礼day2」最大公约数gcd
    容斥原理&反演
    树上路径的交和并
    CF906D Power Tower
  • 原文地址:https://www.cnblogs.com/xing901022/p/4265613.html
Copyright © 2011-2022 走看看