Spring AOP本质(7)
上一个里面,给出静态方法切点匹配的例子,现在给出一个动态的实现例子:
没有
/**
* 业务组件
*/
public class SampleBean {
    public void foo(int x) {
        System.out.println("SampleBean的foo(int x)方法被调用,参数x="  +x);
    }
    public void bar() {  
        System.out.println("SampleBean的无参bar()方法被调用!");
    }
}
import java.lang.reflect.Method;

import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.DynamicMethodMatcherPointcut;

/**
* 自定义动态切入点:Pointcut
*/
public class SimpleDynamicPointcut extends DynamicMethodMatcherPointcut {
    /**
     * 重写了静态方法匹配器
     */
    public boolean matches(Method method, Class cls) {
        System.out.println("SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:" + method.getName());
        //仅当方法名为foo时候才匹配
        return ("foo".equals(method.getName()));
    }

/**
     * 实现了动态方法匹配器
     */
    public boolean matches(Method method, Class cls, Object[] args) {
        System.out.println("SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:" + method.getName());
        int x = ((Integer) args[0]).intValue();
        //仅当方法参数为不等于100才匹配
        return (x != 100);
    }

/**
     * 重写了类匹配器
     */
    public ClassFilter getClassFilter() {
        return new ClassFilter() {
            public boolean matches(Class cls) {
                System.out.println("SimpleDynamicPointcut:切入点类匹配,正在匹配"+cls.getName()+"类!");                
                return (cls == SampleBean.class);
            }
        };
    }
}

/**
* 自定义通知:Advice
*/
public class SimpleAdvice implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println(">> 业务方法调用前动作,被代理调用目标方法是: " + invocation.getMethod().getName());
        Object retVal = invocation.proceed();
        System.out.println(">> 业务方法调用结束后动作!");
        return retVal;
    }
}
import org.springframework.aop.Advisor;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;

import com.apress.prospring.ch6.staticpc.SimpleAdvice;

/**
* 动态方法匹配器切入点:客户端测试
*/
public class DynamicPointcutExample {

public static void main(String[] args) {
        //创建目标对象
        SampleBean target = new SampleBean();

// 创建通知者
        Advisor advisor = new DefaultPointcutAdvisor(
                new SimpleDynamicPointcut(), new SimpleAdvice());
        
        //创建代理工厂
        ProxyFactory pf = new ProxyFactory();
        //将目标加入工厂
        pf.setTarget(target);
        //创建通知者
        pf.addAdvisor(advisor);

//获取代理实例(产品)
        SampleBean proxy = (SampleBean)pf.getProxy();

//调用代理方法,注意参数的变化
        proxy.foo(1);
        proxy.foo(10);
        proxy.foo(100);
        
        proxy.bar();
        proxy.bar();
        proxy.bar();
    }
}

运行结果:
- Using JDK 1.4 collections
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:foo
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:bar
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:hashCode
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:toString
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:foo
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo
>> 业务方法调用前动作,被代理调用目标方法是: foo
SampleBean的foo(int x)方法被调用,参数x=1
>> 业务方法调用结束后动作!
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo
>> 业务方法调用前动作,被代理调用目标方法是: foo
SampleBean的foo(int x)方法被调用,参数x=10
>> 业务方法调用结束后动作!
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo
SampleBean的foo(int x)方法被调用,参数x=100
SampleBean的无参bar()方法被调用!
SampleBean的无参bar()方法被调用!
SampleBean的无参bar()方法被调用!

Process finished with exit code 0

Spring AOP本质(7)相关推荐

  1. Spring AOP 本质(3)

    Spring AOP 本质(3) Spring AOP很牛,AOP是OOP的补充,而非竞争者. 前面的例子离实际的应用太遥远.不足以显式AOP的力量,现在就用AOP前置通知来检查用户的身份,只有通过检 ...

  2. Spring AOP 本质

    AOP本质是拦截,拦截的本质是代理,代理分动态和静态,静态代理很简单,功能有限,应用不是很广泛,Spring中主要用的动态代理.   用Spring做开发,AOP的实现仅仅是编程实现一些接口,然后配置 ...

  3. 《Spring揭秘》读书笔记 2:Spring AOP

    7 一起来看AOP 2009年8月,<一起来看流星雨>开播. 2009年9月,<Spring揭秘>出版. 7.1 AOP核心概念 AOP AOP全称为Aspect-Orient ...

  4. Spring Aop 常见注解和执行顺序

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:juejin.cn/post/7062506923194581029 Spring 一开始最强大的就是 IOC / AOP 两 ...

  5. 彻底理解Spring AOP

    目录 前言 1. AOP概念 2. AOP的实现 3. Spring的IoC理解: 4. Sping知识整理 前言 AOP英文名为Aspect Oriented Programming,意为面向切面编 ...

  6. (转)Spring AOP的底层实现技术

    AOP概述 软件的编程语言最终的目的就是用更自然更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,我们看到编程语言在一步步用更自然.更强大的方式描述软件.AOP是软件开发思想的一个飞跃 ...

  7. Spring AOP中定义切点(PointCut)和通知(Advice)

    本文讨论一下Spring AOP编程中的两个关键问题,定义切点和定义通知,理解这两个问题能应付大部分AOP场景. 如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子. ...

  8. 9000+ 字,彻底征服 Spring AOP ,美滋滋

    基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, ...

  9. Spring AOP概述及底层实现原理

    Spring AOP概述及底层实现原理 aop概述 AOP全称为Aspect Oriented Programming的缩写,意为:面向切面编程.将程序中公用代码进行抽离,通过动态代理实现程序功能的统 ...

最新文章

  1. TCP/IP详解学习笔记(12)-TCP的超时与重传
  2. 【FPGA教程案例2】基于vivado核的NCO正弦余弦发生器设计与实现
  3. EL之Bagging(DTR):利用Bagging对回归问题(实数值评分预测)建模(调2参)
  4. 美链BEC合约漏洞技术分析
  5. android上传文件php,PHP编写安卓文件上传接口
  6. 380天!理想汽车交付量突破30000辆
  7. python epub转txt_怎么将很多个TXT合并成epub?
  8. niceScroll相关配置参数
  9. 读书笔记-互联网鲇鱼法则
  10. Java中如何将中文转换为英文String
  11. iOS 实现二维码的彩色效果
  12. 浙江大学2020计算机考研复试线,浙江大学2020考研复试分数线已公布
  13. 谷歌开始卷自己,AI架构Pathways加持,推出200亿生成模型
  14. 网络编程:网络协议简介
  15. 【文章阅读】【超解像】--Residual Dense Network for Image Super-Resolution
  16. 模块学习(五)——矩阵键盘
  17. 【信号系统实验2】MATLAB—连续时间信号与系统的频域分析
  18. 【Skill】从 WPS 步入Office 365
  19. 【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解
  20. 支付宝手机网页即时到账接口(3)之交易接口请求

热门文章

  1. 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
  2. ZZNU 1993: cots' friends
  3. unittest笔记
  4. 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现
  5. 支付宝支付 第五集:二维码生成工具
  6. xcode新版本single view_动态数组函数系列1|概况-跟以往Excel版本完全不一样玩法的函数...
  7. linux将字符串转小写_Python教程第10讲:字符串的使用
  8. 成都郫县php开发学校_成都各区九年制学校、十二年制学校汇总
  9. python lambda函数_python入门基础之lambda匿名函数
  10. hive查看表中列的信息命令_快速了解hive