代理模型-静态代理And动态代理

前言

        在面向对象系统中,有些对象由于某些原因,比如对象创建开销很大,或者某些操作需要安全控制,直接访问会给使用者或者系统结构带来很多麻烦。为了解决这个场景的途径之一,便是增加一个中间层作为代理层。这边是代理模式。

        代理模式 ,作为23种经典设计模式之一在很多地方有用到,其目的是为其他对象提供一种代理以控制对这个对象的访问。通过代理可以为原对象附加多种用途。

        代理模式又分为动态代理和静态代理。而静态代理需要自己声明代理类对象。动态代理不需要声明代理类对象,通过程序自动生成。

        代理模式更多的是通过增加一个中间层作为代理层对访问代理对象做额外的控制,真正操作还是代理对象进行操作。对于装饰器模式而已,而是在原对象增加新的功能

        基于对代理模式应用场景的理解,我想到一个场景,找董事长签字的时候,一般是找秘书。先由秘书检查完文件,秘书再将文件拿给董事长签字。在这个场景下,秘书便是代理层,代理对象是董事长,对董事长签文件这个过程进行了控制(即检查文件)。

静态代理

秘书和董事长签字这个场景,用静态代理怎么写呢?其结构如下:

        需要有个基础类(People),用来声明代理层和代理对象共同的方法,代理对象继承基础类,并真正实现具体方法。代理层同样继承基础类,来实现相应的方法,但与代理对象不同的是,代理层可以在实现方法时加额外的能力,如校验功能。然后通过调用代理对象来实现真正的操作。

在写代码的时候,根据基础类(People) --> 代理对象(Boss) --> 代理层(Secretary)顺序编写。

基础类

首先声明一个基础类--People,里面只有一个方法声明,签字sign。代理对象和代理层基层基础接口,从而对外面展示是一样的动作。

public interface People {
      void sign(String file);
}

代理对象

然后写代理对象,也就是真正签字的人 - 董事长(Boss)。董事长继承基础类People

public class Boss implements People {
    @Override
    public void sign(String file) {
        System.out.println("我是董事长,我来签字,文件为:"+ file);
    }
}

代理层

然后写代理层 -- 秘书(Secretary)。秘书也继承基础类People,从而和董事长有一样的方法,但秘书要多一步检查文件(checkContract)的操作。

public class Secretary implements People {
    private People boss;


    public Secretary(People p){
        this.boss = p;
    }


    @Override
    public void sign(String file) {
        System.out.println("我是秘书,签字的请找我,请您在外稍等一下");
        if (checkContract(file)){
            boss.sign(file);
        }else {
            System.out.println("我是秘书,文件不合格,请回");
        }
    }

    public boolean checkContract(String file){
        System.out.println("我是秘书,我检查文件");
        if ("合同".equals(file)){
            return true;
        }
        return false;
    }
    
}

调用方法

public static void main(String[] args) {
    Secretary secret = new Secretary(new Boss());
    secret.sign("合同");
    secret.sign("协议");
}

调用结果如下。可见虽然调用的是代理层 -- 秘书(Secretary)的签字方法,但真实签字的还是代理对象 - 董事长(Boss)。但代理层提供一种代理以控制对这个对象的访问。当然通过代理还可以为原对象附加其他功能。

动态代理

        秘书除了可以代理董事长,也可以代理相关部门进行改签盖章,若要代理部门的时候,显然现在的写法是行不通的。

        上面的例子中代理类代理层 -- 秘书(Secretary)实现了抽象角色的接口(People),并在属性中声明了被代理的对象(Boss,也是Peple的实现类),导致代理类受到限制无法通用。为了让代理类更具有通用性,只需要使用反射动态的获取抽象接口的类型,进而获取相关方法实现动态代理。

        若想实现秘书除了可以代理董事长,也可以代理相关部门进行改签盖章这个功能,则需要用到动态代理,使用到了反射。

Jdk代理

第一个方案,Jdk代理,即使用Java原生反射机制进行动态代理。

        首先除了上面写的代理基础类People和代理对象Boss。现在再加一种要代理的对象-- 部门

新的代理基础类--Organization(部门)

public interface Organization {
      void sign(String file);
}

新的代理对象--LegalDepartment(法务部)

public class LegalDepartment implements Organization{
    @Override
    public void sign(String file) {
        System.out.println("我是法务部,我来签字,文件为:"+ file);
    }
}

        这个时候代理层怎么写呢?答案:实现 InvocationHandler 接口,表明该类是一个动态代理执行类。

其重点有两个

1. InvocationHandler 接口内有一实现方法如下: public Object invoke(Object proxy, Method method, Object[] args) 。使用时需要重写这个方法

2.获取代理类,需要使用 Proxy.newProxyInstance(Clas loader, Class[] interfaces, InvocationHandler h) 这个方法去获取Proxy对象(Proxy 类类型的实例)。

代码如下:

public class Secretary implements InvocationHandler {
    private Object proxyTarget;

    public Object getProxyInstance(Object target) {
        this.proxyTarget = target;
        // 第一个参数,是类的加载器
        // 第二个参数是代理对象的接口类型,
        // 第三个参数就是代理对象类本身
        return Proxy.newProxyInstance(proxyTarget.getClass().getClassLoader(), proxyTarget.getClass().getInterfaces(), this);
    }


    /**
     *
     * @param proxy 调用该方法的代理对象
     *
     * @param method 在代理对象上调用的接口方法
     *
     * @param args 在代理实例上的方法调用中传递的参数
     *
     * @return 代理对象某个方法的执行结果
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object methodObject = null;

        System.out.println("我是秘书,签字的请找我,请您在外稍等一下");
        if (checkContract((String) args[0])){
            methodObject = method.invoke(proxyTarget, args);
        }else {
            System.out.println("我是秘书,文件不合格,请回");
        }

        return methodObject;
    }


    public boolean checkContract(String file){
        System.out.println("我是秘书,我检查文件");
        if ("合同".equals(file)){
            return true;
        }
        return false;
    }
}

调用方法

public static void main(String[] args) {
    Secretary secret = new Secretary();
    // 继承父类方法
    Pepple boss = (Pepple) secret.getProxyInstance(new Boss());
    boss.sign("合同");
    Organization  legalDepartment = (Organization) secret.getProxyInstance(new LegalDepartment());
    legalDepartment.sign("协议");
}

调用结果,可见现在代理层可以实现了通用。

CgLib代理

        第二个方案,CGLib代理,即要引入cglib.jar进行使用,从而实现动态代理。与Jdk代理不同的是,Jdk代理对象需要继承基础类,而CGLib代理可以直接使用子类,不需要基础类,但在使用的时候直接使用子类,在实现。此外,Jdk代理只用代理Public方法,CGLib可以代理protected方法。

代理层的修改        

        代理层继承MethodInterceptor,在getProxyInstance方法中实现代理对象的方法改为了Enhancer.create();重新方法改为了intercept();

public class Secretary implements MethodInterceptor {
    private Object proxyTarget;

    public Object getProxyInstance(Object target) {
        this.proxyTarget = target;
        
        return Enhancer.create(target.getClass(), target.getClass().getInterfaces(), this);
    }

    /**
     *
     * @param  o 调用该方法的代理对象
     *
     * @param method 在代理对象上调用的接口方法
     *
     * @param objects 在代理实例上的方法调用中传递的参数
     *
     * @methodProxy 它的作用是用于执行目标(委托类)的方法,,
     * 官方的解释是速度快且在intercept内调用委托类方法时不用保存委托对象引用。
     *
     * @return 代理对象某个方法的执行结果
     * @throws Throwable
     */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object methodObject = null;

