5. IoC容器

5.1介绍Spring IoC容器和bean 5.2容器概述

本章介绍Spring Framework实现控制反转(IoC)[1]原理。IoC也被称为依赖注入(DI)。它是一个过程,对象通过构造函数参数,工厂方法的参数或在工厂方法构造或返回后在对象实例上设置的属性来定义它们的依赖关系,即它们使用的其他对象。容器在创建bean时会注入这些依赖关系。这个过程从根本上来说是相反的,因此名为控制反转(IoC),bean本身通过使用类的直接构造来控制其依赖关系的实例化或位置,或者诸如服务定位器模式。

org.springframework.beans和 org.springframework.context包是Spring框架的IoC容器的基础。该BeanFactory接口提供了一种能够管理任何类型对象的高级配置机制。 ApplicationContext是一个子接口 BeanFactory.它增加了与Spring的AOP特性的更容易的集成; 消息资源处理(用于国际化),事件发布; 和特定于应用层的上下文(例如,WebApplicationContext 用于Web应用程序中)。

简而言之,它BeanFactory提供了配置框架和基本功能,并 ApplicationContext增加了更多的企业特定功能。这 ApplicationContext是一个完整的超集BeanFactory,并在本章中专门用于描述Spring的IoC容器。有关使用BeanFactory而不是ApplicationContext,参考第5.15节“The BeanFactory”的更多信息。

在Spring中,构成应用程序主干和由Spring IoC 容器管理的对象称为bean。bean是一个实例化,组装并由Spring IoC容器管理的对象。否则,bean只是应用程序中众多对象中的一个。Bean和它们之间的依赖关系反映在容器使用的配置元数据中。

5.2容器概述

该接口 org.springframework.context.ApplicationContext 表示Spring IoC容器,并负责实例化,配置和组装上述bean。容器通过读取配置元数据获取有关要实例化,配置和组装的对象的指示信息。配置元数据用XML,Java注释或Java代码表示。它允许您表示组成应用程序的对象以及这些对象之间丰富的相互依赖关系。

ApplicationContextSpring提供了几个接口的实现 。在独立应用程序中,通常会创建一个ClassPathXmlApplicationContextor 的实例FileSystemXmlApplicationContext。虽然XML是用于定义配置元数据的传统格式,但您可以通过提供少量的XML配置来指示容器使用Java注释或代码作为元数据格式,以声明方式支持这些其他元数据格式。

在大多数应用场景中,显式用户代码不需要实例化Spring IoC容器的一个或多个实例。例如,在Web应用程序场景中,应用程序文件中简单的八行(或多行)样板J2EE Web描述符XML web.xml通常就足够了(请参见第5.14.4节“ ApplicationContext Web应用程序的便捷实例”)。如果您使用的是SpringSource Tool Suite Eclipse驱动的开发环境或Spring Roo,则只需点击几下鼠标或击键即可轻松创建此样板配置。

下图是Spring如何工作的高级视图。您的应用程序类与配置元数据相结合,以便在ApplicationContext创建并初始化之后,您拥有完全配置且可执行的系统或应用程序。

Spring IoC容器

5.2.1配置元数据

如上图所示,Spring IoC容器使用一种形式的配置元数据 ; 此配置元数据表示作为应用程序开发人员如何告诉Spring容器在您的应用程序中实例化,配置和组装对象。

配置元数据传统上以简单直观的XML格式提供,这是本章的大部分内容用来传达Spring IoC容器的关键概念和功能。

基于XML的元数据不是唯一允许的配置元数据形式。Spring IoC容器本身 完全与此配置元数据实际写入的格式分离。

有关在Spring容器中使用其他形式的元数据的信息,请参阅:

  • 基于注释的配置:Spring 2.5引入了对基于注释的配置元数据的支持。

  • 基于Java的配置:从Spring 3.0开始,Spring JavaConfig项目提供的许多功能成为核心Spring框架的一部分。因此,您可以使用Java而不是XML文件来定义应用程序类外部的Bean。要使用这些新功能,请参阅 @Configuration@Bean, @Import和 @DependsOn注释。

Spring配置由容器必须管理的至少一个,通常是多个bean定义组成。基于XML的配置元数据将这些bean配置为 <bean/>顶层元素内的 <beans/>元素。

这些bean定义对应于组成应用程序的实际对象。通常,您可以定义服务层对象,数据访问对象(DAO),Struts Action实例等表示对象 ,Hibernate SessionFactories,JMS 等基础结构对象Queues。通常,不会在容器中配置细粒度的域对象,因为创建和加载域对象通常是DAO和业务逻辑的责任。但是,您可以使用Spring与AspectJ的集成来配置在IoC容器控制之外创建的对象。请参阅使用AspectJ依赖注入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 = “...” >
<! - 此bean的协作者和配置转到此处 - >
</ bean> <bean id = “...” class = “...” >
<! - 此bean的协作者和配置转到此处 - >
</ bean> <! - 更多的bean定义在这里 - > </bean>

