AOP思想是将程序中的业务代码与服务代码进行分离,在运行时进行结合。比较强调程序的层次结构,是一种面向切面的编程。而在AOP实现的底层主要用到了动态代理,而动态代理又分为JDK动态代理和CGLIB动态代理,两者的区别是JDK动态代理的实现中业务类必须必须定义接口,而CGLIB没有这个约束,可以说CGLIB更强大;

JDK动态代理实现示例:

// 业务接口定义 
public interface IUnit { 
    void execute(String msg); 
 
// 业务实现类 
public class Unit implements IUnit{ 
    @Override 
    public void execute(String msg) { 
10          System.out.println("execute:"+msg); 
11      } 
12 
13   
14  // 服务实现类 
15  public class Reference { 
16      void showMessage(String msg){ 
17          System.out.println("Reference:"+msg); 
18      } 
19 
20   
21  // 动态代理实现类 
22  public class UnitProxy { 
23      // 业务代码对象 
24      IUnit iunit = new Unit(); 
25      // 服务代码对象 
26      Reference reference = new Reference(); 
27      // 获取代理对象 
28      IUnit getProxy() { 
29          /** 
30           * 函数名:newProxyInstance 
31           * 参数一:代理类类加载器 
32           * 参数二:服务类接口 
33           * 参数三:代理对象调用处理程序实现接口 
34           */ 
35          return (IUnit)Proxy.newProxyInstance(UnitProxy.class.getClassLoader(), iunit 
36                  .getClass().getInterfaces(), new InvocationHandler() { 
37                      /** 
38                       * 函数名:invoke 
39                       * 参数一:代理对象 
40                       * 参数二:调用的服务类方法对象 
41                       * 参数三:服务类方法参数 
42                       */ 
43                      @Override 
44                      public Object invoke(Object proxy, Method method, Object[] args) 
45                              throws Throwable { 
46                          Object retObject = null
47                          reference.showMessage("getProxy before"); 
48                          retObject = method.invoke(iunit, args); 
49                          reference.showMessage("getProxy after"); 
50                          return retObject; 
51                      } 
52                  }); 
53      } 
54 
55   
56  public class TestApplication { 
57      public static void main(String[] args){ 
58          UnitProxy proxy = new UnitProxy(); 
59          IUnit iunit = proxy.getProxy(); 
60          iunit.execute("TestApplication execute"); 
61      } 
62  }

这段代码中的关键函数为 Proxy.newProxyInstance ,我对它的理解为:通过代理类的类加载器和业务类接口,在代理对象处理程序实现接口中,结合服务对象完成代理对象的构建,代理对象的实现本质是业务类与服务类功能的结合;

在AOP开发中通常会提到目标对象、服务对象、代理对象、连接点、切入点、切面、增强,最后结合以上代码说明下:

UnitProxy 类中的iunit 为目标对象,reference 为服务对象,getProxy方法返回的是代理对象。IUnit 接口中定义的接口全部为连接点,切入点是连接点的子集,也就是复合一定条件的连接点。切面就是服务类Reference。增强是服务类Reference中的方法showMessage;

Spring笔记(三)AOP前篇之动态代理的更多相关文章

  1. 【Java EE 学习 51】【Spring学习第三天】【cglib动态代理】【AOP和动态代理】【切入点表达式】

    一.cglib动态代理 1.简介 (1)CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. (2) 用CGlib生成代理类是目标类的子类. (3 ...

  2. Spring笔记:AOP基础

    Spring笔记:AOP基础 AOP 引入AOP 面向对象的开发过程中,我们对软件开发进行抽象.分割成各个模块或对象.例如,我们对API抽象成三个模块,Controller.Service.Comma ...

  3. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只 ...

  4. Spring框架中的JDK与CGLib动态代理

    JDK和CGLib动态代理区别 JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler ...

  5. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(4):JDK动态代理+拦截器

    一.拦截器的理解 学习拦截器之前需要对动态代理和反射有一定的基础. 官方说法:         java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个actio ...

  6. Spring笔记06(Spring AOP的底层实现动态代理)

    1.代理模式readMe: 代理设计模式: 是java中常用的设计模式! 特点: .委托类和代理类有相同的接口或者共同的父类! .代理类为委托类负责处理消息,并将消息转发给委托类! .委托类和代理类对 ...

  7. 二)Spring AOP编程思想与动态代理

    一.aop编程思想 1.面向切面,就是能够不动源码的情况下,从横切面切入新的代码功能. 2.实现原理是动态代理 动态代理的步骤 a.写生产厂家,实现接口,代理只能代理接口 b.动态代理类实现Invoc ...

  8. 浅析Spring中AOP的实现原理——动态代理

    一.前言   最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...

  9. Spring笔记三

    Spring-03 1. AOP 1.1 概念 ​ AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...

随机推荐

  1. Python获取两个ip之间的所有ip

    int_ip = lambda x: '.'.join([str(x/(256**i)%256) for i in range(3,-1,-1)]) ip_int = lambda x:sum([25 ...

  2. Unity3d Shader开发(三)Pass(Culling & Depth Testing)

    剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施.所有几何体都包含正面和反面.剔除基于大多数对象都是封闭的事实:如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因 ...

  3. android报表图形引擎(AChartEngine)demo解析与源码

    AchartEngine支持多种图表样式,本文介绍两种:线状表和柱状表. AchartEngine有两种启动的方式:一种是通过ChartFactory.get***View()方式来直接获取到view ...

  4. Codeforces Round #208 (Div. 2)

    A - Dima and Continuous Line 水题:直接模拟: #include<cstdio> #define maxn 1005 using namespace std; ...

  5. javascript pattern

    bing:javascript pattern baidu:module pattern javascript高级程序设计 姊妹篇:ajax高级程序设计 http://wenku.baidu.com/ ...

  6. javascript 冒泡

    http://www.cnblogs.com/hh54188/archive/2012/02/08/2343357.html http://blog.csdn.net/xuefeng0707/arti ...

  7. Windows Phone 8 开发环境搭建

    原地址:http://blog.csdn.net/md521/article/details/11015139 Windows Phone 8将采用与Windows 8相同的NT内核,这就意味着WP8 ...

  8. 1319-n皇后问题

    描述 在n×n 格的棋盘上放置彼此不受攻击的n 个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一 ...

  9. URAL 1119. Metro(BFS)

    点我看题目 题意  : 这个人在左下角,地铁在右上角,由很多格子组成的地图,每一条边都是一条路,每一条边都是100米.还有的可以走对角线,问你从起点到终点最短是多少. 思路 : 其实我想说一下,,,, ...

  10. HDU 1098 Ignatius's puzzle

    http://acm.hdu.edu.cn/showproblem.php?pid=1098 题意 :输入一个K,让你找一个a,使得f(x)=5*x^13+13*x^5+k*a*x这个f(x)%65等 ...