依赖注入 接口 抽象

刚开始接触这个概念的时候感觉依赖注入好神秘,尤其是看到资料说某个大学教授关于这个东西发表了一篇论文,然后开源社区就是根据这篇论文逐渐的形成了著名的Spring框架,什么控制反转等概念顿时风靡了开源社区。这使得EJB这个JavaEE亲妈的儿子都不招待见了(当时还是EJB2)。

起初是怀着崇敬的心态去学习Spring感觉这个框架配置好灵活,因为好灵活所以好麻烦,因为好麻烦所以好高深。后来越用越感觉没啥了,说到底就是给一个属性赋值而已,至于什么框架管理Bean说白了就是通过反射去控制Bean生成(关于Spring不是本文的重点)。最近在解决ESB的几个Bug的时候顿时感觉依赖注入没那么简单。

项目中关于ESB的实现用的是开源的Mule,众所周知,ESB的核心理念就是消息格式转换以及消息路由,所以各种协议各种支持,各种消息各种分发。今天要说的就是通过Spring的注入改造MuleSFTP消息的定制。

(从2005年发表1.0版本以来,Mule吸引了越来越多的关注者,已成为开源ESB中的一支独秀)

Mule的原始SFTP支持当中,客户端通过SFTP协议去远程的目录下抓取文件,但是这个抓取的过程是很简单的,一次随机抓取一个文件,直到远程目录中再没有合适的文件可以抓为止。但是这种拙劣的实现方式远远不能满足用户的需要(这个用户其实就是我啦),但是通过查看源码以及官方文档等手段最终得到了下面的答案,原来Mule当中的Bean是可以通过spring灵活注入的,也就是说如果你感觉Mule当中的哪个Bean实现的不满意大可以自己写一个。你要做的就是将这个Bean当做其调用者的一个属性注入进去就可以了。核心代码如下(贴代码是最苍白的表达手法):

<sftp:connector name="incoming-mandate-connector"
                    archiveDir="${esb.archive.path}/mandate/incoming"
                    useTempFileTimestampSuffix="true"
                    autoDelete="true"
                    identityFile="${esb.autogiro.mandate.incoming.sftp.identityFile}"
                    passphrase="${esb.autogiro.mandate.incoming.sftp.passphrase}"
                    sizeCheckWaitTime="${esb.autogiro.mandate.incoming.sftp.sizeCheckWaitTime}">
        <spring:property name="serviceOverrides">
            <spring:map>
                <spring:entry key="requester.factory" value="se.leandev.lfp.esb.autogiro.OrderFilesSftpMessageRequesterFactory"/>
            </spring:map>
        </spring:property>
    </sftp:connector>

问题解决了是解决了,但和以往一样,解决问题仅仅是一个开始。要思考整个过程当中我们学到了什么,面向接口编程?依赖注入?控制反转(其实控制反转包括依赖注入,网上很多人写了很多文章指出两者不同,笔者认为哪些人和笔者一样都是吃的太饱了)?不对这些都不是自己想要的答案,这个答案要更抽象,更具有代表性才行。对!就是这个词语,“抽象”!

一个解决问题的人是普通人,一个解决一系列问题的人才是高人,一个解决所有问题的……丫的这货根本不是人。也就是说将公共的部分提取出来进行抽象是保证在原有系统架构不变的基础上满足更多变态需求的根本。换句不绕口的话就是,把主要矛盾摆在那里,允许不同的人采用不同的解决办法解决

