而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. Ubuntu 中登录相关的日志

    登录相关的日志涉及到系统的安全,所以是系统管理中非常重要的一部分内容.本文试图对登录相关的日志做一个整理. /var/log/auth.log 这是一个文本文件,记录了所有和用户认证相关的日志.无论是 ...

  2. 深入浅出:JavaScript作用域链

    1. 什么是作用域 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量的作用范围. 2. 变量的分类和变量作用域的分类 在JavaScript中,变量分为全局变量和局部变量,与此相对应的,变量 ...

  3. spring框架应用系列一:annotation-config自动装配

    本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7716678.html 解决问题 通过spring XML配置文件, ...

  4. Git相关操作四

    1.克隆远程仓库 git clone remote_location clone_name remote_location为仓库地址,clone_name为要克隆到本地的仓库名称. 2.显示对应克隆地 ...

  5. 本地idea调试spark2.x程序

    1.构建使用idea 构建maven 项目 选择org.scala-tools.archetypes:scala-archetype-simple,然后一直点next,maven最好选中本地配置国内源 ...

  6. JS中的单引号和双引号

    JS里面的单引号和双引号可以同时使用,但是要遵循一定的准则. 最外面用了双引号了,那么里面就不能再用双引号了,因为引号是成双对的,浏览器读到一个双引号后,到第2个双引号时才算结束:同理,浏览器读到一个 ...

  7. myeclipse+tomcat中出现org.apache.juli.logging.LogFactory这样的错误[转]

      将项目部署好后,启动tomcat后报错,java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory 报这个错说明你用的是t ...

  8. LaunchScreen.storyboard 换图的问题

    之前设置了`LaunchScreen.storyboard`,在这个storyboard中加了一个imageView,里面设置了一张图片launch.png,今天需要更换这个启动图片,我就直接去工程里 ...

  9. Windows Nodejs 安装教程

    Windows Nodejs 安装教程 1: 访问官方地址 https://nodejs.org/en/download/ 2: 解压压缩包文件到指定目录 我直接把压缩包解压到C盘根目录下,并将文件夹 ...

  10. Nginx详解以及LNMP的搭建

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...