`
laorer
  • 浏览: 434647 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

<转>Spring学习笔记

阅读更多

Spring学习笔记:第一章 Spring的下载和安装

第二章  SpringIoC的入门实例

http://www.360doc.com/showWeb/0/0/224291.aspx

Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用。这一章先从SpringIoC开始。所谓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的低侵入性。

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

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

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

 

5)关于bean.xml的用法

bean.xml的用法还有很多,其中内容是相当丰富的。假设Chinese类里有一个humenName属性(姓名),那么原的bean.xml修改如下。此后生成Chinese对象时,"陈刚"这个值将自动设置到Chinese类的humenName属性中。而且由于singletontrue这时生成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的文档一看就明白了。

分享到:
评论

相关推荐

    springBoot学习笔记整理

    ### Spring Boot 学习笔记之热部署与代码变更检测 #### 概述 Spring Boot 是一个基于 Spring 的框架,旨在简化新 Spring 应用程序的初始设置和开发过程。Spring Boot 的目标是允许开发者“只是运行”,即尽可能...

    Spring Boot学习笔记

    ### Spring Boot 学习笔记 #### 一、Spring Boot 入门 ##### 1. Spring Boot 简介 Spring Boot 是一款简化 Spring 应用开发的框架,它旨在简化传统 Spring 应用复杂的配置过程,使开发者能够更加专注于业务逻辑的...

    基于注解的spring_3.0.x_MVC学习笔记

    在本篇基于注解的Spring 3.0.x MVC学习笔记中,我们将深入探讨Spring MVC在3.0版本中的变化,以及如何通过注解实现快速开发。Spring 3.0.x相较于2.5版本有着显著的改进,尤其在MVC模块上,提供了更加灵活和强大的...

    超详细的springboot学习笔记

    ### Spring Boot 学习笔记概览 #### 一、Spring 的发展历程 1. **Spring 1.x 时代:** - 在Spring框架发展的初期(即Spring 1.x时代),主要采用XML作为配置文件来管理Bean的声明周期。这种方式在项目规模较小的...

    SpringBoot学习笔记

    ### SpringBoot学习笔记 #### 一、SpringBoot入门 ##### 1、SpringBoot简介 - **简化Spring应用开发**:SpringBoot是简化Spring应用开发的一个框架,它通过默认配置极大地减少了开发过程中的样板代码,使得开发者...

    java文集

    &lt;br&gt;ext学习笔记一&lt;br&gt;小试iBatis&lt;br&gt;RIA(Rich Internet Application)的现状和未来&lt;br&gt;Java应用中域名解析不过期的解决方法&lt;br&gt;Java编程那些事儿45—数组使用示例1&lt;br&gt;一步步熟悉OFBiz&lt;br&gt;用Java做客户端调用.NET写...

    springboot 入门学习笔记

    ### SpringBoot 入门学习笔记 #### SpringBoot简介与特性 SpringBoot是Spring社区推出的全新项目,旨在简化基于Spring框架的应用程序开发流程。它通过减少传统Spring应用中的繁琐配置,使得开发者能更快地构建和...

    springBoot笔记一-来自于百度文库1

    在本篇Spring Boot笔记中,我们将探讨Spring Boot的核心特性、如何创建一个简单的Spring Boot应用以及POM.xml配置的解析。 1. **Spring Boot的核心特性** - **快速入门**:Spring Boot通过提供预配置的starter pom...

    Spring Boot笔记.md

    &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt; &lt;version&gt;1.5.9.RELEASE&lt;/version&gt; &lt;/parent&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-...

    springboot学习笔记

    ### Spring Boot 学习笔记知识点总结 #### 一、Spring 的发展历程 1. **Spring 1.x 时代:** - 特征:主要通过 XML 文件来管理 Bean 的声明周期和依赖关系。 - 实践问题:随着项目规模的增长,XML 配置变得异常...

    Spring MVC 学习笔记 一 创建项目

    **Spring MVC 学习笔记 一 创建项目** 在IT领域,Spring MVC是Java Web开发中的一个强大框架,它简化了构建交互式Web应用程序的过程。本笔记将深入探讨如何创建一个基本的Spring MVC项目,让我们开始吧。 首先,...

    springboot开发笔记

    ### Spring Boot 开发笔记知识点详解 #### Spring 的发展历程与配置方式变迁 - **Spring1.x 时代** - 在 Spring1.x 时期,主要通过 XML 文件来管理 Bean 的声明周期和依赖关系。随着项目的复杂度增加,XML 配置...

    我的一些笔记啊啊啊啊啊啊01

    &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt; &lt;version&gt;2.5.9&lt;/version&gt; &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt; &lt;/parent&gt; &lt;groupId&gt;cn.tedu&lt;/groupId&gt; &lt;artifactId&gt;jsd2208-...

    Springcloud学习笔记.md

    Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Springcloud学习笔记.md,Spring...

    spring学习笔记

    Spring 还支持基于配置的继承,通过在 `&lt;bean&gt;` 标签中设置 `parent` 属性,可以继承另一个 Bean 的配置,避免重复定义相同的属性。这种机制并不依赖于 Java 类的继承关系,而是配置层面的继承。 Spring 的优势在于...

    Spring-data-jpa 学习笔记.docx

    ### Spring-data-jpa 学习笔记 #### 一、spring-data-jpa的简单介绍 Spring Data JPA 是 Spring Data 的一部分,它简化了基于 Java Persistence API (JPA) 的数据访问层开发工作。Spring Data 旨在减少数据访问层...

    Spring学习笔记

    ### Spring学习笔记核心知识点解析 #### 一、消息资源配置(`Messagesource`) 在Spring框架中,`Messagesource`接口被用来支持国际化(i18n),它提供了一种方式来根据不同的区域设置(locale)加载不同的资源...

    SpringMVC框架第一天【随堂笔记】1

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;${spring.version}&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;...

Global site tag (gtag.js) - Google Analytics