最近想系统的学习一下Spring的相关知识,在这里分享一下。也希望能帮助那些对英文技术文档阅读比较困难的朋友。
接下来会持续更新,如果文中有解释的不当之处,欢迎指正,谢谢!~
2018/11/2 ,在翻译的过程中,我发现有些地方英文表达的有些冗余,我可能不会直译,请注意。
1.1. 介绍IoC容器和Bean
本章涵盖了 SpringFramwork 中 IoC (控制反转)的实现原理。IoC 也被叫做 DI (依赖注入),它是一个对象定义依赖关系的过程,也就是对象只能通过构造函数参数,工厂方法参数,或者(对象通过new或者工厂方法返回以后)设置属性来定义与其他对象的依赖关系,然后容器在创建Bean时注入这些依赖项。这个过程本质是反转的,因此得名控制反转,其含义是bean自身通过类的构造函数控制对象的初始化或者依赖发现,还是通过像 Service Locator Pattern机制。(关于什么服务定位模式,可以阅读这篇博客Service Locator Pattern)。
org.springframework.beans
和 org.springframework.context
是 IoC 容器的基础包,BeanFactory
接口提供了高级配置机制,可以管理任何类型的对象。ApplicationContext
是 BeanFactory
的子接口,它添加了易与 Spring AOP 集成,消息资源处理(如:国际化),事件发布以及应用层特定的的contexts,比如web应用的WebApplicationContext
等功能。
简而言之,BeanFactory
接口提供了配置框架和基本功能,ApplicationContext
添加了企业级应用特用的功能点。ApplicationContext
是 BeanFactory
一个完整的超集,也是在本章中专门用于解释 IoC Container的contexts,有关使用 BeanFactory
而不是使用 ApplicationContext
的更多信息,请参考 Bean Factory。
在 Spring 中,Spring IoC Container 管理了所有组成应用主干的对象,这些对象叫做 Beans,Bean 要么是由 Spring IoC Container 实例化、装载以及管理的对象,要么就是一个应用中简单的对象。Beans,以及它们之间的依赖关系是在容器使用的配置元数据中配置的。
总结:
什么是控制反转。
BeanFactory
和ApplicationContext
的关系。
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
创建和初始化以后,就有一个完整的可执行系统或应用程序。
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
以及两个数据接入层的对象 JpaAccountDao
和 JpaItemDao
组成。<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.xml
,messageSource.xml
和 themeSource.xml
三个文件加载。所有的路径都是 configuration.xml
的相对路径,所以 services.xml
必须在configuration.xml
的相同目录下或者类路径下,messageSource.xml
和 themeSource.xml
必须在和 configuration.xml
同级目录下的 resources
目录下。正如你所看到的,messageSource.xml
文件路径的前置斜杠被忽略,因为这些路径都是相对的,所以最好使用这种形式。被导入文件的内容,包括顶级元素 <beans />
通过 Spring Schema 的校验是一个有效的 XML bean 的定义。
作者:Aiibai
链接:https://www.jianshu.com/p/c03c8d117502
共同学习,写下你的评论
评论加载中...
作者其他优质文章