继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Spring Framwork 官方文档5.0.8翻译 第一章:The IoC Container

慕哥9229398
关注TA
已关注
手记 1245
粉丝 199
获赞 913

最近想系统的学习一下Spring的相关知识,在这里分享一下。也希望能帮助那些对英文技术文档阅读比较困难的朋友。
接下来会持续更新,如果文中有解释的不当之处,欢迎指正,谢谢!~

2018/11/2 ,在翻译的过程中,我发现有些地方英文表达的有些冗余,我可能不会直译,请注意。

英文文档

1.1. 介绍IoC容器和Bean

本章涵盖了 SpringFramwork 中 IoC (控制反转)的实现原理。IoC 也被叫做 DI (依赖注入),它是一个对象定义依赖关系的过程,也就是对象只能通过构造函数参数,工厂方法参数,或者(对象通过new或者工厂方法返回以后)设置属性来定义与其他对象的依赖关系,然后容器在创建Bean时注入这些依赖项。这个过程本质是反转的,因此得名控制反转,其含义是bean自身通过类的构造函数控制对象的初始化或者依赖发现,还是通过像 Service Locator Pattern机制。(关于什么服务定位模式,可以阅读这篇博客Service Locator Pattern)。

org.springframework.beansorg.springframework.contextIoC 容器的基础包,BeanFactory接口提供了高级配置机制,可以管理任何类型的对象。ApplicationContextBeanFactory 的子接口,它添加了易与 Spring AOP 集成,消息资源处理(如:国际化),事件发布以及应用层特定的的contexts,比如web应用的WebApplicationContext等功能。

简而言之,BeanFactory接口提供了配置框架和基本功能,ApplicationContext添加了企业级应用特用的功能点。ApplicationContextBeanFactory 一个完整的超集,也是在本章中专门用于解释 IoC Container的contexts,有关使用 BeanFactory 而不是使用 ApplicationContext 的更多信息,请参考 Bean Factory

在 Spring 中,Spring IoC Container 管理了所有组成应用主干的对象,这些对象叫做 Beans,Bean 要么是由 Spring IoC Container 实例化、装载以及管理的对象,要么就是一个应用中简单的对象。Beans,以及它们之间的依赖关系是在容器使用的配置元数据中配置的。

总结:

  1. 什么是控制反转。

  2. BeanFactoryApplicationContext 的关系。

1.2. 容器概述

org.springframework.context.ApplicationContext 接口表示 Spring IoC Container,负责实例化、配置以及装载 beans。容器通过读取配置元数据实例始化、配置以及装载对象。配置有三种形式,分别是:XML、Java annotations 或者 Java code,它允许你定义应用程序的对象以及这些对象的相互依赖关系。

Spring 提供了 ApplicationContext 接口的几个开箱即用的实现,在独立应用中,通常会创建 ClassPathXmlApplicationContext  或 FileSystemXmlApplicationContext 的实例。虽然 XML 一直是定义配置的传统方式,但是你也可以通过提供少量的 XML 配置来启用 Java annoations 或 Java Code 的配置方式。

大多数场景下,不需要显示创建 Spring IoC Container 的实例,比如:Web 应用场景中,web.xml 文件用简单的大约8行描述就足够。如果你使用 Spring Tool Suite,那么这个配置将会很容易创建,只需要几次键盘鼠标操作。

下图是 Spring 工作原理的高级视图,应用程序类和配置元数据组合起来,在 ApplicationContext 创建和初始化以后,就有一个完整的可执行系统或应用程序。

webp

Figure 1. The Spring IoC Container


1.2.1. 配置元数据

如上图所示,Spring IoC Container 需要一份配置元数据,由应用程序开发人员编写用来告诉容器如何实例化、配置和装载对象。

配置元数据传统方式是由简单、直观的XML格式配置,本章中阐述Spring IoC Container 的关键概念和特性都是用这种方式。

