AOP本质是拦截,拦截的本质是代理,代理分动态和静态,静态代理很简单,功能有限,应用不是很广泛,Spring中主要用的动态代理。
 
用Spring做开发,AOP的实现仅仅是编程实现一些接口,然后配置一下即可。这个可以参看“Spring AOP 模型”一文。
 
为什么配置一下即可,究竟Spring框架内部做了如何的处理,实现了代理。下面可以看看下面的例子就明白了。
/**
* 被代理类
*/
public class MessageWriter{ /** * 业务方法 */ public void writeMessage() { System.out.print("World"); }
}
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation; /**
* 实现包围通知,实际就是方法拦截器,MethodInterceptor是AOP联盟定义的接口.
*/
public class MessageDecorator implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { System.out.print("Hello "); Object retVal = invocation.proceed(); System.out.println("!"); return retVal; }
}
import org.springframework.aop.framework.ProxyFactory; /**
* AOP测试
*/
public class HelloWorldAOPExample { public static void main(String[] args) { //目标对象(被代理的对象) MessageWriter target = new MessageWriter(); //产生一个代理工厂 ProxyFactory pf = new ProxyFactory(); //添加代理工厂的拦截器 pf.addAdvice(new MessageDecorator()); //设置被代理对象 pf.setTarget(target); //获取一个代理实例 MessageWriter proxy = (MessageWriter) pf.getProxy(); //从目标对象直接输出信息 target.writeMessage(); System.out.println("\n------------"); //从代理对象输出信息 proxy.writeMessage(); }
}
例子中用ProxyFactory类来创建目标对象的代理,同时织入通知。通过调用addAdvice(new MessageDecorator()),把MessageDecorator通知传给ProxyFactory,然后通过调用setTarget(target)设定织入的目标对象。设定了目标对象,也织入了通知,就可以调用ProxyFactory.getProxy()来获得一个代理对象。
 
运行结果:
- Using JDK 1.4 collections 
World 
------------ 
Hello World!

Process finished with exit code 0

 
从中可以看到,Spring的代理很牛,不一定要求代理和被代理类都要实现同一个接口,Spring可以代理任何的类,当然final类除外,因为final类不允许继承。

Spring AOP 本质相关推荐

  1. Spring AOP本质(7)

    Spring AOP本质(7) 上一个里面,给出静态方法切点匹配的例子,现在给出一个动态的实现例子: 没有 /** * 业务组件 */ public class SampleBean {     pu ...

  2. Spring AOP 本质(3)

    Spring AOP 本质(3) Spring AOP很牛,AOP是OOP的补充,而非竞争者. 前面的例子离实际的应用太遥远.不足以显式AOP的力量,现在就用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. sap data service安装方法
  2. golang 值得注意的地方(2则)
  3. 删除静态 IP 路由
  4. Bit-Z图解“推荐返佣”那些事儿
  5. java 读取oracle的blob/clob
  6. Visual Studio Code 保存代码时报Applying code action Organize Imports
  7. 北京环球度假区:尚未发布票务信息,未面向公众销售任何门票
  8. Realme XT发布会PPT曝光:后置6400万四摄+骁龙712
  9. windows下编译c语言文件路径,解决JNI在Windows环境下因长路径导致编译失败问题
  10. linux xargs命令
  11. 如何使用计算机中的导出,(excel在电脑的哪个文件里?)excel怎么把查找的导出
  12. python与office结合可以干什么-震惊!当Python遇到Excel后,将开启你的认知虫洞
  13. php无缝滚动文字,使用JS如何实现文字无缝滚动
  14. 元启发式算法之一:蝙蝠算法BA
  15. python没有pygame_教程丨python 做一个简单的MP3
  16. 【开源教程8】疯壳·开源编队无人机-GPIO(LED 航情灯、信号灯控制)
  17. 互联网热点自动获取工具的实现
  18. Linux fflush 函数
  19. bboss quartz定时任务使用案例介绍
  20. java Date类型:24小时制和12小时制

热门文章

  1. 如何在 ASP.NET Core 中使用 LazyCache
  2. 浅析 record 使用场景
  3. WPF开源控件扩展库 - MaterialDesignExtensions
  4. 听说用 C# 写 TensorFlow 更高效?
  5. 都在讨论高并发,结果连并发量、TPS、QPS都分不清
  6. 安装VSCode作为常用的文本编辑器
  7. 面试官:你连HTTP请求Post和Get都不了解?
  8. 指令打印与驱动打印随笔
  9. 应用性能问题解决实际案例
  10. 「分布式系统理论」系列专题