`

Spring框架中的IoC和DI

阅读更多

1Spring框架中的IoC

1)控制反转(Inversion of ControlIoC

所谓控制反转,就是将应用系统中原来由程序控制“对象之间的关系”转交给由外部容器来实现控制。借助于控制反转的机制,能够实现由容器控制程序中的各个类之间的关系,而非传统形式的编程实现中直接在程序代码中由程序代码操控各个类对象实例之间的关系。

这就是“控制反转”的概念:控制权由应用系统中的程序代码转移到了外部容器。控制权的转移,即“控制反转”;利用“控制反转”能够减少对象的请求者对服务提供者的特定实现逻辑的依赖,因为应用系统中的各个组件类不再需要去查找或是实例化它们所依赖的其他目标组件类。

2IoC是一种使应用程序逻辑外在化的设计模式

在这种编程模式下,提供服务的目标组件是被“注入”的而不是被“直接写入”到请求者(客户端)的代码中;这样将大大减少对象的请求者对服务提供者的特定实现逻辑的依赖。因为开发者已经将依赖的具体“定位信息”和“关系信息”从请求者中分离出来了,而在Spring框架中则是将它们放在IoC*.XML的配置文件中。

3)应用Spring 框架中的IoC进行系统开发时的基本要求

为了能够更好地应用Spring框架中的IoC技术,对开发者在具体编程方面也有一定的要求。也就是在代码中不应该再直接创建出目标对象的实例,而应该只描述出创建它们的方式。即在代码中不直接与服务对象连接,但需要在配置文件(一般为*.XML文件)中描述出应用系统中的哪一个功能组件需要哪一项服务。应用系统中的组件类程序在运行时,由容器(在 Spring 框架中是指 IoC 容器)负责将这些对象关联在一起,并依据调用关系将目标对象注入。

4)应用Spring框架中的IoC的代码示例

在下面的Spring框架中的IoC*.XML文件的示例中声明了两个对象,名称分别为theUpperActiontheLowerAction。在运行过程中,由Spring框架中的IoC容器并分别为该两个对象动态注入属性字符串值。请参见1-1】中的代码并请注意其中黑体部分的代码。

 1-1  应用Spring框架中的IoC容器的代码示例。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"

 

实例化配置的对象,以配置文件的bean节点ID值作为实例引用的关键字

             "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

 

 

<beans>

       <bean id="theUpperAction"

        class="com.px1987.springexample.springj2seapp.

         UpperTrnsferAction">

          <property name="messageProperty">

              <value>HeLLo,UpperAction </value>

 

它会被动态地注入到UpperTrnsferActionmessageProperty属性中

          </property>

 

        </bean>

 

 

        <bean id="theLowerAction"  class="com.px1987.springexample.

        springj2seapp.LowerTrnsferAction">

          <property name="messageProperty">

              <value>HeLLo,LowerAction </value>

 

它会被动态地注入到LowerTrnsferActionmessageProperty属性中

          </property>

 

        </bean>

</beans>

 

2Spring 框架中的依赖注入DI技术

1依赖注入Dependency InjectionDI)是对IoC的另一种描述

当初Rod Johnson提出IoC的概念时,曾经引起业界的争论。因为在 IoC的概念中没有具体说明如何实现控制反转、反转给谁以及在什么时候进行控制反转等方面的问题。正在业界为IoC的概念争论不休时,大师级人物Martin Fowler发表了一篇经典文章Inversion of Control Containers and the Dependency Injection patternIoC正名,至此,IoC又获得了一个新的名字——依赖注入(Dependency Injection)。

Dependency Injection是依赖注入的意思,也就是将应用系统中的各个类之间的依赖关系先剥离(也就是常说的解耦或者分离),然后在应用系统运行过程中根据应用之间的调用关系再适时地注入到目标系统中。

2)什么是依赖注入

根据上面的说明,相对于IoC 而言,“依赖注入”更加准确地描述了IoC的设计理念。从名字上来直接理解,所谓依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。

 

Computer CPUHardDisk之间为组合关系

 1-2  类之间的各种关系的示例。

 

 

Computer Print之间为聚合关系

class Computer {

 

     private CPU intelCPU=null;

 

Computer UserInfo之间为一对一”的关联关系

     private List someHardDis=null;    

 

     private Printer hpPrinter=null;   

     private UserInfo oneUserInfo=null;

     public Result calculate(Data oneData) 

 

Computer Data之间为依赖”关系

     {

 

     } 

}

class CPU {

}

class HardDisk {   

}

class Printer {

}

class UserInfo {   

}

 

【例1-2 中给出了计算机Computer类与其他各个类之间的各种关系的示例。在传统的应用开发中,需要开发者自己在Computer类中分别创建出各个依赖的目标类的对象实例,如CPUPrinter类对象等,这样将使得Computer类与它所依赖的各个目标类之间产生紧密耦合关系。

3IoCDI的本质都是改变依赖关系

组件类和组件类之间的关系依赖由原来的依赖“目标组件”改变为现在的依赖于“IoC容器”。为什么要进行如此的改变?

1)为什么不应该直接依赖应用系统中的“目标组件”?

依赖在应用系统中是客观存在的,如果应用系统中不存在依赖关系,就意味着应用系统是由各个相互孤立的模块或者组件所构成,这是无法构成一个相互协作和互相配合的有机整体的。

问题是应该依赖谁根据Spring框架中的 IoC的设计原理,应用系统中的某个组件类应该依赖所在的上层容器而不要直接依赖目标组件类。主要是由于目标组件类有可能会随着应用系统的需求变化而经常会发生改变和调整,开发者当然也不希望在应用系统中由于某个“方面”发生改变而相关联的各个组件类也必须随之改变!J2EE平台中倡导多层架构中分层的目的也就是希望能够取得良好的隔离效果。

2)为什么可以依赖于“IoC容器(Spring框架)”?

由于容器相对于应用系统本身而言应该是相对稳定的,不会频繁发生改变(当然,Spring框架本身也会发生升级改变)。这样,也就达到了将应用系统中的“可变”和“不变”部分相互分离的目的。

3.在Spring框架中提出“依赖注入”的设计理念

1)主要目的

软件系统开发中的各种理论、思想包括软件工程等都一直在提倡“软件重用”,但问题是如何能够重用?以及采用什么样的具体实现方法? Spring框架中所提出的“依赖注入”的设计理念为“软件重用”的真正实现带来了可操作的实现方法。

依赖注入的目标并非为软件系统带来更多的功能,应用它的目的是为了提升“组件重用”的概率,同时也为应用系统搭建出一个更加灵活的、可扩展的平台。因为,现在的企业级应用系统的开发更加注重系统的安全性、稳定性、可扩展性和可移植性等目标。

2)应用依赖注入的设计理念在系统架构设计方面所产生的效果

提高了组件的可移植性和可重用度,依赖注入机制减轻了组件之间的依赖关系,因为目标对象的创建并不是在源组件类中直接以编码方式产生的,这也是遵守J2EE平台倡导的“松耦合”的系统开发要求的。

3)应用依赖注入的设计理念在系统开发实现方面所产生的效果

能够更简洁地编程应用J2EE平台中的各种复杂的技术实现,并使应用系统具有良好的可扩展性和灵活性。

下面通过一个在应用系统的持久层开发实现中DAO组件中应用DataSource实现数据库连接的示例,来说明Spring框架中的依赖注入是如何简化系统开发实现的。

 1-3  某个DAO组件获得DataSource对象从而获得数据库连接对象的示例。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"

              "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>

    <bean id="dataSource"class=" org.apache.commons.dbcp.BasicDataSource"

                                    destroy-method="close">

        <property name="driverClassName">

            <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>

 

BasicDataSourceApacheDBCP数据库连接池的实现

        </property>

 

        <property name="url">

            <value>

              jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=

 

定义出目标数据库的连接参数及账号

              WebStudyDB

 

          </value>

        </property>

        <property name="username">

                <value>sa</value>

            </property>

            <property name="password">

                <value>1234</value>

 

定义出目标DAO组件对象

            </property>

 

    </bean&g

分享到:
评论

相关推荐

    什么是Ioc和DI

    在实际应用中,DI通常作为IoC容器的一部分来实现,例如Spring框架中的BeanFactory或ApplicationContext,它们都提供了依赖注入的功能,从而帮助开发人员遵循IoC的原则,构建出更加灵活、可维护的软件系统。...

    day2-Spring IOC 和 DI 注解开发.md

    ### Spring IOC与DI注解开发知识点详解 #### 一、Spring框架...通过以上内容,我们可以了解到Spring框架中IOC和DI的基本概念,以及如何配置和使用数据源(连接池)。这为开发高效稳定的企业级应用提供了坚实的基础。

    关于spring的AOP ,IOC,DI的理解

    IOC,也称为依赖注入,是Spring框架的核心概念之一。它将对象的创建和管理的权利从代码中转移给了Spring容器。在传统的Java程序中,我们通常会使用`new`关键字创建对象,但在Spring中,对象的实例化、初始化和装配都...

    day38 03-Spring的IOC和DI的区别

    标题中的"Spring的IOC和DI的区别"涉及到Spring框架的核心特性,即控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)。这两个概念是理解Spring框架工作方式的关键。 首先,控制...

    Spring 框架的IoC

    ### Spring框架中的IoC(控制反转) 在现代软件开发中,特别是Java企业级应用领域,Spring框架因其灵活性、模块化及强大的功能支持而备受青睐。其中一个重要特性是控制反转(Inversion of Control, IoC),它是一种...

    printer源码.zip

    在IT行业中,Spring框架是Java开发中的一个基石,特别是其依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)的概念,是理解和应用Spring的核心。"printer源码.zip"这个压缩包...

    spring核心IOC以及DI

    【Spring核心IOC以及DI】是Spring框架中的关键概念,它们是Spring实现控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)的基石。这两个概念是Spring框架的核心,使得应用程序的...

    02-01-07-用30个类高仿真提炼纯手写Spring框架V2.0之IOC与DI1

    总结来说,Spring框架的IOC和DI机制提供了强大的组件管理能力,而Lombok则简化了Java开发中的代码编写。了解并熟练掌握这些知识,对于深入理解Spring框架的运作原理以及提升开发效率至关重要。同时,从Servlet到...

    Spring IOC AOP MVC 简单例子

    Spring框架是Java开发中不可或缺的一部分,它以模块化的方式提供了许多功能,如依赖注入(IOC)、面向切面编程(AOP)以及Model-View-Controller(MVC)架构模式。在本实例中,我们将深入探讨这三个核心概念以及它们...

    springIoc实现原理

    Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由代码自身来完成,而在Spring Ioc中...

    SpringIoC和DI注解开发.pdf

    Spring IoC 和 DI 注解开发是 Spring 框架的核心概念,它们使得应用程序更加灵活和可扩展。数据源(连接池)是提高程序性能的一种方式,它可以在程序启动时实例化数据源,初始化部分连接资源。在使用连接资源时,从...

    Spring框架IoC控制反转.pdf

    【Spring框架IoC控制反转】 一、Spring框架是什么 Spring框架是Java开发中的一款轻量级框架,诞生于2003年,旨在简化企业级应用的开发复杂性。Spring的核心理念包括控制反转(IoC)和面向切面编程(AOP)。作为一...

    springioc和spring aop

    Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...

    Spring 5.2.9的IOC核心jar包

    Spring框架是Java后端开发中的一个关键组件,尤其在依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)领域,它扮演着至关重要的角色。Spring 5.2.9版本是该框架的一个稳定版本...

    spring ioc和aop原理流程图(详细)

    在Spring框架中,这个外部容器就是**IOC容器**。以下是Spring IOC容器的主要知识点: 1. **Bean的定义**:在Spring中,业务对象被称为Bean。Bean定义包含了创建和管理Bean的所有信息,如类名、属性值、依赖关系等,...

    Spring 的DI和IoC实例详解(转)

    在Java开发领域,Spring框架是应用最广泛的轻量级框架之一,它以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IoC)特性深受开发者喜爱。本文将深入探讨Spring的DI和IoC...

    Ioc, DI demo

    在Java中,Spring框架是实现IoC和DI的常用工具。 这个"IocPerformance-master"项目可能包含了基准测试代码,用于比较不同IoC容器的初始化时间、对象创建速度、内存占用等性能指标。这样的测试结果可以帮助开发者...

    java 解析xml,模拟spring框架ioc

    在Java编程领域,Spring框架是应用最广泛的轻量级框架之一,它以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)功能而闻名。本教程将深入探讨如何模拟...

    Spring核心学习IOC部分

    在Spring框架中,IOC(Inversion of Control,控制反转)是其核心概念之一,它改变了传统应用程序中的对象创建和管理方式。本学习资料主要聚焦于Spring的IOC容器,特别是从最基本的BeanFactory开始,逐步深入理解...

Global site tag (gtag.js) - Google Analytics