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

    xiaoxiao2024-06-04  119

    本节书摘来自异步社区《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元素的配置后面将会详细介绍。

    相关资源:《Spring MVC学习指南》([美]戴克(Paul Deck))
    最新回复(0)