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

本节书摘来自异步社区《Spring MVC学习指南(第2版)》一书中的第1章,第1.1节,作者:【美】Paul Deck著,更多章节内容可以访问云栖社区“异步社区”公众号查看

第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元素的配置后面将会详细介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值