id属性是一个用来标识单个bean定义的字符串。该class 属性定义了bean的类型并使用完全限定的类名。id属性的值是指协作对象。本示例中未显示用于引用协作对象的XML; 有关更多信息,请参阅依赖关系

5.2.2实例化一个容器

实例化Spring IoC容器很简单。提供给ApplicationContext构造函数的位置路径 实际上是资源字符串,它允许容器从各种外部资源(如本地文件系统,Java等)加载配置元数据CLASSPATH

ApplicationContext context =
new ClassPathXmlApplicationContext(new String [] { “services.xml”,“daos.xml” });

在了解Spring的IoC容器之后,您可能想了解更多关于Spring Resource 抽象的知识,如第6章“ 资源”中所述,该资源为从URI语法中定义的位置提供了一种读取InputStream的便捷机制。特别是, Resource路径被用来构建应用程序上下文,如第6.7节“应用程序上下文和Resource路径”中所述

以下示例显示服务层对象 (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” / >
<! - 此bean的其他协作者和配置转到此处 - >
</ bean> <! - 更多的服务的bean定义在这里 - > </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.ibatis.SqlMapAccountDao” >
<! - 此bean的其他协作者和配置转到此处 - >
</ bean> <bean id = “itemDao” class = “org.springframework.samples.jpetstore.dao.ibatis.SqlMapItemDao” >
<! - 此bean的其他协作者和配置转到此处 - >
</ bean> <! - 更多的数据访问对象的bean定义在这里 - > </bean>

在前面的例子中,服务层由类组成 PetStoreServiceImpl,而类型SqlMapAccountDao和SqlMapItemDao的两个数据访问对象基于iBatis 对象/关系映射框架。该property name元素引用JavaBean属性的名称,该ref元素引用另一个bean定义的名称。id和ref元素之间的这种联系表示协作对象之间的依赖关系。有关配置对象依赖关系的详细信息,请参阅依赖关系

编写基于XML的配置元数据

让bean定义跨越多个XML文件可能很有用。通常,每个单独的XML配置文件都代表了架构中的逻辑层或模块。

您可以使用应用程序上下文构造函数从所有这些XML片段中加载bean定义。这个构造函数有多个Resource位置,如前一节所示。或者,使用一个或多个<import/>元素来从另一个或多个文件加载bean定义。例如:

<bean>

    <import  resource = “services.xml” />
<import resource = “resources / messageSource.xml” />
<import resource = “ / resources/ themeSource.xml” /> <bean id = “bean1” class = “...” />
<bean id = “bean2” class = “...” /> </bean>

在前面的例子中,外部豆定义是从三个文件中,加载services.xml, messageSource.xml和 themeSource.xml。所有位置路径都与导入的定义文件相关,因此services.xml必须位于与导入文件 相同的目录或类路径位置, messageSource.xml而且 themeSource.xml必须位于 resources导入文件位置下方的位置。正如你所看到的,一个前导斜线被忽略,但是鉴于这些路径是相对的,最好不要使用斜线。<beans/>根据Spring Schema或DTD ,正在导入的文件(包括顶层元素)的内容必须是有效的XML bean定义。

可能但不推荐使用相对的“../”路径引用父目录中的文件。这样做会创建对当前应用程序外部的文件的依赖关系。特别是,不建议将此引用用于“classpath:”URL(例如“classpath:../ services.xml”),其中运行时解析过程选择“最近”的类路径根,然后查看其父目录。类路径配置更改可能会导致选择不同的,不正确的目录。

您始终可以使用完全限定的资源位置而不是相对路径:例如,“file:C:/config/services.xml”或“c​​lasspath:/config/services.xml”。但是,请注意,您将应用程序的配置与特定绝对位置相关联。通常最好保持这种绝对位置的间接性,例如通过在运行时根据JVM系统属性解析的“$ {...}”占位符。

5.2.3使用容器

ApplicationContext是高级工厂的接口,能够维护不同bean及其依赖项的注册表。使用该方法T getBean(String name, Class<T> requiredType)可以检索bean的实例。

ApplicationContext可以读取bean定义并访问它们,如下所示:

// 创建并配置Bean
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"}); //检索配置实例
PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class); //使用配置的实例
List userList = service.getUsernameList();

getBean()用来检索你的bean的实例。该ApplicationContext 接口还有其他一些检索bean的方法,但理想情况下,应用程序代码不应该使用它们。事实上,你的应用程序代码根本不应该调用该getBean()方法,因此完全不依赖于Spring API。例如,Spring与Web框架的集成为各种Web框架类(如控制器和JSF托管的Bean)提供了依赖注入。