注意:基于XML并不是配置的唯一途径。Spring IoC容器与配置文件完全解耦。现在,许多开发者在他们的Spring应用中选择使用基于Java的配置(后续章节会介绍此部分内容)。

关于配置元数据的其他形式,请参考:

  • Annotation-based configuration:Spring 2.5引入的基于注解配置的元数据。

  • Java-based configuration:Spring 3.0开始,Spring JavaConfig提供的许多特性已经成为了Spring Framework的核心。你可以使用Java而不是XML文件来定义程序类外部的bean。要使用这些新特性,可以参考 @Configuration@Bean@Import@DependsOn   等注解。

Spring 配置至少由一个,通常有多个容器管理的 bean 组成,XML 通过 <bean/> 元素来配置 bean,其父元素,也是顶级元素是 <beans />。基于 Java 配置 bean 通常是在 @Configuration 标注的类中,用 @Bean 标注的方法,表示这个方法会返回一个 bean。

这些 bean 的定义对应组成应用程序的实际对象,通常你可以定义服务层对象,数据访问层对象,表示层对象(Struct Action 实例),底层对象(Hibrenate SessionFactories),JMS Queues等等,但不需要配置一些细粒度的域对象,因为这些对象通常是由 DAOs 和业务逻辑创建和加载。然而,你也可以通过 Spring`s integration with AspectJ 来配置在 IoC  Container 之外创建的对象,请参考:Using AspectJ to dependency-inject domain objects with Spring.

下面的例子展示了基于 XML 配置的基本结构:

<?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">

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here --></beans>

id 属性是一个字符串,唯一标识一个 bean,可以被其他对象引用。class 属性定义 bean 的类型,使用类的完全限定名。关于依赖引用配置,请参考:Dependencies

1.2.2. 初始化容器

初始化一个容器很简单,给 ApplicationContext 构造函数传递一个或多个资源路径,容器也可以加载各种外部资源(文件系统、Java 类路径等)。

ApplicationContext  context = new ClassPathXmlApplicationContext("services.xml","daos.xml");

学习了Spring IoC容器之后,你可能会想去知道更多有关于Spring的Resource,像在Resource章节描述的一样,Spring Resource提供了方便的机制来使用URI规则读取InputStream。尤其是,Resource路径被用来构建应用程序context,下面章节会给出具体描述。

下面的例子展示了服务层bean的配置(services.xml):

<?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">

    <!-- services -->

    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for services go here --></beans>

下面的例子展示了数据接入层bean的配置(daos.xml)

<?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">

    <bean id="accountDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for data access objects go here --></beans>

在上面的例子中,服务层由类 PetStoreServiceImpl 以及两个数据接入层的对象 JpaAccountDaoJpaItemDao 组成。<property /> 元素的 name 属性关联bean对象的属性名称,ref 关联依赖的 bean 的 id

基于XML配置的组合使用
将bean的定义按逻辑层或者功能模块拆分到多个XML配置文件中是很有用的。

你可以给 ApplicationContext 构造函数中传递多个路径来加载配置,也可以通过 <import />标签,将多个配置文件组合在一起使用,比如:configuration.xml

<beans>
    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>

    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/></beans>

在上面的的例子中,外部的 bean 定义是通过:services.xmlmessageSource.xmlthemeSource.xml 三个文件加载。所有的路径都是 configuration.xml 的相对路径,所以 services.xml 必须在
configuration.xml 的相同目录下或者类路径下,messageSource.xmlthemeSource.xml 必须在和 configuration.xml 同级目录下的 resources 目录下。正如你所看到的,messageSource.xml 文件路径的前置斜杠被忽略,因为这些路径都是相对的,所以最好使用这种形式。被导入文件的内容,包括顶级元素 <beans /> 通过 Spring Schema 的校验是一个有效的 XML bean 的定义。



作者:Aiibai
链接:https://www.jianshu.com/p/c03c8d117502


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP