`
lshh83
  • 浏览: 162531 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring学习笔记:第二章 Spring中IoC的入门实例

阅读更多
第二章    Spring中IoC的入门实例
Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用。这一章先从Spring的IoC开始。所谓IoC就是一个用XML来定义生成对象的模式,我们看看如果来使用的。

1、数据模型。
1、如下图所示有三个类,Human(人类)是接口,Chinese(中国人)是一个子类,American(美国人)是另外一个子类。



源代码如下:

package cn.com.chengang.spring;

public interface Human {

         void eat();

         void walk();

}


package cn.com.chengang.spring;

public class Chinese implements Human {

      /* (非 Javadoc)

       * @see cn.com.chengang.spring.Human#eat()

       */

      public void eat() {

          System.out.println("中国人对吃很有一套");

      }


      /* (非 Javadoc)

       * @see cn.com.chengang.spring.Human#walk()

       */

      public void walk() {

          System.out.println("中国人行如飞");

      }

}


package cn.com.chengang.spring;

public class American implements Human {

      /* (非 Javadoc)

       * @see cn.com.chengang.spring.Human#eat()

       */

      public void eat() {

          System.out.println("美国人主要以面包为主");

      }


      /* (非 Javadoc)

       * @see cn.com.chengang.spring.Human#walk()

       */

      public void walk() {

          System.out.println("美国人以车代步,有四肢退化的趋势");

      }

}


2、对以上对象采用工厂模式的用法如下
创建一个工厂类Factory,如下。这个工厂类里定义了两个字符串常量,所标识不同的人种。getHuman方法根据传入参数的字串,来判断要生成什么样的人种。

package cn.com.chengang.spring;

public class Factory {

      public final static String CHINESE = "Chinese";

      public final static String AMERICAN = "American";


      public Human getHuman(String ethnic) {

          if (ethnic.equals(CHINESE))

              return new Chinese();

          else if (ethnic.equals(AMERICAN))

              return new American();

          else

              throw new IllegalArgumentException("参数(人种)错误");

      }

}


下面是一个测试的程序,使用工厂方法来得到了不同的“人种对象”,并执行相应的方法。

package cn.com.chengang.spring;

public class ClientTest {

      public static void main(String[] args) {

          Human human = null;

          human = new Factory().getHuman(Factory.CHINESE);

          human.eat();

          human.walk();

          human = new Factory().getHuman(Factory.AMERICAN);

          human.eat();

          human.walk();

      }

}


控制台的打印结果如下:




3、采用Spring的IoC的用法如下:
1、在项目根目录下创建一个bean.xml文件

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

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

         <bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>

         <bean id="American" class="cn.com.chengang.spring.American"/>

</beans>

bean.xml的位置如下图,注意不要看花眼把它看成是lib目录下的了,它是在myspring目录下的。




2、修改ClientTest程序如下:

package cn.com.chengang.spring;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class ClientTest {

      public final static String CHINESE = "Chinese";

      public final static String AMERICAN = "American";


      public static void main(String[] args) {

          //          Human human = null;

          //          human = new Factory().getHuman(Factory.CHINESE);

          //          human.eat();

          //          human.walk();

          //          human = new Factory().getHuman(Factory.AMERICAN);

          //          human.eat();

          //          human.walk();


          ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");

          Human human = null;

          human = (Human) ctx.getBean(CHINESE);

          human.eat();

          human.walk();

          human = (Human) ctx.getBean(AMERICAN);

          human.eat();

          human.walk();

      }

}

从这个程序可以看到,ctx就相当于原来的Factory工厂,原来的Factory就可以删除掉了。然后又把Factory里的两个常量移到了ClientTest类里,整个程序结构基本一样。

再回头看原来的bean.xml文件的这一句

<bean id="Chinese" class="cn.com.chengang.spring.Chinese"/>

id就是ctx.getBean的参数值,一个字符串。class就是一个类(包名+类名)。然后在ClientTest类里获得Chinese对象就是这么一句

human = (Human) ctx.getBean(CHINESE);

因为getBean方法返回的是Object类型,所以前面要加一个类型转换。


4、总结
(1)也许有人说,IoC和工厂模式不是一样的作用吗,用IoC好象还麻烦一点。

       举个例子,如果用户需求发生变化,要把Chinese类修改一下。那么前一种工厂模式,就要更改Factory类的方法,并且重新编译布署。而IoC只需要将class属性改变一下,并且由于IoC利用了Java反射机制,这些对象是动态生成的,这时我们就可以热插拨Chinese对象(不必把原程序停止下来重新编译布署)


       (2)也许有人说,即然IoC这么好,那么我把系统所有对象都用IoC方式来生成。

       注意,IoC的灵活性是有代价的:设置步骤麻烦、生成对象的方式不直观、反射比正常生成对象在效率上慢一点。因此使用IoC要看有没有必要,我认为比较通用的判断方式是:用到工厂模式的地方都可以考虑用IoC模式。


       (3)在上面的IoC的方式里,还有一些可以变化的地方。比如,bean.xml不一定要放在项目录下,也可以放在其他地方,比如cn.com.chengang.spring包里。不过在使用时也要变化一下,如下所示:

new FileSystemXmlApplicationContext("src/cn/com/chengang/spring/bean.xml");

另外,bean.xml也可以改成其他名字。这样我们在系统中就可以分门别类的设置不同的bean.xml。


(4)关于IoC的低侵入性。

什么是低侵入性?如果你用过Struts或EJB就会发现,要继承一些接口或类,才能利用它们的框架开发。这样,系统就被绑定在Struts、EJB上了,对系统的可移植性产生不利的影响。如果代码中很少涉及某一个框架的代码,那么这个框架就可以称做是一个低侵入性的框架。

Spring的侵入性很低,Humen.java、Chinese.java等几个类都不必继承什么接口或类。但在ClientTest里还是有一些Spring的影子:FileSystemXmlApplicationContext类和ctx.getBean方式等。

现在,低侵入性似乎也成了判定一个框架的实现技术好坏的标准之一。


(5)关于bean.xml的用法

bean.xml的用法还有很多,其中内容是相当丰富的。假设Chinese类里有一个humenName属性(姓名),那么原的bean.xml修改如下。此后生成Chinese对象时,“陈刚”这个值将自动设置到Chinese类的humenName属性中。而且由于singleton为true这时生成Chinese对象将采用单例模式,系统仅存在一个Chinese对象实例。

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

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

         <bean id="Chinese" class="cn.com.chengang.spring.Chinese"    singleton="true">

                <property name="humenName">

                       <value>陈刚</value>

                </property>

         </bean>

         <bean id="American" class="cn.com.chengang.spring.American"/>

</beans>


关于bean.xml的其它用法,不再详细介绍了,大家自己拿Spring的文档一看就明白了。
分享到:
评论
1 楼 pengchhx 2010-01-28  
没图没真相

相关推荐

    Spring学习笔记&源码

    本资料“Spring学习笔记&源码”是基于网易云课堂黑马程序员的Spring四天精通课程,旨在帮助学习者深入理解和实践Spring框架。 笔记部分可能会涵盖以下内容: 1. **Spring概述**:介绍Spring框架的历史、特点和主要...

    Spring学习笔记.doc

    ### Spring学习笔记知识点详解 #### 一、Spring框架概述 **1.1 什么是Spring** Spring框架是一个开源的轻量级应用框架,主要用于简化企业级应用程序的开发过程。它的核心特性在于提供了一种灵活的方式来组织和...

    spring学习笔记

    ### Spring学习笔记知识点详解 #### 一、Spring框架概述 **Spring** 是一个开源的、分层的企业级应用开发框架,旨在简化Java EE应用程序的开发。它的主要目标是提高开发效率,减少耦合度,并提供一种更为简洁的...

    Spring框架学习笔记

    Spring框架是Java开发中广泛应用的轻量级...这份"Spring框架学习笔记"会深入探讨以上各个知识点,通过PDF文档的形式,提供详细的讲解和实例,对于想要深入了解和学习Spring框架的人来说,无疑是一份实用的学习资源。

    Spring.NET学习笔记-实现一个简易的IoC框架

    ### Spring.NET学习笔记-实现一个简易的IoC框架 #### 一、背景介绍与理论基础 在.NET领域中,Spring.NET框架是一个非常重要的轻量级框架,它支持依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...

    马士兵老师spring框架学习笔记

    马士兵老师的Spring框架学习笔记会详细讲解这些概念,并结合实例帮助读者理解并掌握如何在实际项目中应用Spring框架。通过学习,你可以提升Java开发技能,更好地理解和运用Spring生态,为你的职业发展奠定坚实基础。

    马士兵spring学习笔记

    ### 马士兵Spring学习笔记知识点汇总 ...综上所述,马士兵Spring学习笔记涵盖了Spring的核心概念及其在实际项目中的应用,包括IoC、AOP、整合其他框架等方面的知识点。对于初学者来说,是一份非常有价值的参考资料。

    Spring学习笔记总结

    Spring学习笔记总结 Spring是一个基于Java的框架,它提供了一种简洁、灵活的方式来构建企业级应用程序。在这个笔记中,我们将总结Spring的主要概念和技术,包括IOC、AOP、MVC、Struts2和Hibernate的集成。 IOC...

    Spring 学习笔记 spring帮助文档

    在本篇Spring学习笔记中,我们将深入探讨Spring的基本概念,包括bean的配置、依赖注入、IOC容器以及Bean的实例化方式。 首先,Spring中的核心概念是bean。Bean是Spring框架中的基本构建块,它们是被管理的对象,...

    SPRING学习笔记2

    Spring学习笔记2涵盖了Spring框架的核心概念和重要特性,旨在帮助开发者深入理解并熟练掌握Spring的使用。 1. **依赖注入(Dependency Injection, DI)**:这是Spring最核心的设计原则,它允许对象之间的依赖关系在...

    spring学习笔记(3.20)

    标题 "spring学习笔记(3.20)" 暗示我们即将探讨的是关于Spring框架的某个特定主题,可能涵盖版本3.20或基于该版本的学习内容。Spring是一个广泛使用的Java企业级应用开发框架,它提供了依赖注入、AOP(面向切面编程...

    spring指南学习笔记

    标题和描述均提到了“spring指南学习笔记”,这意味着文档聚焦于Spring框架的学习心得与关键概念。Spring是一个开源的Java企业级应用框架,以其强大的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...

    spring的学习笔记

    以下是对Spring框架中IoC、DI和AOP等关键知识点的详细解析。 ### 1. **IoC(Inversion of Control,控制反转)** IoC是Spring的核心概念之一,它将对象的创建和管理权交给了容器,而不是由对象自身负责。这样可以...

    spring框架学习笔记

    Spring框架是Java应用开发中广泛使用的轻量级框架,它以IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)为核心,提供了丰富的功能,包括但不限于组件管理、AOP(Aspect Oriented ...

    spring学习笔记 私塾在线

    【Spring学习笔记 私塾在线】是一份综合性的学习资源,包含了从网上收集的各种Spring相关的教程和实战指导。这份笔记的目的是为学习者提供一个全面的Spring框架学习平台,通过集成多个主题,帮助用户深入理解和掌握...

    良葛格Spring学习笔记

    ### 良葛格Spring学习笔记 #### 一、Spring框架概述 Spring是一个开源框架,由Rod Johnson创建并在他的著作《Expert One-on-One: J2EE Design and Development》中首次提及。Spring框架的设计目的是为了简化企业级...

    Spring学习笔记-cqupt

    在本篇 Spring 学习笔记中,我们将探讨 Spring 的入门、优点、组成以及重要的IOC理论。 1. **Spring 简介** Spring 是一个开源的、免费的 Java 框架,它的目标是减少企业级开发的复杂性。它集成了许多现有的技术,...

    spring学习笔记1

    ### Spring学习笔记1 #### 一、Spring框架简介与IOC概念 **Spring**是一个开源的Java平台框架,它提供了一种全面的编程模型,并通过一系列的功能模块支持企业级应用程序开发。Spring的核心特性包括依赖注入...

    牛人的spring学习笔记,非常适合初学者

    ### 牛人的Spring学习笔记,非常适合初学者 #### 第一课:面向抽象编程 面向抽象编程是一种编程思想,强调在程序设计过程中通过定义抽象层来分离业务逻辑与具体实现细节。这种方式有助于提高软件的可维护性和扩展...

    Java相关课程系列笔记之十五Spring学习笔记

    本文主要围绕Spring的学习笔记展开,包括Spring的基本概念、容器的应用以及IoC特性进行深入探讨。 ### 一、Spring概述 1. **Spring框架的作用**:Spring的主要作用是提供一个统一的编程模型,通过容器管理对象...

Global site tag (gtag.js) - Google Analytics