spring-framework-中文文档一:IoC容器、介绍Spring IoC容器和bean的更多相关文章

  1. spring boot 中文文档地址

    spring boot 中文文档地址     http://oopsguy.com/documents/springboot-docs/1.5.4/index.html Spring Boot 参考指 ...

  2. Django REST framework 中文文档

    Django REST framework介绍 现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势. 显然API开发已经成为后端程序员的必备技能了,那作为Python程序员特别是把Dj ...

  3. ENS中文文档系列之一 [ ENS介绍 ]

    前言 ENS中文文档是由我照ENS英文官方文档翻译而来,其中的一些内容和细节得到了ENS官方团队的指导.文档中包含 “LBB译注” 的地方是译者为了便于读者理解而进行的注释. 未来一段时间,我会在该博 ...

  4. Spring Framework 5.0.0.M3中文文档 翻译记录 Part I. Spring框架概览1-2.2

    Part I. Spring框架概览 The Spring Framework is a lightweight solution and a potential one-stop-shop for ...

  5. Spring Framework 5.0.0.M3中文文档 翻译记录 Part I. Spring框架概览2.3

    2.3 Usage scenarios 使用场景 The building blocks described previously make Spring a logical choice in ma ...

  6. Spring Boot中文文档(官方文档翻译 基于1.5.2.RELEASE)

    作者:Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, ...

  7. Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle

    到目前为止,已经看了一百页.再次感慨下,如果想使用Spring,那可以看视频或者找例子,但如果想深入理解Spring,最好还是看官方文档. 原计划是把一些基本接口的功能.层次以及彼此的关系罗列一下.同 ...

  8. Chromium Embedded Framework 中文文档(简介)

    转自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html 简介 Chromium Embedded Framework ...

  9. Abp Framework中文文档上线

    感谢 ABP框架中国小组 给我们带来的ABP中文翻译,Web+为方便广大学习爱好者随时查阅,现推出了Gitbook风格的在线阅读文档:http://www.webplus.org.cn/documen ...

  10. spring boot 中文文档

    https://qbgbook.gitbooks.io/spring-boot-reference-guide-zh/content/VII.%20Spring%20Boot%20CLI/index. ...

随机推荐

  1. Java面试题精选,大型网站系统架构你不得不懂的10个问题

    作者:JavaGuide(公众号) 下面这些问题都是一线大厂的真实面试问题,不论是对你面试还是说拓宽知识面都很有帮助.之前发过一篇8 张图读懂大型网站技术架构 可以作为不太了解大型网站系统技术架构朋友 ...

  2. 腾迅云获取免费SSL证书并布置

    上次申请了SSL证书一直没时间布置,今天重新再来操作一次 首先需要申请SSL证书,腾迅云买的域名有免费一年的SSL证书申请,网址:https://console.cloud.tencent.com/s ...

  3. 吴恩达机器学习笔记49-主成分分析问题(Principal Component Analysis Problem Formulation)

    主成分分析(PCA)是最常见的降维算法. 在PCA 中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小.方 ...

  4. input在ios safari中的内阴影解决方法

    最近发现 input 在 ios的 safari浏览器里显示时,会默认有内阴影,如下图 解决方法: input { -webkit-appearance: none; } -webkit-appear ...

  5. Ubuntu18.04下配置Nginx+RTMP服务器,实现点播/直播/录制功能

    2019.3.22更新 最新的nginx-1.15.9可与openssl1.1.1兼容了 以下原文: 这个东西我眼馋挺久了,最近终于试玩了一下,感觉很好玩,在搭建的过程在也遇到一些坑,这里总结一下 安 ...

  6. springBoot(5)---单元测试,全局异常

    单元测试,全局异常 一.单元测试 1.基础版 1.引入相关依赖 <!--springboot程序测试依赖,如果是自动创建项目默认添加--> <dependency> <g ...

  7. ②萨克斯,音符的悠扬(Session管理)

    一.前言 小朽不才,最近喜欢上了萨克斯,一年计划[传送门]中的实行.就伴随着一首萨克斯,整理了下Session管理和Session四种技术. 保存状态: #网址重写(URL rewriting) #隐 ...

  8. 【Python】正则表达式纯代码极简教程

    <Python3正则表达式>文字版详细教程链接:https://www.cnblogs.com/leejack/p/9189796.html ''' 内容:Python3正则表达式 日期: ...

  9. CSRF跨站伪造请求

    一.什么是CSRF CSRF(Cross Site Request Forgery) 跨站请求伪造.也被称为One Click Attack和Session Riding,通常缩写为CSRF或XSRF ...

  10. JavaScript基础知识梳理,你能回答几道题?

    在学习JavaScript的时候,总是这里学一点,那里学一点,很的很零星,很杂,没有很系统的去学习,感觉好像JavaScript的知识点都了解了,但是真正要说起来,又不知道从何说起! 最深刻的体会就是 ...