本来每天更新,我一般喜欢晚上十二点的时候发文章,结果是不是愚人节?校内网也将是非常有趣,破,把我给打。

。。好吧…从今天开始的话题AOP。AOP太重要了,所以把第二篇文章谈论这个话题,AOP它是Spring中的重要概念。假设这个不理解Web开发中的三大框架的原理,那就呵呵了。

时常听到同学和网友议论Web程序猿大部分时间都是在考皮XML配置,我当时听到也是醉了。所以我要用心学习Web,事实上这里面蕴含的设计模式、算法、架构思想在源代码中体现的淋漓尽致啊。一个大宝库居然视而不见可惜了。

以下就一起品味…

1.静态代理

不要被这个设计模式高大上的名字给吓到了。事实上静态代理还是挺easy理解的,用生活场景来理解静态代理就是:托人办事。

假如一个公司想办一场演唱会。要找明星去哪找呢?明星的经纪人啊,明星哪有时间来和公司谈啊。

所以这个经纪人就是静态代理中的重要角色。来看一张UML图,看看这当中的道理:



当中Target能够理解为明星,TargetInterface能够理解为明星出场延长的标准,TargetProxy能够理解为经纪人。

经纪人依照明星出场的标准和公司谈价格和其它事项等等。

将以上的思想用到Web中假如有这样一个场景:删除或者改动用户信息,在这个过程中须要开启事务。用静态代理模拟这个场景。



这次的代理对象就变成了UserDAOImpl了,而UserDAOProxy就成了上面的经纪人了(代理)。

详细代码:GitHub

事实上讲到这里静态代理还是有非常大的缺点的就是假设明星多了。我的经纪人成倍的增长。这个时候代码量太大了。为了克服这个问题才有动态代理的产生。

2.动态代理

静态代理能够说是动态代理的通俗版,动态代理要解决明星多了。经纪人(代理)增多的现象,同一时候优化代码的效率。思想是差点儿相同的。关键在用代码实现的时候差距还是挺大的。动态代理在Java中一般有JDK代理(JDK本身提供的功能)、Cglib代理、AspectJ等。

详细代码实现看这里 。以下将和静态代理的差别拉出来:

public class ProxyInterceptor implements InvocationHandler {
//代理目标
private Object target ; //引入事务
private Transaction tx ; public ProxyInterceptor(Object target,Transaction tx) {
this.target = target ;
this.tx = tx ;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//开启事务
this.tx.beginTransaction(); method.invoke(target, args); //提交事务
this.tx.commitTransaction();
return null;
} }

当中private Object target ;声明为Object类型表示能够接受不论什么类型的代理对象(各种各样的明星)这样就攻克了。动态代理中的固定代理对象的问题。同一时候代理(经纪人)都要实现一个接口InvocationHandler 这个接口是干嘛的呢?依照意思理解就是事件的处理者。然后重写接口中的invoke方法,且无论方法中的參数是什么,在这里理解为代理处理事务的重要方法。业务都在这种方法中进行调用。就能够实现了。这样动态代理就攻克了应对代理对象多样性的问题。那么什么是AOP 呢?

3.面向切面编程的AOP

什么是AOP呢?有了上面代理的基础用一个样例就能够解说什么是面向切面编程AOP了。

案例背景:如今要取钱,取钱的过程之前ATM机器要开启日志功能、事务功能、安全性检查等等。代码在这里。以下看最重要的代理对象:

package org.kylin.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author UniKyln
* @date 下午11:30:19 2015年3月31日
* @blog:http://blog.csdn.net/unikylin
* @github:https://github.com/unikylin/
* @description 动态代理类
*/
public class DrawManagerProxy implements InvocationHandler { //代理目标类
private Object target ; //面向切面编程中的各种切面
private Logger logger ;
private Security security ;
private Transaction tx ; public DrawManagerProxy(Object target,Logger logger,Security security,Transaction tx) {
this.target = target ;
this.logger = logger ;
this.security = security ;
this.tx = tx ;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//启动日志
this.logger.logger(); //启动事务
this.tx.beginTransaction(); //启动安全性检查
this.security.checkSecurity(); //取钱
method.invoke(target, args); //提交事务
this.tx.commitTransaction(); return null;
}
}

在取钱之前启动了日志、开启事务,然后提交事务。

能够用以下一个图来理解这个过程是怎样发生的?



