`
andyjackson
  • 浏览: 58573 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring-DI

    博客分类:
  • java
阅读更多

依赖注入(DI),是spring容器实现的基础,在spring-core模块中实现的。所谓DI,就是指对象是被动接受依赖类而不是自己主动去找,换句话说就是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它。下面举一个形象的例子:

class B{
   private A a;
   public void setA(A a){
      this.a=a;
   }
}

class A{
}

 

显然,此时B是依赖与A。我们不妨将A比作牛,将B比作人,人吃牛是显然的事实。当用户要利用B的时候,必须先要指定他所依赖的A的对象。这样代码模块之间就具有很强的耦合。通过依赖注入的方式,能够使B对A的依赖关系对代码人员变得松散。我们将A和B对象都交给容器来管理,通过配置文件告诉B该依赖的A,这样代码中的依赖关系被移到了配置文件中,通过对配置文件的管理,很容易编写低耦合的代码。
对于依赖注入的几种实现参考Dependency Injection

 

但是,目前在学术界争论的焦点在于:DI究竟能不能给程序带来解耦。

众所周知,封装和依赖是面向对象编程思想中两个很重要的概念。编写高内聚低耦合的代码是OOP编程的目标。但是,这其中本来就存在着互相矛盾。

所谓高内聚,就是通过封装之后,是被封装的各个模块(这里一般是一个类)内部的功能功能相关性、依赖性、协作性等高。此时,我们要做的就是对模块按照上述标准进行分解,直到满意为止。但是,什么时候才是一个尽头?当我们在不断的对模块进行分解时,被分解的模块之间的耦合就不断的增强。此时,我们就会反过来想,低耦合就是不断降低模块之间的关系,没有关系最好。于是我们要做的就是模块合组,将耦合关系强的模块组合在一起。那怎么样才能做到最好?那不就是用一个统一的模块来表示整个需要描述的系统,废话那不就等于什么都没有做。说了这么多,我要说的就是要在内聚和耦合之间进行权衡,找到一个恰当的平衡点。

下面切入正题,所谓耦合,简单的理解就是模块与模块之间的关系,最主要的就是依赖关系。从上面的讨论很容易的发现模块之间的耦合是无法消除的,除非他们之间没有任何关系。那么DI为什么声称能够给程序带来解耦呢?我觉耦合并没有消除,甚至没有减弱。DI只是将耦合进行了转移,通常是转移到配置文件中。

<beans>
    <bean id="b" class="B">
        <property name="a" ref="a"/>
    </bean>
    <bean id="a" class="A">     
    </bean>
</beans>

 B对A的依赖关系原来在这里。因此,在主程序中的不再为new B的时候为A所扰心。

但是,如果我们从另外一个方面来考虑,如果我们把A和B当作两个由第三方编写代码模块,我们无法修改他的源代码。我们会发现,DI的机制就变得非常有用了。我们只需要根据需要写配置文件,告诉B所依赖的模块A到底是那个A。当A公司对A进行升级时,直接将组件进行替换;或者当我们改用C公司的模块C时,要做的只是告诉B所依赖的模块A是C公司的那个模块。这种对耦合转移的方式,在实际软件开发,尤其是基于组件或插件的开发中,意义非凡。

 

其实,回头想想我们怎么能够既要求模块之间协作又要求没有耦合呢。DI只不过是将各个开发人员之间代码的耦合转移到统一管理的地方。

但是,当系统比较大的时候,配置文件会被胀的很大,给配置编写带来了一定的难度,目前能够做的只是根据配置的bean的不同类别,将配置文件分块。

目前,貌似spring中增加了注解的功能。我个人觉得,注解的方式,确实给程序员带来了不少方便,他就相当于一部傻瓜相机,拍照的参数由相机自己来调,但是也会给开发带来一些隐含的问题。

分享到:
评论
1 楼 songjiesdnu 2012-10-11  

相关推荐

    Spring-DI时序图.png

    Spring Ioc DI 时序图分享给大家,希望对大家看源码有所帮助,不足之处欢迎批评指正,可以在下方留言

    spring-5.3.9-dist.zip(spring-framework-5.3.9)

    Spring框架的核心理念是依赖注入(Dependency Injection,DI),它简化了组件之间的耦合,使得代码更加灵活和易于测试。在5.3.9版本中,DI机制得到了进一步的增强,支持更复杂的依赖配置和更好的类型安全。 `docs`...

    spring-context-3.2.0 spring-core-3.2.0 等齐全的Spring jar包

    1. **spring-core-3.2.0.RELEASE.jar**:这是Spring框架的核心模块,提供了基本的IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)功能,以及资源加载和通用工具类。 2. **spring-...

    spring-framework-master

    Spring的核心设计理念是依赖注入(Dependency Injection,简称DI),它通过反转控制(Inversion of Control,IoC)来降低组件之间的耦合度。这种设计模式使得应用程序的配置和业务逻辑分离,从而提高了代码的可测试...

    spring-5.3.3-dist.zip

    1. **依赖注入(Dependency Injection,DI)**:这是Spring框架的核心特性,它允许开发者通过外部配置来管理对象及其依赖关系,从而降低了代码的耦合度,提高了可测试性和可维护性。 2. **AOP(面向切面编程)**:...

    phase3-spring-di-loose-coupling-03-19-2021:phase3-spring-di-loose-coupling-03-19-2021

    标题和描述中的关键词“phase3-spring-di-loose-coupling-03-19-2021”以及压缩包子文件的名称“phase3-spring-di-loose-coupling-03-19-2021-master”暗示了这个压缩包可能包含了关于Spring框架的依赖注入...

    官方完整包 spring-framework-5.3.8.RELEASE-dist.zip

    Spring框架以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)而著名。依赖注入允许开发者通过外部容器管理对象的生命周期和依赖关系,降低了代码间的耦合度。AOP则为...

    spring-demo02-IOC-DI案例.zip

    Spring 框架是 Java 开发中不可或缺的一部分,它以其强大的依赖注入(Dependency Injection, DI)和控制反转(Inversion of Control, IOC)特性而闻名。在这个名为“spring-demo02-IOC-DI案例”的压缩包中,我们将...

    spring-context.xsd

    《Spring上下文(spring-context.xsd):理解DI与代码提示》 在Java开发领域,Spring框架是一个不可或缺的工具,其强大的依赖注入(Dependency Injection,简称DI)特性使得应用程序的构建变得更加灵活和易于管理。...

    spring-framework-5.1.2.RELEASE.rar

    spring-beans-5.1.8.RELEASE.jar //配置、创建、管理Bean,负责Ioc、DI spring-context-5.1.8.RELEASE.jar //提供在基础IoC上的扩展服务 spring-expression-5.1.8.RELEASE.jar //提供对Spring表达式语言的支持

    spring4源码所需要的spring-objenesis-repack-2.1.jar,spring-cglib-repack-3.1.jar

    3. **Spring Core**: `spring-core-4.1.3.BUILD-SNAPSHOT.jar` 是Spring框架的核心组件,包含了Spring的核心功能,如依赖注入(DI)、资源管理、类型转换系统和SpEL(Spring Expression Language)。这些组件是...

    spring-framework-5.1.8.RELEASE.zip

    在Spring Framework中,核心特性包括依赖注入(Dependency Injection,DI),它允许开发者在运行时通过配置文件或注解来管理对象之间的关系,从而降低了代码的耦合度。此外,它还提供了AOP(面向切面编程)支持,...

    spring-beans-4.0.0.RELEASE.jar

    spring-beans-4.0.0.RELEASE.jar这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI...

    struts2-spring-plugin-2.3.4.jar

    在Java Web开发中,这两个框架经常一起使用,Spring 提供了依赖注入(DI)和面向切面编程(AOP)等功能,而 Struts 2 则是一个强大的MVC(Model-View-Controller)框架,负责处理用户请求和业务逻辑。 Struts 2 和 ...

    最新版完整包 spring-5.3.9.RELEASE-dist.zip

    3. **依赖注入(Dependency Injection,DI)**:DI 是 Spring 的核心特性,它允许开发者通过外部配置来控制对象间的依赖关系,而不是在代码内部硬编码这些依赖。这增强了代码的可测试性和可维护性。 4. **面向切面...

    spring-android-core-1.0.0.RELEASE-sources.jar

    1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,DI在Android平台上同样适用。它允许开发者声明性地配置对象及其依赖关系,而不是硬编码这些依赖。在Android应用中,这有助于降低组件间的耦合...

    struts2-spring-plugin-2.2.1.jar

    这个插件的主要目的是简化在基于Struts2的应用程序中整合Spring的功能,如依赖注入(DI)、AOP(面向切面编程)以及事务管理等。下面我们将深入探讨Struts2、Spring框架以及它们之间的集成。 **Struts2框架** ...

    官方原版spring-framework-4.3.18.RELEASE.zip

    Spring Framework的核心特性包括依赖注入(Dependency Injection,DI),它允许开发者通过配置文件或注解来管理对象之间的依赖关系,从而降低组件之间的耦合度。此外,Spring还提供了面向切面编程(Aspect-Oriented ...

    官方原版源码spring-framework-5.0.10.RELEASE.zip

    1. **依赖注入(Dependency Injection, DI)**:这是Spring最基础也最重要的特性,它允许开发者在运行时通过配置来管理对象之间的依赖关系,从而降低耦合度,提高代码的可测试性和可维护性。 2. **面向切面编程...

    官方spring-framework-4.3.13.RELEASE完整包

    开发者可以在这里找到`spring-core`、`spring-beans`、`spring-context`、`spring-web`等核心模块,它们提供了依赖注入(DI)、面向切面编程(AOP)、上下文管理、Web支持等功能。此外,还包括了Spring对其他技术如...

Global site tag (gtag.js) - Google Analytics