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类不允许继承。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/74942,如需转载请自行联系原作者

Spring AOP 本质(1)相关推荐

  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 AOP 本质

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

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

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

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

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

  6. 彻底理解Spring AOP

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

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

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

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

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

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

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

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

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

最新文章

  1. c++运算符和结合性
  2. BZOJ 4557 JLOI2016 侦查守卫 树形dp
  3. typora 公式对齐_都0202年了还不会用 Typora——看Typora使用教程这篇就够了
  4. 制作自己的linux内核,打造属于你自己的Linux系统
  5. nmealib linux编译,nmealib的使用可以缩短GPS的开发周期
  6. MySQL之索引优化
  7. ansys怎么使用anand模型_【干货】经典ANSYS 与 Workbench如何实现联合仿真,相互切换操作。...
  8. finallshell使用_FinalShell使用---Xshell的良心国产软件
  9. Logstash读取Kafka数据写入HDFS详解
  10. 【thinkphp 5 在nginx 环境下路由无法生效(404 500错误 )的解决方法】
  11. 计算机提示pdf不能加载,打开电脑中的PDF文档无法显示内容提示Please wait怎么解决...
  12. 启用计算机的快捷键,电脑开机启动项选择快捷键大全
  13. 测试用例(等价类法、边界值法、因果图法、判定表法、场景法、正交试验法、功能图法)
  14. SaltStack配置管理
  15. java 自幂数_JAVA 编程01:用JAVA语言实现所有自幂数的输出
  16. Nginx的模块与工作原理
  17. 某二级支行网络的设计与实现
  18. 关于膝关节支具的使用方法
  19. 中国飞行娱乐(IFE)市场现状研究分析与发展前景预测报告(2022)
  20. 计算机什么行不变裂变的知识,科普知识竞赛参考题目

热门文章

  1. DBeaver 7.2.4 发布,可视化数据库管理平台
  2. 使用class-dump 和Hopper实现简单反编译
  3. 作为前端程序员,你不能不知道的这个小技巧
  4. php随机获取数组的值
  5. 简单的NLPIR分词 JAVA 实现
  6. APK解包修改后,重新打包
  7. LINUX下载编译sqlite-jdbc(支持mips64el/loongarch64的jar包下载)
  8. CSDN APP又出错了,看不到博文
  9. LINUX自带库与系统重名怎么办
  10. 编译OpenJDK12:a microsoft compiler is required