`
朱嘉华
  • 浏览: 238371 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

spring IOC

阅读更多

IoCDI

  首先想说说IoCInversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和 对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱 好、qq号、电话号、ip号、iq………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传 统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比 Connection等),对象始终会和其他的接口或类藕合起来。

  那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚 介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我 们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控 制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什 么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象 都被spring控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。

IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DIDependency Injection,依赖注入)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉springA中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统 运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。关于反射的相关资料请查阅java doc


    我想通过Bromon的介绍,大家对IoCDI都有了比较生动的理解了。再来看看《expert one-on-one J2EE Development without EJB中文版》是怎么解释这两个概念的。书上是这么说的:

IoC是一个很大的概念,可以用不同的方式来实现。主要的实现形式有两种:

依赖查找:容器提供回调接口和上下文环境给组件。EJBApache Avalon都是使用这种方式。

依赖注入:组件不做定位查询,只是提供普通的Java方法让容器去决定依赖关系。容器全权负责组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造子传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造子参数传入的做法称为构造子注入(Constructor Injection)。

附图说明:

 

 

   

到这里,大家应该对IoCDI都有了初步的认识了。其实就Spring来说,就是JavaBeanSpring来管理组装,表面上看就少了几个new字,其实就是为了降低耦合度,这也是我们做软件的目标之一。

至于Spring是怎样实现IoC的,expert one-on-one J2EE Development without EJB中文版》第七章“Spring框架介绍”很详细的列举了多种方法。说实在,一下子看这么多,我真有点糊涂了。我还是自己写个Demo熟悉一下大名鼎鼎的Spring吧。

首先得下载SpringSpring网上有两种Spring 包一种是spring-framework-1.2.6-with-dependencies.zip,另一种是spring-framework-1.2.6.zip。当然最好是下载spring-framework-1.2.6-with-dependencies.zip形式的,因为里面包括了更多的东东。spring-framework-1.2.6-with-dependencies.zip的下载地址是:http://prdownloads.sourceforge.net/springframework/spring-framework-1.2.6-with-dependencies.zip

下载下来,解压后,你会发现里面有很多jar文件。因为刚刚接触Spring,因此我只需要spring-core.jarspring-framework-1.2.6\dist),将其导入eclipse的构建路径中。另外,log日志是需要的,这也是为了养成良好的编程习惯。将log4j-1.2.9.jarspring-framework-1.2.6\lib\log4j)和commons-logging.jarspring-framework-1.2.6\lib\jakarta-commons)导入到构建路径中。

准备就绪,开始写Demo了。

我的工程的结构是:

  

<!--[if !supportLists]-->1、 <!--[endif]-->log4j.properties代码:

 

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->log4j.rootLogger=Debug, stdout
log4j.appender.stdout
=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout
=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern
=%c{1- %m%n

 

 

如何使用Log4j,请看我的另一篇转贴的文章:如何使用Log4J

 

<!--[if !supportLists]-->2、 <!--[endif]-->HelloBean的代码:

 

 

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->package com;

public class HelloBean {
    
private String helloworld="Hello!World!";
    
    
public String getHelloworld() {
        
return helloworld;
    }
    
    
public void setHelloworld(String helloworld) {
        
this.helloworld = helloworld;
    }
}


 

 

这是一个简单的JavaBean,有个String类型的helloworld属性,初始值是"Hello!World!" 

<!--[if !supportLists]-->3、 <!--[endif]-->Bean.xml代码:

 

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
    
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
   
<bean id="helloBean" class="com.HelloBean">
        
<property name="helloworld">
            
<value>Hello!Rick</value>
        
</property>
   
</bean>
</beans>

 

 

        Spirng重点之一就是配置文件,上面是个相当简单的配置文件,我想大家都应该看得懂。最后就是写应用程序了。

4、 <!--[endif]-->Test的代码:

 

 

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->package com;

import org.springframework.beans.factory.*;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class Test {

    
public static void main(String[] args) {
        
//实例化JavaBean,主要是为了比较new对象和依赖注入两者的区别
        HelloBean hellobean=new HelloBean();
        System.out.println(hellobean.getHelloworld());
        
        
//通过Spring访问JavaBean组件
        Resource resource=new ClassPathResource("com/bean.xml");
        BeanFactory factory
=new XmlBeanFactory(resource);
        hellobean
=(HelloBean)factory.getBean("helloBean");
        System.out.println(hellobean.getHelloworld());
    }
}

 

    这个Demo很好的阐述了Spring的Ioc,其实就Spring而言,就是通过配置文件,让Spring如同一个管家一样来管理所有的Bean类。

    Spring的依赖注入相对复杂一点,主要是明白调用别的Bean,不是通过实例化对象来调用,而是告诉Spring,我需要什么Bean,然后Spring再向你的Bean里面注入你所需要的Bean对象。
    接下来说说代码实现,我只是在刚刚的例子上再添加一点东东。
    首先要增加一个HelloImp的接口,这是问什么呢,那你得问Spring,它定的规矩:JavaBean的实现要有两个部分,一个接口,一个默认实现。你不照做就不行。
    HelloImp代码:  
     

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->package com;

public interface HelloImp {
    
public void getName();
}

   
    实现HelloImp的Hello代码:
  

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->package com;

public class Hello implements HelloImp {
    
public void getName(){
        System.out.println(
"Jack");
    }
}

         
    接着就是在HelloBean中调用Hello了。Spring的不同之处也在这体现出来。

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->package com;

public class HelloBean {
    
private String helloworld="Hello!World!";
    
private HelloImp hello;  //注意这个私有对象是借口

    
public String getHelloworld() {
        
return helloworld;
    }
    
    
public void setHelloworld(String helloworld) {
        
this.helloworld = helloworld;
    }
    
    
public void setHello(HelloImp hello) {
        
this.hello = hello;
    }
    
  
public void get(){
        
this
.hello.getName();
   }

}

    注意字体加粗的地方。

    配置文件也需要增加一点东西:

   

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
    
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<!—注意引用的类是具体的类Hello-->
   
<bean id="myHello" class="com.Hello">
   
</bean>
   
<bean id="helloBean" class="com.HelloBean">
        
<property name="helloworld">
            
<value>Hello!Rick</value>
        
</property>
       
<property name="hello">
           
<ref bean="myHello"></ref>
       
</property>

   
</bean>
</beans>


    注意字体加粗的部分。

    最后在Test中添加一句hellobean.get();就可以看到结果了。


到这,Spring的IoC和DI总算有了一定的认识,也算是敲开了Spring的大门了。

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->package com;

import org.springframework.beans.factory.*;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class Test {

    
public static void main(String[] args) {
        HelloBean hellobean
=new HelloBean();
        System.out.println(hellobean.getHelloworld());
        
        Resource resource
=new ClassPathResource("com/bean.xml");
        BeanFactory factory
=new XmlBeanFactory(resource);
        
        hellobean
=(HelloBean)factory.getBean("helloBean");
        System.out.println(hellobean.getHelloworld());
        hellobean.get();
    }
}

 

 

分享到:
评论

相关推荐

    springIoc实现原理

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

    spring Ioc容器配置

    spring Ioc容器配置 IOC容器数据源配置 &lt;!-- 配置数据源 --&gt; destroy-method="close"&gt; &lt;value&gt;org.gjt.mm.mysql.Driver &lt;value&gt;jdbc:mysql://localhost:3306/demo &lt;value&gt;root ...

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

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    实验一 Springioc基本操作.docx

    SpringIOC是Spring Framework中的核心组件之一,负责管理应用程序中的对象、依赖关系和生命周期。 在 Spring IOC 中,对象的创建和管理是通过 BeanFactory 或 ApplicationContext 实现的。BeanFactory 是 Spring ...

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    Spring IoC加载流程讲解

    Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...

    SpringIoc示例代码

    Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...

    spring ioc思维导图源文件

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...

    SpringIOC经典Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建和管理交由Spring容器来处理,开发者可以更专注于业务逻辑。下面,我们将深入探讨Spring IOC...

    Springioc注入Demo

    Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它将对象的创建和管理权交由Spring容器来负责,从而实现了依赖倒置,增强了代码的可测试性和可维护性。DI(Dependency Injection,依赖注入)...

    Spring IoC依赖包

    Spring IoC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它是一种设计模式,改变了传统程序中的对象创建和管理的方式,将对象的生命周期管理交由Spring容器来负责,使得代码更加解耦,...

    Spring IOC.pdf

    Spring IOC,即Spring控制反转,是Spring框架的核心特性之一。控制反转(Inversion of Control,简称IoC)是一种设计原则,用于减少代码间的耦合,提高系统模块化和代码的重用性。在Spring框架中,IOC具体体现在对...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    标题《Spring IoC源码深度剖析开源架构源码2021.pdf》和描述《Spring IoC源码深度剖析开源架构源码2021.pdf》表明该文档主要面向于分析Spring框架中控制反转(IoC)容器的核心源码,解析和理解其内部的工作机制及...

    Java反射_Spring IOC

    Java反射和Spring IOC是Java开发中的两个重要概念,它们在构建灵活、可扩展的应用程序时起着关键作用。本文将深入探讨这两个主题,并提供相关的学习资源。 首先,让我们了解一下Java反射。Java反射机制是Java语言的...

    Spring Ioc 注解 依赖注入

    ### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...

    手写spring ioc(三) 资源org.zip

    在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...

    模拟spring ioc过程

    在Spring框架中,IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和管理职责从应用代码中分离出来,交由框架来处理。这样,开发者可以更专注于业务逻辑,而不是对象的生命周期。AOP(Aspect ...

    springIOC手写框架分析

    springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...

    spring ioc模块手写demo

    spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...

    Spring IoC讲解PPT

    **Spring 的 IoC 容器** IoC(Inversion of Control)即控制反转,是 Spring 的核心特性之一。在传统的编程模式中,对象之间存在依赖关系,程序员需要手动创建和管理这些对象。而在 Spring 中,IoC 容器负责管理和...

Global site tag (gtag.js) - Google Analytics