上一篇文章已经提到这个图了。能够理解运行方法之前的日志记录、事务、安全性框架都是AOP中的切面,而AOP中的通知能够理解为是事务中的开启事务、提交事务这两个方法(切面中的方法能够理解为通知)。

所以能够发现事务、日志、安全性框架和取钱全然是没有耦合的,全然是靠代理类来实现业务的。在实际的开发中每一个人开发每一个人的功能。相似于安全性框架的开发能够独立开发。及时以后去取钱之后须要打印小票,也能够添加一个切面实现这个功能。然后用AOP切面的思想将这些整合在一起形成一个完整的程序。

4.Struts2应用的AOP设计思想

先来看看Struts2的整体架构图:

从图中能够发现非常多的Interceptor,而且这些拦截器在Struts2中地位非常重要。这些拦截器就能够理解为切面,而ActionProxy就相当于代理将这些拦截器和目标方法联系到一起。

事实上Struts2的拦截器设计就是採用AOP实现的,而且Struts2和Spring整合的时候异常的处理和拦截也是使用AOP思想实现的。AOP已经深入到框架的核心设计理念中了。

今天就讲这么多吧,下一节谈谈Servlet而且怎样用Servlet原生API写一个小小的相似于Struts2的框架,简化web开发中遇到的问题。

非常高兴和大家交流学习

自由转载。创意许可,请注明文章来源,来自这里

(http://blog.csdn.net/unikylin)

版权声明:本文博主原创文章。博客,未经同意不得转载。

Web静态和动态项目委托代理基于面向方面编程AOP的更多相关文章

  1. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  2. 面向切面编程(Aop)

    AOP中的概念 AOP(Aspect Orient Programming),也就是面向切面编程.可以这样理解,面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程 ...

  3. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  4. 面向方面编程(AOP)

    简介 如果你很熟悉面向方面编程(AOP),你就会知道给代码增加"切面"可以使代码更清晰并且具有可维护性.但是AOP通常都依赖于第三方类库或者硬编码的.net特性来工作.虽然这些实现 ...

  5. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  6. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  7. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  8. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  9. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

随机推荐

  1. BAT笔试试题常见试题总结含答案(持续更新。。。)

    (1)试题例如以下: class A { int a; short b; int c; char d; }; class B { double a; short b; int c; char d; } ...

  2. Raphaël 中文帮助文档(API)

    http://html5css3webapp.com/raphaelApi.htm

  3. Linux段管理,BSS段,data段,.rodata段,text段

    近期在解决一个编译问题时,一直在考虑一个问题,那就是Linux下可执行程序执行时内存是什么状态,是依照什么方式分配内存并执行的.查看了一下资料.就此总结一下,众所周知.linux下内存管理是通过虚存管 ...

  4. ASA QOS限速

    cisco的Qos限速和H3C的有点区别,不过总体来说,H3C的比较渣,单位是不一样的,H3C 的CAR单位的是kpbs,而cisco police限速时的单位是Bits per seconds,H3 ...

  5. LeetCode——Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  6. CC ANUMLA(STL的运用)

    题目连接:http://www.codechef.com/problems/ANUMLA 题意:给一个序列所有子集和(2^n个子集),复原这个序列... 如:0 1 1 2 2 3 3 4 原序列为1 ...

  7. 在IIS上发布一个WebService,再发布一个网站调用这个WebService(实例)

    首先描述一下先决条件:IIS可用,VS2005可用. 好,现在开始: 首先写一个WebService并把它发布到IIS上: 在IIS上的默认网站下新建一个“虚拟目录”,取名为“webservice1” ...

  8. 项目中那些事|ListView中嵌套ListView问题

    要在一个ListView中放入另一个ListView,也即在一个ListView的每个 item 中放入另外一个ListView.但刚开始的时候,会发现放入的子ListView会显示不完全(我这里只显 ...

  9. 怎样将android studio项目导入eclipse

    如今,越来越多的开源项目都是用android studio来开发的,所以源码都与eclipse有所不同. 以下是将android studio项目导入eclipse的一般步骤: 1. 先解压项目: 2 ...

  10. MyBatis一级缓存引起的无穷递归

    MyBatis一级缓存引起的无穷递归 引言: 最近在项目中参与了一个领取优惠劵的活动,当多个用户领取同一张优惠劵的时候,使用了数据库锁控制并发,起初的设想是:如果多个人同时领一张劵,第一个到达的人领取 ...