`
hsyzijvaa
  • 浏览: 107381 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

(思考)Spring第一篇之IoC

    博客分类:
  • java
阅读更多
    (觉得自己一直思考太少且深度不够,所以加上这个前缀提醒自己-思维才是核心竞争力。)
spring目前可能用到的有几个模块:ioc、aop和tx,第一篇主要对ioc一些essential的知识做一个总结,不牵扯任何技术细节上的东东,很多都是个人的一些想法,所以不一定准确,欢迎大家指出来,可以一起讨论。附件是我在写文章时候,参考的一篇文献。
一、ioc(inversion of control)
1.什么是ioc?
以往不好的编程体验,过于依赖于implementation,这样的结果是:implementation对整个程序拥有了绝对的control。因为implementation都是硬编码,所以造成的结果是难于扩展,无法满足ocp。ioc就是inverse the control of implementations to the interfaces,即面向接口编程。这样无论是上层的business,还是下层的implementation都依赖抽象层(接口或者抽象类),抽象层拥有绝对的control。这样的结果是使整个项目有了更好的extensible。
spring框架的核心是ioc容器,所以它有着很好的no intrusive。
介绍到这,就很想知道ioc在spring中是如何实现的很自然的引出了第二个话题。
2.如何实现ioc?
实现ioc有两种主要的方式,一种是service locator(服务定位器),一种是dependecy injection(依赖注入)。为何要引入这两种方式,举一个简单的例子可以说明这个问题。
class people{    private action action;    public people(){        action =new manaction();    }}interface action{}class manaction implement action{}

注意,上例中你虽是面向接口编程,但实际上people类,既依赖于action接口,又依赖于manaction(具体的implementation),而且你在编译期就binding了这种关系。这显然不是我们所期望的那种“纯粹的”面向接口编程。如何达到这个要求,有人提出了“plugin”这个概念,既我们编写的plugin是在运行时才binding到这个系统中的,插入的时间和方式,完全于plugin的编写者无关,如何做到呢?于是就有了最开始所说的的两种实现方式(模式)。
首先说说di,di分为三种:type1,type2和type3。
type1:interface injection,要实现它,需要再定义一个接口叫actioninjection每个使用action的类都必须实现这个接口,然后在配置文件中定义injection属性,把manaction作为value传入进去即可。这种方式由于要在你自己的类(比如people)中实现actioninjection接口,于框架的耦合度较高,所以具有较强的intrusive,不推荐使用。而type2和type3,即是spring所使用的方式。网上有很多关于它们的讨论,我大致总结一下:type3使用构造子注入,优先使用,因为它具有较强的隐蔽性,可以保护你不愿意改变的属性;然而有时候,会有多个构造函数,或者是构造函数的参数很多(记住顺序很麻烦),就应该使用type2setter方法注入。
最后说说service locator(sl),我对它的理解应该也不准确,大概说说也算是抛砖引玉吧。di中控制者和被控制者,完全感受不到对方的存在,它们之间的关系是在runtime时才binding的,具有很强的灵活性,然而正是因为这种灵活性若是超过了一定限度,会使你迷失在查找配置文件的海洋中。而sl要求必须在编译器就有一个sl对象知道你application所需的全部服务,而具体这些服务的注册是通过di在runtime时和application所需要的sl对象binding在一起的,所以sl一般会是一个接口,而你的application在runtime中通过sl对象查找服务,然后调用它,这样的好处是,你可以显示的看到你所拥有的全部的服务,和配置文件解耦。
到这里,可以把ioc想象为一个实体东西,它的“体”是control,“相”是inverse,“用”呢?
3.用ioc干什么?
换个角度说,就是用ioc操作什么?答案是beans。操作的过程与spring框架紧密结合在一起,spring框架提供了两个方式一个是beanfactory接口,一个是使用application context容器,下面这段话解释的很清楚,不再赘述。
<div class="quote_title">引用
0
0
分享到:
评论

相关推荐

    spring中文教程

    Spring是IOC为核心的,所以第一步就是要深刻理解IOC,最好是能尽快把IOC作为教条式的原则,虽然有些偏激,但有助于尽快理解,在你有了深刻的理解之后,你再看Spring就已经有个大概框架了,虽然IOC从定义来讲并不...

    Spring学习资料ppt

    Spring是IOC为核心的,所以第一步就是要深刻理解IOC,最好是能尽快把IOC作为教条式的原则,虽然有些偏激,但有助于尽快理解,在你有了深刻的理解之后,你再看Spring就已经有个大概框架了,虽然IOC从定义来讲并不...

    Spring技术内幕:深入解析Spring架构与设计原理(第2部分)

    国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...

    SPRING3技术内幕

    Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...

    05-IoC入门案例-入门案例制作

    第一个问题,管理什么? 也就是我的Spring容器(也就是IoC容器,以下我们都称为Spring容器)要管的东西是什么?那肯定是对应的Bean。也就是你原来造对象的那些类,是不是我要管完以后把它放到我们的Spring容器中变成...

    Spring技术内幕:深入解析Spring架构与设计原理(第一部分)

    Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...

    Spring技术内幕:深入解析Spring架构与设计原理(第1部分)

    Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...

    Spring技术内幕:深入解析Spring架构与设计原理

    Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...

    SPRING3技术内幕.z01

    Spring技术内幕 深入解析Spring架构与设计原理1(完整清晰版),一共两部分,这是第一部分 《Spring技术内幕:深入解析Spring架构与设计原理》是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自...

    Spring.net框架

    我们的第一个例子主要用于说明程序的基本构造,并且作为一个反面典型,引出为什么要解耦,以及如何下手。在这个例子中,我们将创建三个程序集,分别是MainApp.exe、HelloGenerator.dll以及SayHello.dll。它们之间的...

    Spring技术内幕

    , 国内第一本基于Spring3.0的著作,从源代码的角度对Spring的内核和各个主要功能模块的架构、设计和实现原理进行了深入剖析。你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码...

    第24次课-1 Spring与Hibernate的整合

    第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 24.1 概述 24.1.1 概述 Spring提供了很多IoC特性的支持,方便处理大部分典型的Hibernate整合...

    基于SSM+Bootstrap的教务查询系统.zip

    是一个简单的教务查询系统,起初用于熟悉SSM的整合开发,使用技术 IOC容器:Spring Web框架:SpringMVC ORM框架:Mybatis 数据源:C3P0 日志:log4j 前端框架:Bootstrap 运行环境 … 毕业设计是高等教育阶段学生在...

    asp.net知识库

    Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把...

    JAVA自学之路

    在这儿之后,你可以选择向J2ME、或者Java GUI、Socket编程等方向努力,但是通过第一篇的办法,你可以很容易就将这方向过滤掉(永远不要忘了我们是为了就业),好吧,暂时和它们诀别,还是向着J2EE的方向前进吧。...

Global site tag (gtag.js) - Google Analytics