《Spring MVC学习指南(第2版)》——第1章 Spring框架 1.1XML配置文件

第1章 Spring框架

Spring框架是一个开源的企业应用开发框架,作为一个轻量级的解决方案,它包含20多个不同的模块。本书主要关注Core、Spring Bean、Spring MVC和Spring MVC Test模块。

本章主要介绍Core和Spring Bean这两个模块,以及它们如何提供依赖注入解决方案。为方便初学者,本书会深入讨论依赖注入概念的细节。后续介绍开发MVC应用的章节将会使用到本章介绍的技能。

依赖注入

简单来说,依赖注入的情况如下。

有两个组件A和B,A依赖于B。假定A是一个类,且A有一个方法importantMethod用到了B,如下:

public class A {
  public void importantMethod() {
    B b = ... // get an instance of B
    b.usefulMethod();
    ...
  }
  ...
}

要使用B,类A必须先获得组件B的实例引用。若B是一个具体类,则可通过new关键字直接创建组件B实例。但是,如果B是接口,且有多个实现,则问题就变得复杂了。我们固然可以任意选择接口B的一个实现类,但这也意味着A的可重用性大大降低了,因为无法采用B的其他实现。

依赖注入是这样处理此类情景的:接管对象的创建工作,并将该对象的引用注入需要该对象的组件。以上述情况为例,依赖注入框架会分别创建对象A和对象B,将对象B注入到对象A中。

为了能让框架进行依赖注入,程序员需要编写特定的set方法或者构建方法。例如,为了能将B注入到A中,类A会被修改成如下形式:

public class A {
  private B b;
  public void importantMethod() {
    // no need to worry about creating B anymore
    // B b = ... // get an instance of B
    b.usefulMethod();
    ...
  }
  public void setB(B b) {
    this.b = b;
  }
}

修改后的类A新增了一个set方法,该方法将会被框架调用,以注入B的一个实例。由于对象依赖由依赖注入,类A的importantMethod方法不再需要在调用B的usefulMethod方法前去创建B的一个实例。

当然,也可以采用构造器方式注入,如下所示:

public class A {
  private B b;

  public A(B b) {
    this.b = b;
  }

  public void importantMethod() {
    // no need to worry about creating B anymore
    // B b = ... // get an instance of B
    b.usefulMethod();
    ...
  }
}

本例中,Spring会先创建B的实例,再创建实例A,然后把B注入到实例A中。

注:
 

Spring管理的对象称为beans。
通过提供一个控制反转容器(或者依赖注入容器),Spring为我们提供一种可以“聪明”地管理Java对象依赖关系的方法。其优雅之处在于,程序员无需了解Spring框架的存在,更不需要引入任何Spring类型。

从1.0版本开始,Spring就同时支持setter和构造器方式的依赖注入。从2.5版本开始,通过Autowired注解,Spring支持基于field方式的依赖注入,但缺点是程序必须引入org.springframework.beans.factory.annotation.Autowired,这对Spring产生了依赖,这样,程序无法直接迁移到另一个依赖注入容器间。

使用Spring,程序几乎将所有重要对象的创建工作移交给Spring,并配置如何注入依赖。Spring支持XML或注解两种配置方式。此外,还需要创建一个ApplicationContext对象,代表一个Spring控制反转容器,org.springframework.context.ApplicationContext接口有多个实现,包括ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。这两个实现都需要至少一个包含beans信息的XML文件。ClassPathXmlApplicationContext尝试在类加载路径中加载配置文件,而FileSystemXmlApplicationContext则从文件系统中加载。

下面是从类路径中加载config1.xml和config2.xml的ApplicationContext创建的一个代码示例。

ApplicationContext context = new ClassPathXmlApplicationContext(
    new String[] {"config1.xml", "config2.xml"});

可以通过调用ApplicationContext的getBean方法获得对象。

Product product = context.getBean("product", Product.class);

getBean方法会查询id为product且类型为Product的bean对象。

注:
 

理想情况下,我们只需在测试代码中创建一个ApplicationContext,应用程序本身无需处理。对于Spring MVC应用,可以通过一个Spring Servlet来处理ApplicationContext,而无需直接处理。

1.1 XML配置文件

从1.0版本开始,Spring就支持基于XML的配置;从2.5版本开始,增加了通过注解的配置支持。下面介绍如何配置XML文件。配置文件的根元素通常为beans:

< ?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd">

  ...
< /beans>

如果需要更强的Spring配置能力,可以在schema location属性中添加相应的schema,也可以指定schema版本:

http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
不过,笔者推荐使用默认schema,以便升级spring库时无需修改配置文件。

配置文件既可以是一份,也可以分解为多份,以支持模块化配置。ApplicationContext的实现类支持读取多份配置文件。另一种选择是,通过一份主配置文件,将该文件导入到其他配置文件。

下面是导入其他配置文件的一个示例:

< ?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd">

  < import resource="config1.xml"/>
  < import resource="module2/config2.xml"/>
  < import resource="/resources/config3.xml"/>
 ...
< /beans>

bean元素的配置后面将会详细介绍。

时间: 2024-09-16 04:18:19

