JavaEE中的MVC(四)AOP代理
而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代理的更多相关文章
- JavaEE中的MVC(五)定制Struts——Action跳转JSP
在JavaEE中的MVC(三)中,我在Servlet中引入了命令模式的使用,采用Xml配置的方式,实现了一个Servlet调用多个不同的Action类,但是还不能实现页面地跳转,这一篇博客从之前的代码 ...
- JavaEE中的MVC(三)定制Struts——命令模式
注:本文并不讲解Struts框架,只研究这种思想的使用 JavaEE中的MVC(五)定制Struts--Action跳转Jsp 在讲这个之前,先给你们看一下我服务器1.0版本的截图,是不是很可笑,看起 ...
- JavaEE中的MVC(一)Dao层彻底封装
最近Android工作实在难找,考虑是不是该转行做Java了,今天开始,花几天的事件,研究一下JavaEE各层优化. 首先是Dao层 增删改方法封装 使用PreparedStatement执行一条Sq ...
- JavaEE中的MVC(二)Xml配置实现IOC控制反转
毕竟我的经验有限,这篇文章要是有什么谬误,欢迎留言并指出,我们可以一起讨论讨论. 我要讲的是IOC控制反转,然后我要拿它做一件什么事?两个字:"解耦",形象点就是:表明当前类中需要 ...
- java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...
- 设计模式(四) 手动实现AOP代理
1.事务的使用: 每次对数据库操作我们都需要开启事务,事务开启后,我们就需要对数据库进行一次或者多次操作,当操作完成后就需要提交事务.比如一个业务中多次操作数据库,但是当某个方法出错的时候,我们需要整 ...
- spring源码 — 三、AOP代理生成
AOP代理生成 AOP就是面向切面编程,主要作用就是抽取公共代码,无侵入的增强现有类的功能.从一个简单的spring AOP配置开始: <?xml version="1.0" ...
- Castle框架中的IOC和AOP机制
反转控制(IOC)和面向切面编程(AOP)技术作为当前比较流行的技术,其优势已受到广泛关注,但是这两项新技术在实际项目上的应用研究却很落后,而且在.NET平台下实现这两项技术没有形成可以广泛套用的框架 ...
- springMVC+MyBatis+Spring 整合(4) ---解决Spring MVC 对AOP不起作用的问题
解决Spring MVC 对AOP不起作用的问题 分类: SpringMVC3x+Spring3x+MyBatis3x myibaits spring J2EE2013-11-21 11:22 640 ...
随机推荐
- Django(二)
QuerySet与惰性机制: 所谓惰性机制:Publisher.objects.all()或者所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个Que ...
- 阿里云负载均衡SLB的文件上传下载问题解决
Nfs同步文件夹配置 问题描述 : javaweb应用部署到云服务器上时,当服务器配置了SLB负载均衡的时候,多台服务器就会造成文件上传下载获取不到文件的错误, 解决办法有:1.hdfs 2.搭建f ...
- WSGI框架及Paste+Pastedeploy+route+webob开发
一.前言 WSGI服务器 一个Web服务器网关接口 (WSGI)服务器实现了WSGI接口的Web服务器端运行的Python的Web应用程序. 为什么需要WSGI? 传统的Web服务器不理解或有任何方式 ...
- C#基本功之泛型
一.没有泛型之前 在没有泛型之前,我们是怎么处理不同类型的相同操作的: 示例1 //下面是一个处理string类型的集合类型 public class MyStringList { string[] ...
- 【Telerik控件学习】-建立自己的图形编辑工具(Diagram)
Telerik提供了RadDiagram控件,用于图形元素的旋转,拖拽和缩放.更重要的是,它还拓展了许多绑定的命令(复制,剪切,粘贴,回退等等). 我们可以用来组织自己的图形编辑工具. Step1.定 ...
- css3+div画大风车
今天已经礼拜三了,周天小颖家的佩佩就要结婚啦,小颖要去当伴娘了,哈哈哈哈哈哈,想想都觉得乐开了花,不过之前她给我说让我当她伴娘时,我说我要减肥,不然她那么瘦弱,我站旁边就感觉像一个圆滚滚的小皮球,小颖 ...
- grunt-contrib-connect自动刷新html页面
grunt-contrib-connect可以在我们开发的时候自动刷新页面,省去了手动刷新的时间. 下面说一下如何配置grunt-contrib-connect 1.下载插件包 npm install ...
- 使用Identity Server 4建立Authorization Server (1)
预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 本文内容基本完全来自于Identity Server 4官方文档: https://identitys ...
- thinkphp项目在apache服务器中“去掉”index.php后出现找不到url的问题
今天将MAC中apache环境下的thinkphp项目移植到windows中得apache环境下.原本都是apache环境,而且配置都一样,死活给我这样的提示: Not Found The reque ...
- visual filters 滤镜 ie
滤镜ie9开始就废弃了,用来对ie4-8实现一些多媒体动画之类的效果.可以添加到标准的HTML控件上,例如text,图片 包含:1.界面滤镜 (Procedural Surfaces)2.静态滤 ...