zoukankan      html  css  js  c++  java
  • Web静态和动态项目委托代理基于面向方面编程AOP

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

    。。好吧…从今天开始的话题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)

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

  • 相关阅读:
    ROS tf 两个常用的函数
    C/C++ assert()函数用法总结
    drand48 等 随机数生成函数
    PF部分代码解读
    Error "Client wants topic A to have B, but our version has C. Dropping connection."
    launch 文件的写法
    Spring七大框架
    web.xml filter配置
    web.xml listener配置
    web.xml加载过程
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4886891.html
Copyright © 2011-2022 走看看