最后再来说说接口吧,在平时的开发过程当中我们很可能感觉写个接口没什么用处,麻烦、浪费时间,还不如直接拿类来用得好(不得不说的我们平时的确也是这么干的),等到某一天这个功能需要特殊定制了才发现原来要是用接口该多么方便。造成以上后果的原因在于我们对接口的设计不够抽象,以往那种接口几个方法实现类几个方法的编程方式可以说是最拙劣(注意这里没有之一)的代码实现方式,真正好的框架或者说产品是应该将接口抽象然后让后来者去灵活实现的。嗨,JavaEE规范不就是这么做的么,说了一圈说回来了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图:提供一种方法顺序访问一个聚合对象中的每个元素,而又不想暴露该对象的内部表示。应用:STL标准库迭代器实现、Java集合类型迭代器等模式结构:心得:迭代器模式的目的是在不获知集合对象内部细节的同时能对集合元素进行遍历操作
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(BlockingIO):即传统的IO模型。(2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的N
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定义一系列算法,把他们封装起来,并且使他们可以相互替换,使算法可以独立于使用它的客户而变化。应用:排序的比较方法、封装针对类的不同的算法、消除条件判断、寄存器分配算法等。模式结构:心得:对对象(Context)的处理操作可
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下定义作用于这些元素的新操作。应用:作用于编译器语法树的语义分析算法。模式结构:心得:访问者模式是要解决对对象添加新的操作和功能时候,如何尽可能不修改对象的类的一种方
命令模式(Command)命令模式(Command)[Action/Transaction]意图:将一个请求封装为一个对象,从而可用不同的请求对客户参数化。对请求排队或记录请求日志,以及支持可撤消的操作。应用:用户操作日志、撤销恢复操作。模式结构:心得:命令对象的抽象接口(Command)提供的两个
生成器模式(Builder)生成器模式(Builder)意图:将一个对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。 应用:编译器词法分析器指导生成抽象语法树、构造迷宫等。模式结构:心得:和工厂模式不同的是,Builder模式需要详细的指导产品的生产。指导者(Director)使用C
设计模式学习心得《设计模式:可复用面向对象软件的基础》一书以更贴近读者思维的角度描述了GOF的23个设计模式。按照书中介绍的每个设计模式的内容,结合网上搜集的资料,我将对设计模式的学习心得总结出来。网络上关于设计模式的资料和文章汗牛充栋,有些文章对设计模式介绍生动形象。但是我相信“一千个读者,一千个
工厂方法模式(Factory Method)工厂方法模式(Factory Method)[Virtual Constructor]意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实力化延迟到子类。应用:多文档应用管理不同类型的文档。模式结构:心得:面对同一继承体系(Produc
单例模式(Singleton)单例模式(Singleton)意图:保证一个类只有一个实例,并提供一个访问它的全局访问点。应用:Session或者控件的唯一示例等。模式结构:心得:单例模式应该是设计模式中最简单的结构了,它的目的很简单,就是保证自身的实例只有一份。实现这种目的的方式有很多,在Java中
装饰者模式(Decorator)装饰者模式(Decorator)[Wrapper]意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。应用:给GUI组件添加功能等。模式结构:心得:装饰器(Decorator)和被装饰的对象(ConcreteComponent)拥有统一的接口
抽象工厂模式(Abstract Factory)抽象工厂模式(Abstract Factory)[Kit]意图:提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。应用:用户界面工具包。模式结构:心得:工厂方法把生产产品的方式封装起来了,但是一个工厂只能生产一类对象,当一个工厂需要生
桥接模式(Bridge)桥接模式(Bridge)[Handle/Body]意图:将抽象部分与它的实现部分分离,使他们都可以独立的变化。应用:不同系统平台的Windows界面。模式结构:心得:用户所见类体系结构(Window派生)提供了一系列用户的高层操作的接口,但是这些接口的实现是基于具体的底层实现
适配器模式(Adapter)适配器模式(Adapter)[Wrapper]意图:将类的一个接口转换成用户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。应用:将图形类接口适配到用户界面组件类中。模式结构:心得:适配器模式一般应用在具有相似接口可复用的条件下。目标接口(Targ
组合模式(Composition)组合模式(Composition)意图:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。应用:组合图形、文件目录、GUI容器等。模式结构:心得: 用户(Client)通过抽象类(Component)提供的公用接口统一
原型模式(Prototype)原型模式(Prototype)意图:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。应用:Java/C#中的Clonable和IClonable接口等。模式结构:心得:原型模式本质上就是对象的拷贝,使用对象拷贝代替对象创建的原因有很多。比如对象的初始化构
什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。