        System.out.println("我是秘书,签字的请找我,请您在外稍等一下");
        if (checkContract((String) objects[0])){
            methodObject = method.invoke(proxyTarget, objects);
        }else {
            System.out.println("我是秘书,文件不合格,请回");
        }
        return methodObject;
    }
    
    public boolean checkContract(String file){
        System.out.println("我是秘书,我检查文件");
        if ("合同".equals(file)){
            return true;
        }
        return false;
    }

}

调用方法

public static void main(String[] args) {
    Secretary secret = new Secretary();
    // 可以直接继承子类
    Boss boss = (Boss)secret.getProxyInstance(new Boss());
    boss.sign("合同");

    LegalDepartment legalDepartment = (LegalDepartment) secret.getProxyInstance(new LegalDepartment());
    legalDepartment.sign("合同");

}

调用结果

  1. CGLib (基于子类的动态代理)使用的是方法拦截器 MethodInterceptor ,需要导入 cglib.jar 和 asm.jar 包

  2. 基于子类的动态代理,返回的是子类对象

  3. 方法拦截器对 protected 修饰的方法可以进行调用

总结

        通过代理模式 实现为其他对象提供一种代理以控制对这个对象的访问,从而为原对象附加多种用途。

        代理模式又分为动态代理和静态代理。而静态代理需要我们自己写代理类对象。动态代理不需要写代理类对象,通过程序自动生成。

        代理模式更多的是通过增加一个中间层作为代理层对访问代理对象做一下控制,真正操作还是代理对象进行操作。对于装饰器模式而已,而是在原对象增加新的功能

静态代理

某个对象提供一个代理,代理角色固定,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。

动态代理

代理角色不固定,更加灵活,代理对象由Java反射机制动态产生,无需程序员手动编写它的源代码。

        其中动态代理又分为Jdk代理和CgLib代理,其区别在于

原理

Jdk代理

  1. 使用Java原生反射机制,代理层实现 InvocationHandler 接口

  2. 由于Jdk代理对象需要继承基础类,需要代理对象需要实现基础类的接口

CgLib代理

  1. CGLib代理可以直接使用子类,不需要基础类,但在使用的时候直接使用子类,

参考资料

装饰器:装饰器模式 | 菜鸟教程