《Spring MVC学习指南(第2版)》——第1章 Spring框架 1.1XML配置文件的相关文章

《Spring MVC学习指南(第2版)》——2.7 小结

2.7 小结 在本章中,我们学习了基于MVC模式的模型2架构以及如何基于servlet控制器或者filter分发器开发一个模型2应用.两个示例分别为appdesign1和appdesign2.使用servlet作为过滤器上的控制器,一个明显的优点是你可以将servlet配置为欢迎页面. 在模型2应用程序中,JSP页面通常用做视图,当然也可以使用其他技术,如Apache Velocity和FreeMarker. 如果JSP页面用做模型2体系结构中的视图,那些页面仅用于显示值,并且不应在其中显示脚本

《Spring MVC学习指南(第2版)》——导读

前言 Spring MVC是Spring框架中用于Web应用快速开发的一个模块.Spring MVC的MVC是Model-View-Controller的缩写.它是一个广泛应用于图形化用户交互开发中的设计模式,不仅常见于Web开发,也广泛应用于如Swing和JavaFX等桌面开发. 作为当今业界最主流的Web开发框架,Spring MVC(有时也称Spring Web MVC)的开发技能相当热门.本书可供想要学习如何通过Spring MVC开发基于Java的Web应用的开发人员阅读. HTTP使

《Spring MVC学习指南(第2版)》——1.3 小结

1.3 小结 本章学习了依赖注入的概念以及基于Spring容器的实践,后续将在此基础之上配置Spring应用.

《Spring MVC学习指南(第2版)》——1.2 Spring控制反转容器的使用

1.2 Spring控制反转容器的使用 本节主要介绍Spring如何管理bean和依赖关系.1.2.1 通过构造器创建一个bean实例 前面已经介绍,通过调用ApplicationContext的getBean方法可以获取一个bean的实例.下面的配置文件中定义了一个名为product的bean(见清单1.1). 清单1.1 一个简单的配置文件 < ?xml version="1.0" encoding="UTF-8"?> < beans xmln

《Spring MVC学习指南(第2版)》——第2章 模型2和MVC模式 2.1模型1介绍

第2章 模型2和MVC模式 Java Web应用开发中有两种设计模型,为了方便,分别称为模型1和模型2.模型1是以页面中心,适合于小应用开发.而模型2基于MVC模式,是Java Web应用的推荐架构(简单类型的应用除外). 本章将会讨论模型2,并展示4个不同示例应用.第一个应用是一个基本的模型2应用,采用Servlet作为控制器:第二个应用也是模型2应用,但采用了Filter作为控制器:第三个应用引入了验证控件来校验用户的输入:最后一个应用则采用了一个自研的依赖注入器.在实践中,应替换为Spri

《Spring MVC学习指南(第2版)》——2.6 依赖注入

2.6 依赖注入 在过去数年间,依赖注入技术作为代码可测试性的一个解决方案已经广泛应用.实际上,Spring.Struts2等伟大框架都采用了依赖注入技术.那么,什么是依赖注入技术? 有两个组件A和B,A依赖于B.假定A是一个类,且A有一个方法importantMethod使用到了B,如下: public class A { public void importantMethod() { B b = ... // get an instance of B b.usefulMethod(); ..

《Spring MVC学习指南(第2版)》——2.5 校验器

2.5 校验器 在Web应用执行action时,很重要的一个步骤就是进行输入校验.校验的内容可以是简单的,如检查一个输入是否为空,也可以是复杂的,如校验信用卡号.实际上,因为校验工作如此重要,Java社区专门发布了JSR 303 Bean Validation以及JSR 349 Bean Validation 1.1版本,将Java世界的输入检验进行标准化.现代的MVC框架通常同时支持编程式和声明式两种校验方法.在编程式中,需要通过编码进行用户输入校验,而在声明式中,则需要提供包含校验规则的XM

《Spring MVC学习指南(第2版)》——2.3 模型2之Servlet控制器

2.3 模型2之Servlet控制器 为了便于对模型2有一个直观的了解,本节将展示一个简单模型2应用.实践中,模型2的应用非常复杂. 示例应用名为appdesign1,其功能设定为输入一个产品信息.具体为:用户填写产品表单(图2.2)并提交:示例应用保存产品并展示一个完成页面,显示已保存的产品信息(见图2.3). 图2.2 产品表单 图2.3 产品详细页 示例应用支持如下两个action. (1)展示"添加产品"表单.该action将图2.2中的输入表单发送到浏览器上,其对应的URI应

《Spring MVC学习指南(第2版)》——2.4 模型2之Filter分发器

2.4 模型2之Filter分发器 虽然servlet是模型2应用程序中最常见的控制器,但过滤器也可以充当控制器.但请注意,过滤器没有作为欢迎页面的权限.仅输入域名时不会调用过滤器分派器.Struts 2使用过滤器作为控制器,是因为该过滤器也用于提供静态内容. 下面的例子(appdesign2)是一个采用filter分发器的模型2应用,目录结构如图2.5所示. 图2.5 appdesign2目录结构 JSP页面和Product类同appdesign1相同,但没有采用servlet作为控制器,而是