而AOP是Spring框架中的重要组成部分。

代理模式

  • 介绍:代理对象可以在客户和目标之间起到中介作用,去掉客户端不能看到的内容和服务增添客户需要的额外服务;
  • GOF概括:为其他对象提供一种代理以控制对这个对象的访问。

代理类

关于自定义代理模式我就不赘述了,直接从java.lang.reflect包下的代理模式开始讲,Java自带的代理模式叫Proxy,这个类只有四个公开的方法,最重要的方法是newProxyInstance(),下面是这四个方法,蛮看一下:

  • getInvocationHandler(Object proxy):返回指定代理实例的调用处理程序。
  • getProxyClass():返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。
  • isProxyClass():当且仅当指定的类通过 getProxyClass 方法或
    newProxyInstance 方法动态生成为代理类时,返回 true。
  • static Object newProxyInstance():返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

处理器

Proxy中有很多方法和InvocationHandler相关,说来也很奇怪,虽然Proxy直译是代理,但是它并不真的处理,而是交给了InvocationHandler,InvocationHandler直译是处理器,或者叫调用处理程序,它是一个接口,内部只有一个 invoke() 方法,invoke()才是真正负责代理的方法。

源码:

处理器

既然说了处理器才是真正的代理者,就先从它开始看,invoke有3个参数:

  • 第一个是Proxy本身,使用的话容易会出现死循环,只要关心后面两个即可;
  • 第二个参数是Method,Method显然是反射用的;
  • 而args是数组,而Method的invoke()方法的第二个参数也是数组,直接使用args即可;Method的invoke()方法的第一个参数是Object,指明我们调用的是哪一个类的Method。

我们可以在invoke()之前或者之后做一些处理,这一部分逻辑就由我们自己设计,这一部分的设计也就是我们用代理模式的目的所在。

public class ProxyHandler implements InvocationHandler {
private Object proxied; public ProxyHandler(Object proxied) {
this.proxied = proxied;
} public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO 在执行add()之前的处理 // 转调具体目标对象的方法
return method.invoke(proxied, args); // TODO 在执行add()之后的处理
}
}

抽象主题

public interface AbsBiz {
public void add();
}

真正主题

public class UserBiz implements AbsBiz {
public void add() {
System.out.println("insert into tableName...");
}
}

测试类

这里呢,只要注意一下Proxy的newProxyInstance的三个参数就好了:

  • 第一个参数是ClassLoader,直接通过Class获得即可;
  • 第二个参数是Class,也可以直接通过Class获得即可,但是要明确这个Class指的是接口的Class;
  • 第三个参数是InvocationHandler,也就是前面提到的处理器。
public class Test {
public static void main(String args[]) {
UserBiz biz = new UserBiz();
AbsBiz proxySubject = (AbsBiz) Proxy.newProxyInstance(biz.getClass().getClassLoader(),
biz.getClass().getInterfaces(), new ProxyHandler(biz));
proxySubject.add();
}
}

补充:

自定义代理模式的三个角色:抽象主题(Subject),实际主题(RealSubject)、代理(Proxy),其中实际主题和代理都继承自抽象主题,而SDK下,将Proxy这一部分提了出来,实用性更广。

AOP代理除了JDK的,还有CGlib代理,有兴趣的可以自己看一下。

JavaEE中的MVC(四)AOP代理的更多相关文章

  1. JavaEE中的MVC(五)定制Struts——Action跳转JSP

    在JavaEE中的MVC(三)中,我在Servlet中引入了命令模式的使用,采用Xml配置的方式,实现了一个Servlet调用多个不同的Action类,但是还不能实现页面地跳转,这一篇博客从之前的代码 ...

  2. JavaEE中的MVC(三)定制Struts——命令模式

    注:本文并不讲解Struts框架,只研究这种思想的使用 JavaEE中的MVC(五)定制Struts--Action跳转Jsp 在讲这个之前,先给你们看一下我服务器1.0版本的截图,是不是很可笑,看起 ...

  3. JavaEE中的MVC(一)Dao层彻底封装

    最近Android工作实在难找,考虑是不是该转行做Java了,今天开始,花几天的事件,研究一下JavaEE各层优化. 首先是Dao层 增删改方法封装 使用PreparedStatement执行一条Sq ...

  4. JavaEE中的MVC(二)Xml配置实现IOC控制反转

    毕竟我的经验有限,这篇文章要是有什么谬误,欢迎留言并指出,我们可以一起讨论讨论. 我要讲的是IOC控制反转,然后我要拿它做一件什么事?两个字:"解耦",形象点就是:表明当前类中需要 ...

  5. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  6. 设计模式(四) 手动实现AOP代理

    1.事务的使用: 每次对数据库操作我们都需要开启事务,事务开启后,我们就需要对数据库进行一次或者多次操作,当操作完成后就需要提交事务.比如一个业务中多次操作数据库,但是当某个方法出错的时候,我们需要整 ...

  7. spring源码 — 三、AOP代理生成

    AOP代理生成 AOP就是面向切面编程,主要作用就是抽取公共代码,无侵入的增强现有类的功能.从一个简单的spring AOP配置开始: <?xml version="1.0" ...

  8. Castle框架中的IOC和AOP机制

    反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...

  9. springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题

    解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640 ...

随机推荐

  1. linux 下查找图片文件方法

    通常是通过文件后缀名查找图片文件,如果没有文件后缀的图片或者伪造的图片文件,则这种判定方法将达不到要求.我们可以根据读取文件头进行图片文件类型的判定. 比较流行的图片文件类型有:jpg png bmp ...

  2. STM32 AD采样电压计算公式

    在使用STM32的ADC进行检测电压时必须回涉及到电压值的计算,为了更高效率的获取电压,现在有以下三种方法: 你得到的结果是你当前AD引脚上的电压值相对于3.3V和4096转换成的数字.假如你得到的A ...

  3. 基于FFMPEG的跨平台播放器实现

    基于FFMPEG的跨平台播放器实现 一.背景介绍 FFmpeg是一款超级强大的开源多媒体编解码框架,提供了录制.转换以及流化音视频的完整解决方案,包含了libavcodec.libavformat等多 ...

  4. 项目总结一:响应式之CSS3 媒体查询

    1.<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scala ...

  5. Kinect v2(Microsoft Kinect for Windows v2 )配置移动电源解决方案

    Kinect v2配置移动电源解决方案 Kinect v2如果用于移动机器人上(也可以是其他应用场景),为方便有效地展开后续工作,为其配置移动电源是十分必要的. 一.选择移动电源 Kinect v2原 ...

  6. xmanager 打开centos7图形化窗口

    centos7 最小化安装后,个别时候需要执行一些带图形界面的命令.比如安装oracle,打开xclock等. 前置条件:centos7系统 ,xmanager 已安装 用xclock做测试 1.因为 ...

  7. Go语言中slice使用注意事项

    Go 语言中的slice类型可以理解为是数组array类型的描述符,包含了三个因素: 指向底层数组的指针 slice目前使用到的底层数组的元素个数,即长度 底层数组的最大长度,即容量 因此当我们定义一 ...

  8. TIDB 参数解释

    地址:https://github.com/pingcap/docs-cn/blob/master/op-guide/configuration.md#tidb TiDB --store 用来指定 T ...

  9. 一个比较实用的商业级图表Echarts

      了解了解                    ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼 ...

  10. 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest J Cleaner Robot

    Cleaner RobotCrawling in process... Crawling failed Time Limit:2000MS     Memory Limit:524288KB     ...