适配器:适配器模式 | 菜鸟教程

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ef-orm A Simple OR-Mapping framework on multiple databases. 使用手册(中文)http://geequery.github.io/ef-orm/manual/EF-ORM-user-guide.docx  使用示例工程 https://github.com/GeeQuery/ef-orm/tree/master/orm-tutorial EF-ORM是一个轻量,便捷的Java ORM框架。并且具备若干企业级的应用特性,如分库分表、JTA事务等。 代码生成插件for eclipse(请在eclipse中Help/Install new software后输入地址并安装)http://geequery.github.io/plugins/1.3.x/特点一 EF的设计的一个主要目的是提高开发效率,减少编码工作,让开发者“零配置”“少编码”的操作数据库大部分功能。 例如:数据库查询条件的传入问题是所有ORM框架都不能回避的一个问题,所以我经常在想——既然我们可以用向DAO传入一个Entity来实现插入操作,为什么就不能用同样的方法来描述一个不以主键为条件的update/select/delete操作?为什么DAO的接口参数老是变来变去?为什么很多应用中,自行设计开发类来描述各种业务查询条件才能传入DAO?为什么我们不能在数据访问层上花费更少的时间和精力?   JPA1.0和早期的H框架,其思想是将关系型数据库抽象为对象池,这极大的限制了本来非常灵活的SQL语句的发挥空间。而本质上,当我们调用某H框架的session.get、session.load、session.delete时,我们是想传递一个以对象形式表达的数据库操作请求。只不过某H框架要求(并且限制)我们将其视作纯粹的“单个”对象而已。JPA 2.0为了弥补JPA1.0的不足,才将这种Query的思想引入为框架中的另一套查询体系——Criteria API。事实上针对单个对象的get/load/persist/save/update/merge/saveOrUpdate API和Criteria API本来就为一体,只不过是历史的原因被人为割裂成为两套数据库操作API罢了。   因此,对于关系型数据库而言——Entity和Query是一体两面的事物,所谓Query,可以包含各种复杂的查询条件,甚至可以作为一个完整的SQL操作请求的描述。为此,EF彻底将Entity和Query绑在了一起。这种思想,使得—— 开发人员需要编写的类更少。开发人员无需编写其他类来描述复杂的SQL查询条件。也无需编写代码将这些查询条件转换为SQL/HQL/JPQL。DAO层也不会有老要改来改去的接口和API,几乎可以做到零编码。 对单个对象进行CRUD的操作API现在和Criteria API合并在一起。Session对象可以直接提供原本要Criteria API才能提供实现的功能。API大大简化。 IQueryableEntity允许你将一个实体直接变化为一个查询(Query),在很多时候可以用来完成复杂条件下的数据查询。比如 ‘in (?,?,?)’, ‘Between 1 and 10’之类的条件。 xxQL有着拼装语句可读性差、编译器无法检查、变更维护困难等问题,但是却广受开发人员欢迎。这多少有历史原因,也有Criteria API设计上过于复杂的因素。两者一方是极端灵活但维护困难,一方是严谨强大而学习和编写繁琐,两边都是极端。事实上JPA的几种数据查询方式存在青黄不接的问题。选择查询语言xxQL,项目面临后续维护困难,跨数据库移植性差;选择Criteria API,代码臃肿,操作繁琐,很多人望而却步。EF的设计思想是使人早日摆脱拼装SQL/HQL/JPQL的困扰,而是用(更精简易用的)Criteria API来操作数据库。 基于轻量级Criteria API的操作方式,使得对数据库的变更和重构变得非常轻松,解决了SQL语句多对软件维护和移植造成产生的不利影响。 阅读推荐:第3、4章 特点二,将SQL的使用发挥到极致,解决SQL拼凑问题、数据库移植问题 大部分OLTP应用系统到最后都不免要使用SQL/JPQL,然而没有一个很好的方法解决SQL在多种数据库下兼容性的问题。 EF-ORM中采用了独特的SQL解析和改写技术,能够主动检查并确保SQL语句或者SQL片段在各个数据库上的兼容性。 EF中除了Criteria API以外,可以直接使用“SQL语句”或者“SQL片段”。但是这些SQL语句并不是直接传送给JDBC驱动的,而是 有着一个数据库方言层,经过方言层处理的SQL语句,就具备了在当前数据库上正确操作的能力。这相当于提供了一种能跨数据库操作的SQL语言。(E-SQL) E-SQL不但解决了异构数据库的语法问题、函数问题、特殊的写法问题,还解决了动态SQL问题、绑定变量扩展等特性。 对于各种常用SQL函数和运算符,都可以自动转换为当前数据库支持的方言来操作。其函数支持也要多于HQL支持的函数。 阅读推荐:第7、8章 特点三,可能是业界最快的ORM框架. 得益于ASM的动态代码生成技术,部分耗时操作通过动态代码固化为硬编码实现,EF-ORM的大部分操作性能要超过已知的其他框架。 实际性能测试表明,EF的大部分操作都要快于Hiberante和MyBatis, 部分操作速度甚至数十倍于上述框架。 EF在极限插入模式下,甚至刷新了每秒10万条写入的记录。远远超过了其他框架。 一个初步的性能测试:测试代码:http://geequery.github.io/ef-orm/manual/performance-test.rar 测试报告:http://geequery.github.io/ef-orm/manual/performance-compare.docx 阅读推荐:第9、17章 特点四,分库分表 开发过程中参照了Hibernate Shards、Alibaba TDDL、Cobar等框架,也是基于词法分析器来提取SQL参数,并计算路由。 能支持分库维度含糊等场景下的分库分表。以及包括多库多表下的 order by , distinct, group by, having等操作。 阅读推荐:第10章 特点五,常用DDL操作的封装 从数据库元数据访问,到建表,创建约束,创建sequence等各种DDL操作进行了封装,用户无需编写各种SQL,可以直接通过API操作数据库结构。 尤其是ALTER TABLE等修改数据库的语句,各种不同的RDBMS都有较大语法差异。特点六、解决各种跨RDBMS的移植问题 1、DML操作、自增值处理与返回、查询这些不同数据库操作差异很大的东西,都了统一的封装。 2、DDL操作、建表、删表、trunacte,Sequence创建和TABLE模拟Sequence等,都做了支持。 3、对SQL语法操作和函数的改写与支持。其他特性轻量 该框架对应用环境、连接池、 是否为J2EE应用等没有特殊要求。可以和EJB集成,也可与Spring集成,也可以单独使用。整个框架只有两个JAR包,模块和功能都较为轻量。依赖少 整个框架只有三个jar库。间接依赖仅有commons-lang, slf4j等7个通用库,作为一个ORM框架,对第三方依赖极小。简单直接的API 框架的API设计直接面向数据库操作,不绕弯子,开发者只需要数据库基本知识,不必学习大量新的操作概念即可使用API完成各种DDL/DML操作。 最大限度利用编译器减少编码错误的可能性 API设计和元数据模型(meta-model)的使用,使得常规的数据库查询都可以直接通过Criteria API来完成,无需使用任何JPQL/HQL/SQL。可以让避免用户犯一些语法、拼写等错误。JPA2规范兼容 使用JPA 2.0规范的标准注解方式来定义和操作对象。(但整个ORM不是完整的JPA兼容实现)更高的性能 依赖于ASM等静态字节码技术而不是CGlib,使得改善了代理性能;依赖于动态反射框架,内部数据处理上的开销几乎可以忽略。操作性能接近JDBC水平。对比某H开头的框架,在写入操作上大约领先30%,在大量数据读取上领先50%以上。更多的性能调优手段 debug模式下提供了大量性能日志,帮您分析性能瓶颈所在。同时每个查询都可以针对batch、fetchSize、maxResult、缓存、级联操作类型等进行调整和开关,可以将性能调到最优。可在主流数据库之间任意切换 支持Oracle、MySQL、Postgres、MSSQL、GBase、SQLite、HSQL、Derby等数据库。除了API方式下的操作能兼容各个数据库之外,就连SQL的本地化查询也能使之兼容。JMX动态调节 可以用JMX查看框架运行统计。框架的debug开关和其他参数都可以使用JMX动态调整。动态表支持 表结构元数据的API也向用户开放,同时支持在使用过程中,灵活调整映射关系,因此用户可以用API动态的创建表结构的模型,从而实现各种动态类型和表的映射(例如POJO中包含一个Map,用于映射各种动态扩展的字段)企业级特性支持 SQL分析,性能统计,分库分表,Oracle RAC支持,读写分离支持 标签:eform
目 录 译者序 前言 第1章 Cisco故障诊断与排除结构化方法 1.1 简介 1.2 故障诊断与排除策略 1.2.1 网络互连的复杂性 1.2.2 问题解决模型 1.2.3 信息和文档列表 1.3 Cisco故障诊断与排除资源 1.3.1 Cisco Connection Online 1.3.2 技术支持中心 1.3.3 其他Cisco资源 第2章 网络测试、管理与分析 2.1 简介 2.2 物理层测试设备 2.3 数字接口测试 2.4 网络管理及其作用 2.4.1 SNTP概览 2.4.2 Cisco路由器和交换机上的SNMP 2.5 网络监视 2.6 网络分析 2.6.1 协议分析 2.6.2 报文分析与Sniffer 2.7 网络管理软件包和平台 2.7.1 CiscoWorks网络管理软件 2.7.2 CiscoWorks for Switched Internetworks复习思考题 第3章 CISCO诊断工具 3.1 简介 3.2 路由器的功能特性和体系结构 3.2.1 路由功能 3.2.2 交换功能 3.2.3 Cisco 7000系列路由器体系结构 3.2.4 Cisco 7500系列路由器体系结构 3.2.5 Cisco 4000/2500系列路由器 体系结构 3.3 Cisco 7000系列路由器交换过程 的报文流 3.4 快速交换与缓存技术 3.4.1 快速交换 3.4.2 自治交换 3.4.3 硅交换 3.4.4 先进的交换技术 3.5 路由处理器的特殊功能 3.6 Cisco 7000系列路由器的队列和缓冲区 3.6.1 缓冲区参数 3.6.2 接口缓存队列 3.6.3 接口缓冲区 3.6.4 show buffers命令 3.7 Cisco 4000/2500系列路由器的 队列与缓存 3.8 故障诊断与排除命令 3.8.1 show命令 3.8.2 debug命令 3.8.3 ping命令 3.8.4 trace命令 3.9 理解Cisco错误消息 3.9.1 错误消息格式 3.9.2 Traceback Report 3.10 错误消息和事件信息的日志 3.11. 核心转储(CORE DUMP) 3.12. 小结 复习思考题 第4章 WAN介质(I)串行线路和X.25 故障诊断与排除 4.1 简介 4.2 HDLC串行链路故障诊断与排除 4.2.1 show interface命令 4.2.2 CSU/DSU返回测试(Loopback test) 4.2.3 show controllers命令 4.2.4 show buffers命令 4.2.5 debug serial interface命令 4.3 调制解调器的连通性 4.4 X.25连通性故障诊断与排除 4.4.1 show命令 4.4.2 debug x25 events命令 4.5 .X.25 动态路由故障的诊断与排除 复习思考题 第5章 WAN介质(II)帧中继故障诊断与 排除 5.1 简介 5.2 基础知识 5.2.1 封装类型 5.2.2 LMI类型 5.2.3 DLCI映射 5.3 帧中继子接口 5.4 点到点与点到多点 5.5 基于帧中继的路由 5.5.1 水平分割 5.5.2 非广播介质引发的问题 5.6 帧中继SHOW命令 5.6.1 show interface命令 5.6.2 show frame-relay命令 5.6.3 show frame-relay命令 5.6.4 show frame-relay map命令 5.7 帧中继调试命令 5.7.1 debug frame-relay lmi命令 5.7.2 debug frame-relay events命令 5.7.3 debug frame-relay packet命令 5.8 拥塞控制和流量整形 5.8.1 允许丢弃列表 5.8.2 广播队列 5.8.3 DLCI优先 5.9 帧中继故障诊断与排除示例 5.9.1 示例1:参数不匹配 5.9.2 示例2:多点与逆向ARP 5.9.3 示例3:基于帧中继的路由 复习思考题 第6章 ISDN连接的故障诊断与排除 6.1 简介 6.2 ISDN配置问题 6.2.1 ISDN交换类型 6.2.2 服务轮廓标识 6.2.3 拨号映射配置语句 6.2.4 拨号列表 6.2.5 PPP与多链路PPP 6.2.6 使用ISDN备份 6.2.7 与ISDN相关的路由问题 6.2.8 ISDN配置实例 6.3 ISDN SHOW命令 6.3.1 Show Interface--D信道 6.3.2 Show Interface--B信道 6.3.3 Show ISDN status命令 6.3.4 Show dialer命令 6.3.5 Show isdn memory命令 6.4 ISDN Debug命令 6.4.1 debug isdn q921命令 6.4.2 debug isdn q931命令 6.4.3 debug isdn events命令 6.4.4 debug dialer命令 6.4.5 debug ppp authentication 命令 6.4.6 debug ppp negotiation命令 6.5 ISDN 故障诊断与排除小结 复习思考题 第7章 IP(Ⅰ):静态路由RIP、IGRP、 EIGRP 7.1 简介 7.2 TCP/IP诊断命令 7.2.1 Ping和Trace命令 7.2.2 Ping命令 7.2.3 Trace命令 7.2.4 Show 命令 7.2.5 Debug命令 7.3 TCP/IP故障解决方案 7.4 局域网连通性问题 7.4.1 设置IP地址 7.4.2 ARP 7.4.3 IP名字解析 7.5 广域网连通性问题 7.5.1 缺省网关 7.5.2 静态和动态路由选择 7.5.3 代理ARP 7.6 IP访问列表 7.6.1 标准访问列表 7.6.2 扩展访问列表 7.7 Internet控制消息协议 7.8 RIP故障诊断与排除 7.8.1 老版本的RIP和新版本的RIP 7.8.2 Show命令 7.8.3 Debug命令 7.8.4 RIP故障诊断与排除示例— 第一部分 7.8.5 RIP故障诊断与排除示例— 第二部分 7.9 IGRP故障诊断与排除 7.9.1 Show命令 7.9.2 Debug命令 7.9.3 IGRP故障诊断与排除示例 7.10 IP EIGRP故障诊断与排除 7.10.1 EIGRP特性 7.10.2 IP EIGRP Show命令 7.10.3 IP EIGRP的调试 7.10.4 EIGRP故障诊断与排除示例 复习思考题 第8章 IP(II):OSPF和BGP故障 诊断与排除 8.1 简介 8.2 OSPF故障诊断与排除 8.2.1 OSPF的特征 8.2.2 OSPF show命令 8.2.3 调试OSPF 8.2.4 OSPF故障诊断与排除示例 8.3 BGP故障诊断与排除 8.3.1 BGP的特性 8.3.2 BGP Show命令 8.3.3 BGP的调试 8.3.4 BGP故障诊断与排除示例 8.4 重新分发 8.4.1 修改路由距离 8.4.2 应用分发列表 8.4.3 路由映射语句的功能 第7、8章 复习思考题 第9章 Novell连通性故障诊断与排除 9.1 简介 9.2 Novell客户-服务器的连接序列 9.3 Novell路由器诊断工具 9.3.1 Ping 9.3.2 Show命令 9.3.3 Debug命令 9.4 IPX封装不匹配 9.5 SAP、路由和访问过滤 9.5.1 SAP过滤 9.5.2 控制GNS响应 9.5.3 路由过滤器 9.5.4 IPX访问过滤器 9.6 客户-服务器远程连接故障诊断 9.7 SAP带宽消耗 9.8 IPX EIGRP 9.8.1 IPX EIGRP诊断工具 9.8.2 EIGRP分发列表 9.9 基于IPX的NetBIOS 9.10 广域网环境中的IPX 9.10.1 基于帧中继IPX 9.10.2 基于ISDN的IPX 9.11 IPX故障诊断与排除示例 复习思考题 第10章 APPLETALK连通性故障 诊断与排除 10.1 简介 10.2 AappleTalk客户-服务器的连接序列 10.3 AappleTalk路由器诊断工具 10.3.1 ping命令 10.3.2 NBP测试命令 10.3.3 show命令 10.3.4 debug命令 10.4 局域网中的AappleTalk故障 诊断与排除 10.4.1 AppleTalk 阶段I和阶段II 10.4.2 AppleTalk过滤和访问控制 10.5 广域网中的AappleTalk故障 诊断与排除 10.5.1 基于帧中继的AppleTalk 10.5.2 基于ISDN的AppleTalk 10.5.3 AppleTalk EIGRP 10.5.4 IP隧道 10.6 AappleTalk故障诊断与排除 示例 复习思考题 第11章 IBM网络互连故障诊断与排除 11.1 简介 11.2 远程信源路由桥接(RSRB) 11.2.1 RSRB的流量控制 11.2.2 RSRB故障诊断与排除工具 11.2.2 LNM命令 11.2.4 SRB调试 11.3 SRB环境中的N 11.4 SRB故障诊断与排除示例 11.5 数据链路交换 11.5.1 关于RIF终止 11.5.2 基于帧中继的DLSW 11.5.3 DLSW和以太网 11.5.4 搜索和流量过滤 11.5.5 DLSW的先进特性 11.5.6 DLSW中的Cisco诊断工具 11.6 DLSW 故障诊断与排除示例 复习思考题 第12章 交换式以太网故障诊断与排除 12.1 简介 12.2 Catalyst 5000/5500交换机上的故障 诊断与排除工具 12.2.1 ping命令 12.2.2 Cisco发现协议 12.2.3 show和clear命令 12.2.4 日志记录 12.2.5 SPAN分析仪端口 12.2.6 Catalyst 5000上的SNMP 12.3 VLAN故障 12.3.1 缺省VLAN 12.3.2 隧道 12.3.3 Inter-VLAN通信 12.4 解决与IP相关的问题 12.4.1 IP交换机的配置 12.4.2 路由和RSM模块 12.5 生成树协议(SPANNING-TREE PROTOCOL)及其相关问题 12.5.1 配置生成树参数 12.5.2 Portfast属性 12.6 高带宽特性 12.6.1 全双工传输 12.6.2 快速以太网信道和G比特 以太网信道 12.7 交换机安全 12.7.1 端口安全性 12.7.2 telnet限制 12.8 以太网故障诊断与排除示例 复习思考题 第13章 实验室练习 1 3.1 简介 13.2 练习1:路由器崩溃后的恢复 13.3 练习2:IGRP/EIGRP路由故障示例 13.4 练习3:RIP/OSPF路由问题 13.5 练习4:BGP路由故障示例 13.6 练习5:DLSW+故障示例 13.7 练习6:IPX RIP/EIGRP故障示例 附录 复习思考题答案
1. 简介 1.1. 概览 1.2. 使用场景 2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. Spring MVC合理的默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5(Tiger)的支持 2.7. 移植到Spring 2.0 2.7.1. 一些变化 2.7.1.1. Jar包 2.7.1.2. XML配置 2.7.1.3. Deprecated的类和方法 2.7.1.4. Apache OJB 2.7.1.5. iBatis 2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.1.1. 配置元数据 3.2.2. 实例化容器 3.2.2.1. 组成基于XML配置元数据 3.2.3. 多种bean 3.2.3.1. 命名bean 3.2.3.2. 实例化bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 3.3.1.1. Setter注入 3.3.1.2. 构造器注入 3.3.1.3. 一些例子 3.3.2. 构造器参数的解析 3.3.2.1. 构造器参数类型匹配 3.3.2.2. 构造器参数的索引 3.3.3. bean属性及构造器参数详解 3.3.3.1. 直接量(基本类型、Strings类型等。) 3.3.3.2. 引用其它的bean(协作者) 3.3.3.3. 内部bean 3.3.3.4. 集合 3.3.3.5. Nulls 3.3.3.6. XML-based configuration metadata shortcuts 3.3.3.7. 组合属性名称 3.3.4. 使用depends-on 3.3.5. 延迟初始化bean 3.3.6. 自动装配(autowire)协作者 3.3.6.1. 设置Bean使自动装配失效 3.3.7. 依赖检查 3.3.8. 方法注入 3.3.8.1. Lookup方法注入 3.3.8.2. 自定义方法的替代方案 3.4. bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用域 3.4.3. 其他作用域 3.4.3.1. 初始化web配置 3.4.3.2. Request作用域 3.4.3.3. Session作用域 3.4.3.4. global session作用域 3.4.3.5. 作用域bean与依赖 3.4.4. 自定义作用域 3.5. 定制bean特性 3.5.1. Lifecycle接口 3.5.1.1. 初始化回调 3.5.1.2. 析构回调 3.5.2. 了解自己 3.5.2.1. BeanFactoryAware 3.5.2.2. BeanNameAware 3.6. bean定义的继承 3.7. 容器扩展点 3.7.1. 用BeanPostProcessor定制bean 3.7.1.1. 使用BeanPostProcessor的Hello World示例 3.7.1.2. RequiredAnnotationBeanPostProcessor示例 3.7.2. 用BeanFactoryPostProcessor定制配置元数据 3.7.2.1. PropertyPlaceholderConfigurer示例 3.7.2.2. PropertyOverrideConfigurer示例 3.7.3. 使用FactoryBean定制实例化逻辑 3.8. ApplicationContext 3.8.1. 利用MessageSource实现国际化 3.8.2. 事件 3.8.3. 底层资源的访问 3.8.4. ApplicationContext在WEB应用中的实例化 3.9. 粘合代码和可怕的singleton 3.9.1. 使用Singleton-helper类 4. 资源 4.1. 简介 4.2. Resource 接口 4.3. 内置 Resource 实现 4.3.1. UrlResource 4.3.2. ClassPathResource 4.3.3. FileSystemResource 4.3.4. ServletContextResource 4.3.5. InputStreamResource 4.3.6. ByteArrayResource 4.4. ResourceLoader 4.5. ResourceLoaderAware 接口 4.6. 把Resource作为属性来配置 4.7. Application context 和Resource 路径 4.7.1. 构造application context 4.7.1.1. 创建 ClassPathXmlApplicationContext 实例 - 简介 4.7.2. Application context构造器中资源路径的通配符 4.7.2.1. Ant风格的pattern 4.7.2.2. classpath*: 前缀 4.7.2.3. 其他关于通配符的说明 4.7.3. FileSystemResource 提示 5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的PropertyEditor实现 5.4.2.1. 注册用户自定义的PropertyEditor 6. 使用Spring进行面向切面编程(AOP) 6.1. 简介 6.1.1. AOP概念 6.1.2. Spring AOP的功能和目标 6.1.3. Spring的AOP代理 6.2. @AspectJ支持 6.2.1. 启用@AspectJ支持 6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.3.1. 切入点指定者的支持 6.2.3.2. 合并切入点表达式 6.2.3.3. 共享常见的切入点(pointcut)定义 6.2.3.4. 示例 6.2.4. 声明通知 6.2.4.1. 前置通知(Before advice) 6.2.4.2. 返回后通知(After returning advice) 6.2.4.3. 抛出后通知(After throwing advice) 6.2.4.4. 后通知(After (finally) advice) 6.2.4.5. 环绕通知(Around Advice) 6.2.4.6. 通知参数(Advice parameters) 6.2.4.7. 通知(Advice)顺序 6.2.5. 引入(Introductions) 6.2.6. 切面实例化模型 6.2.7. 例子 6.3. Schema-based AOP support 6.3.1. 声明一个切面 6.3.2. 声明一个切入点 6.3.3. 声明通知 6.3.3.1. 通知(Advice) 6.3.3.2. 返回后通知(After returning advice) 6.3.3.3. 抛出异常后通知(After throwing advice) 6.3.3.4. 后通知(After (finally) advice) 6.3.3.5. 通知 6.3.3.6. 通知参数 6.3.3.7. 通知顺序 6.3.4. 引入 6.3.5. 切面实例化模型 6.3.6. Advisors 6.3.7. 例子 6.4. AOP声明风格的选择 6.4.1. Spring AOP还是完全用AspectJ? 6.4.2. Spring AOP中使用@AspectJ还是XML? 6.5. 混合切面类型 6.6. 代理机制 6.7. 编程方式创建@AspectJ代理 6.8. 在Spring应用中使用AspectJ 6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入点实现 7.2.4.1. 静态切入点 7.2.4.2. 动态切入点 7.2.5. 切入点的基类 7.2.6. 自定义切入点 7.3. Spring的通知API 7.3.1. 通知的生命周期 7.3.2. Spring里的通知类型 7.3.2.1. 拦截around通知 7.3.2.2. 前置通知 7.3.2.3. 异常通知 7.3.2.4. 后置通知 7.3.2.5. 引入通知 7.4. Spring里的advisor(Advisor) API 7.5. 使用ProxyFactoryBean创建AOP代理 7.5.1. 基础 7.5.2. JavaBean属性 7.5.3. 基于JDK和CGLIB的代理 7.5.4. 对接口进行代理 7.5.5. 对类进行代理 7.5.6. 使用“全局”advisor 7.6. 简化代理定义 7.7. 使用ProxyFactory通过编程创建AOP代理 7.8. 操作被通知对象 7.9. 使用“自动代理(autoproxy)”功能 7.9.1. 自动代理bean定义 7.9.1.1. BeanNameAutoProxyCreator 7.9.1.2. DefaultAdvisorAutoProxyCreator 7.9.1.3. AbstractAdvisorAutoProxyCreator 7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标源 7.10.3. 原型目标源 7.10.4. ThreadLocal目标源 7.11. 定义新的通知类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.3. 集成测试 8.3.1. Context管理和缓存 8.3.2. 测试fixture的依赖注入 8.3.3. 事务管理 8.3.4. 方便的变量 8.3.5. 示例 8.3.6. 运行集成测试 8.4. 更多资源 II. 中间层数据访问 9. 事务管理 9.1. 简介 9.2. 动机 9.3. 关键抽象 9.4. 使用资源同步的事务 9.4.1. 高层次方案 9.4.2. 低层次方案 9.4.3. TransactionAwareDataSourceProxy 9.5. 声明式事务管理 9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程式事务管理 9.6.1. 使用 TransactionTemplate 9.6.2. 使用 PlatformTransactionManager 9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构 11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口 11.2.6. 执行SQL语句 11.2.7. 执行查询 11.2.8. 更新数据库 11.3. 控制数据库连接 11.3.1. DataSourceUtils类 11.3.2. SmartDataSource接口 11.3.3. AbstractDataSource类 11.3.4. SingleConnectionDataSource类 11.3.5. DriverManagerDataSource类 11.3.6. TransactionAwareDataSourceProxy类 11.3.7. DataSourceTransactionManager类 11.4. 用Java对象来表达JDBC操作 11.4.1. SqlQuery类 11.4.2. MappingSqlQuery类 11.4.3. SqlUpdate类 11.4.4. StoredProcedure类 11.4.5. SqlFunction类 12. 使用ORM工具进行数据访问 12.1. 简介 12.2. Hibernate 12.2.1. 资源管理 12.2.2. 在Spring的application context中创建 SessionFactory 12.2.3. HibernateTemplate 12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器中使用Hibernate的注意点 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect 12.4. Oracle TopLink 12.4.1. SessionFactory 抽象层 12.4.2. TopLinkTemplate 和 TopLinkDaoSupport 12.4.3. 基于原生的TopLink API的DAO实现 12.4.4. 事务管理 12.5. iBATIS SQL Maps 12.5.1. iBATIS 1.x和2.x的概览与区别 12.5.2. iBATIS SQL Maps 1.x 12.5.2.1. 创建SqlMap 12.5.2.2. 使用 SqlMapTemplate 和 SqlMapDaoSupport 12.5.3. iBATIS SQL Maps 2.x 12.5.3.1. 创建SqlMapClient 12.5.3.2. 使用 SqlMapClientTemplate 和 SqlMapClientDaoSupport 12.5.3.3. 基于原生的iBATIS API的DAO实现 12.6. JPA 12.6.1. 在Spring环境中建立JPA 12.6.1.1. LocalEntityManagerFactoryBean 12.6.1.2. LocalContainerEntityManagerFactoryBean 12.6.1.3. 处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与其他web框架的集成 13.1.2. Spring Web MVC框架的特点 13.2. DispatcherServlet 13.3. 控制器 13.3.1. AbstractController 和 WebContentGenerator 13.3.2. 其它的简单控制器 13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 13.5.3. 重定向(Rediret)到另一个视图 13.5.3.1. RedirectView 13.5.3.2. redirect:前缀 13.5.3.3. forward:前缀 13.6. 本地化解析器 13.6.1. AcceptHeaderLocaleResolver 13.6.2. CookieLocaleResolver 13.6.3. SessionLocaleResolver 13.6.4. LocaleChangeInterceptor 13.7. 使用主题 13.7.1. 简介 13.7.2. 如何定义主题 13.7.3. 主题解析器 13.8. Spring对分段文件上传(multipart file upload)的支持 13.8.1. 介绍 13.8.2. 使用MultipartResolver 13.8.3. 在表单中处理分段文件上传 13.9. 使用Spring的表单标签库 13.9.1. 配置标签库 13.9.2. form标签 13.9.3. input标签 13.9.4. checkbox标签 13.9.5. radiobutton标签 13.9.6. password标签 13.9.7. select标签 13.9.8. option标签 13.9.9. options标签 13.9.10. textarea标签 13.9.11. hidden标签 13.9.12. errors标签 13.10. 处理异常 13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: RequestToViewNameTranslator 13.12. 其它资源 14. 集成视图技术 14.1. 简介 14.2. JSP和JSTL 14.2.1. 视图解析器 14.2.2. 'Plain-old' JSPs versus JSTL 'Plain-old' JSP与JSTL 14.2.3. 帮助简化开发的额外的标签 14.3. Tiles 14.3.1. 需要的资源 14.3.2. 如何集成Tiles 14.3.2.1. InternalResourceViewResolver 14.3.2.2. ResourceBundleViewResolver 14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 14.4.4.1. velocity.properties 14.4.4.2. FreeMarker 14.4.5. 绑定支持和表单处理 14.4.5.1. 用于绑定的宏 14.4.5.2. 简单绑定 14.4.5.3. 表单输入生成宏 14.4.5.4. 重载HTML转码行为并使你的标签符合XHTML 14.5. XSLT 14.5.1. 写在段首 14.5.1.1. Bean 定义 14.5.1.2. 标准MVC控制器代码 14.5.1.3. 把模型数据转化为XML 14.5.1.4. 定义视图属性 14.5.1.5. 文档转换 14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.6.2.1. 文档视图定义 14.6.2.2. Controller 代码 14.6.2.3. Excel视图子类 14.6.2.4. PDF视图子类 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.2.1. 配置ViewResolver 14.7.2.2. 配置View 14.7.2.3. 关于报表文件 14.7.2.4. 使用 JasperReportsMultiFormatView 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.4.1. 配置子报表文件 14.7.4.2. 配置子报表数据源 14.7.5. 配置Exporter的参数 15. 集成其它Web框架 15.1. 简介 15.2. 通用配置 15.3. JavaServer Faces 15.3.1. DelegatingVariableResolver 15.3.2. FacesContextUtils 15.4. Struts 15.4.1. ContextLoaderPlugin 15.4.1.1. DelegatingRequestProcessor 15.4.1.2. DelegatingActionProxy 15.4.2. ActionSupport 类 15.5. Tapestry 15.5.1. 注入 Spring 托管的 beans 15.5.1.1. 将 Spring Beans 注入到 Tapestry 页面中 15.5.1.2. 组件定义文件 15.5.1.3. 添加抽象访问方法 15.5.1.4. 将 Spring Beans 注入到 Tapestry 页面中 - Tapestry 4.0+ 风格 15.6. WebWork 15.7. 更多资源 16. Portlet MVC框架 16.1. 介绍 16.1.1. 控制器 - MVC中的C 16.1.2. 视图 - MVC中的V 16.1.3. Web作用范围的Bean 16.2. DispatcherPortlet 16.3. ViewRendererServlet 16.4. 控制器 16.4.1. AbstractController和PortletContentGenerator 16.4.2. 其它简单的控制器 16.4.3. Command控制器 16.4.4. PortletWrappingController 16.5. 处理器映射 16.5.1. PortletModeHandlerMapping 16.5.2. ParameterHandlerMapping 16.5.3. PortletModeParameterHandlerMapping 16.5.4. 增加 HandlerInterceptor 16.5.5. HandlerInterceptorAdapter 16.5.6. ParameterMappingInterceptor 16.6. 视图和它们的解析 16.7. Multipart文件上传支持 16.7.1. 使用PortletMultipartResolver 16.7.2. 处理表单里的文件上传 16.8. 异常处理 16.9. Portlet应用的部署 IV. 整合 17. 使用Spring进行远程访问与Web服务 17.1. 简介 17.2. 使用RMI暴露服务 17.2.1. 使用 RmiServiceExporter 暴露服务 17.2.2. 在客户端链接服务 17.3. 使用Hessian或者Burlap通过HTTP远程调用服务 17.3.1. 为Hessian配置DispatcherServlet 17.3.2. 使用HessianServiceExporter暴露你的bean 17.3.3. 客户端连接服务 17.3.4. 使用Burlap 17.3.5. 对通过Hessian或Burlap暴露的服务使用HTTP基础认证 17.4. 使用HTTP调用器暴露服务 17.4.1. 暴露服务对象 17.4.2. 在客户端连接服务 17.5. Web服务 17.5.1. 使用JAXI-RPC暴露服务 17.5.2. 访问Web服务 17.5.3. 注册bean映射 17.5.4. 注册自己的处理方法 17.5.5. 使用XFire来暴露Web服务 17.6. 对远程接口不提供自动探测 17.7. 在选择这些技术时的一些考虑 18. Enterprise Java Bean(EJB)集成 18.1. 简介 18.2. 访问EJB 18.2.1. 概念 18.2.2. 访问本地的无状态Session Bean(SLSB) 18.2.3. 访问远程SLSB 18.3. 使用Spring提供的辅助类实现EJB组件 19. JMS 19.1. 简介 19.2. 使用Spring JMS 19.2.1. JmsTemplate 19.2.2. 连接工厂 19.2.3. (消息)目的地管理 19.2.4. 消息侦听容器 19.2.4.1. SimpleMessageListenerContainer 19.2.4.2. DefaultMessageListenerContainer 19.2.4.3. ServerSessionMessageListenerContainer 19.2.5. 事务管理 19.3. 发送一条消息 19.3.1. 使用消息转换器 19.3.2. SessionCallback 和ProducerCallback 19.4. 接收消息 19.4.1. 同步接收 19.4.2. 异步接收 - 消息驱动的POJOs 19.4.3. SessionAwareMessageListener 接口 19.4.4. MessageListenerAdapter 19.4.5. 事务中的多方参与 20. JMX 20.1. 介绍 20.2. 输出bean到JMX 20.2.1. 创建一个MBeanServer 20.2.2. 复用现有的MBeanServer 20.2.3. MBean的惰性初始化 20.2.4. MBean的自动注册 20.2.5. 控制注册行为 20.3. 控制bean的管理接口 20.3.1. MBeanInfoAssembler 接口 20.3.2. 使用源码级元数据 20.3.3. 使用JDK 5.0注解 20.3.4. 源代码级的元数据类型 20.3.5. 接口AutodetectCapableMBeanInfoAssembler 20.3.6. 用Java接口定义管理接口 20.3.7. 使用MethodNameBasedMBeanInfoAssembler 20.4. 控制bean的 ObjectName 20.4.1. 从Properties中读取ObjectName 20.4.2. 使用 MetadataNamingStrategy 20.5. JSR-160连接器 20.5.1. 服务器端连接器 20.5.2. 客户端连接器 20.5.3. 基于Burlap/Hessian/SOAP的JMX 20.6. 通过代理访问MBeans 20.7. 通知 20.7.1. 为通知注册监听器 20.7.2. 发布通知 20.8. 更多资源 21. JCA CCI 21.1. 介绍 21.2. 配置CCI 21.2.1. 连接器配置 21.2.2. 在Spring中配置ConnectionFactory 21.2.3. 配置CCI连接 21.2.4. 使用一个 CCI 单连接 21.3. 使用Spring的 CCI访问支持 21.3.1. 记录转换 21.3.2. CciTemplate 类 21.3.3. DAO支持 21.3.4. 自动输出记录生成 21.3.5. 总结 21.3.6. 直接使用一个 CCI Connection 接口和Interaction接口 21.3.7. CciTemplate 使用示例 21.4. 建模CCI访问为操作对象 21.4.1. MappingRecordOperation 21.4.2. MappingCommAreaOperation 21.4.3. 自动输出记录生成 21.4.4. 总结 21.4.5. MappingRecordOperation 使用示例 21.4.6. MappingCommAreaOperation 使用示例 21.5. 事务 22. Spring邮件抽象层 22.1. 简介 22.2. Spring邮件抽象结构 22.3. 使用Spring邮件抽象 22.3.1. 可插拔的MailSender实现 22.4. 使用 JavaMail MimeMessageHelper 22.4.1. 创建一条简单的MimeMessage,并且发送出去 22.4.2. 发送附件和嵌入式资源(inline resources) 23. Spring中的定时调度(Scheduling)和线程池(Thread Pooling) 23.1. 简介 23.2. 使用OpenSymphony Quartz 调度器 23.2.1. 使用JobDetailBean 23.2.2. 使用 MethodInvokingJobDetailFactoryBean 23.2.3. 使用triggers和SchedulerFactoryBean来包装任务 23.3. 使用JDK Timer支持类 23.3.1. 创建定制的timers 23.3.2. 使用 MethodInvokingTimerTaskFactoryBean类 23.3.3. 打包:使用TimerFactoryBean来设置任务 23.4. SpringTaskExecutor抽象 23.4.1. TaskExecutor接口 23.4.2. 何时使用TaskExecutor接口 23.4.3. TaskExecutor类型 23.4.4. 使用TaskExecutor接口 24. 动态语言支持 24.1. 介绍 24.2. 第一个例子 24.3. 定义动态语言支持的bean 24.3.1. 公共概念 24.3.1.1. <lang:language/> 元素 24.3.1.2. Refreshable bean 24.3.1.3. 内置动态语言源文件 24.3.1.4. 理解dynamic-language-backed bean context的构造器注入 24.3.2. JRuby beans 24.3.3. Groovy beans 24.3.4. BeanShell beans 24.4. 场景 24.4.1. Spring MVC控制器脚本化 24.4.2. Validator脚本化 24.5. 更多的资源 25. 注解和源代码级的元数据支持 25.1. 简介 25.2. Spring的元数据支持 25.3. 注解 25.3.1. @Required 25.3.2. Spring中的其它@Annotations 25.4. 集成Jakarta Commons Attributes 25.5. 元数据和Spring AOP自动代理 25.5.1. 基本原理 25.5.2. 声明式事务管理 25.5.3. 缓冲 25.5.4. 自定义元数据 25.6. 使用属性来减少MVC web层配置 25.7. 元数据属性的其它用法 25.8. 增加对额外元数据API的支持 A. XML Schema-based configuration A.1. Introduction A.2. XML Schema-based configuration A.2.1. Referencing the schemas A.2.2. The util schema A.2.2.1. <util:constant/> A.2.2.2. <util:property-path/> A.2.2.3. <util:properties/> A.2.2.4. <util:list/> A.2.2.5. <util:map/> A.2.2.6. <util:set/> A.2.3. The jee schema A.2.3.1. <jee:jndi-lookup/> (simple) A.2.3.2. <jee:jndi-lookup/> (with single JNDI environment setting) A.2.3.3. <jee:jndi-lookup/> (with multiple JNDI environment settings) A.2.3.4. <jee:jndi-lookup/> (complex) A.2.3.5. <jee:local-slsb/> (simple) A.2.3.6. <jee:local-slsb/> (complex) A.2.3.7. <jee:remote-slsb/> A.2.4. The lang schema A.2.5. The tx (transaction) schema A.2.6. The aop schema A.2.7. The tool schema A.2.8. The beans schema A.3. Setting up your IDE A.3.1. Setting up Eclipse A.3.2. Setting up IntelliJ IDEA A.3.3. Integration issues A.3.3.1. XML parsing errors in the Resin v.3 application server B. Extensible XML authoring B.1. Introduction B.2. Authoring the schema B.3. Coding a NamespaceHandler B.4. Coding a BeanDefinitionParser B.5. Registering the handler and the schema B.5.1. META-INF/spring.handlers B.5.2. META-INF/spring.schemas C. spring-beans-2.0.dtd D. spring.tld D.1. Introduction D.2. The bind tag D.3. The escapeBody tag D.4. The hasBindErrors tag D.5. The htmlEscape tag D.6. The message tag D.7. The nestedPath tag D.8. The theme tag D.9. The transform tag E. spring-form.tld E.1. Introduction E.2. The checkbox tag E.3. The errors tag E.4. The form tag E.5. The hidden tag E.6. The input tag E.7. The label tag E.8. The option tag E.9. The options tag E.10. The password tag E.11. The radiobutton tag E.12. The select tag E.13. The textarea tag F. Spring 2.0 开发手册中文化项目 F.1. 声明 F.2. 致谢 F.3. 参与人员及任务分配 F.4. Spring 2.0 正式版开发手册翻译说明 F.5. 项目历程 F.5.1. Spring 2.0 RC2 开发手册翻译项目 F.5.2. Spring 2.0 正式版开发手册翻译项目

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值