《Spring Framework实战》7:4.1.2.容器概述

欢迎观看《Spring Framework实战》视频教程

      1. 容器概述

该接口表示 Spring IoC 容器,并负责实例化、配置和组装 bean。 容器在组件上获取其指令,以实例化、配置和 通过读取配置元数据进行汇编。可以表示配置元数据 作为带注释的组件类、具有工厂方法的配置类或外部 XML 文件或 Groovy 脚本。无论使用哪种格式,您都可以编写应用程序,并将 这些组件之间丰富的相互依赖关系。org.springframework.context.ApplicationContext

该接口的几个实现是核心 Spring 的一部分。 在独立应用程序中,通常创建AnnotationConfigApplicationContext或ClassPathXmlApplicationContext的实例。ApplicationContext

在大多数应用程序场景中,不需要显式用户代码来实例化一个或 Spring IoC 容器的更多实例。例如,在普通 Web 应用程序场景中, 应用程序文件中的简单样板 Web 描述符 XML 就足够了(参见 Web 应用程序的便捷 ApplicationContext 实例化)。 在 Spring Boot 场景中,应用程序上下文是隐式引导的 基于通用设置约定。web.xml

下图显示了 Spring 工作原理的高级视图。您的应用程序类 与配置元数据结合使用,以便在 创建并初始化后,您将拥有一个完全配置且可执行的系统或应用程序。ApplicationContext

图 1.Spring IoC 容器

        1. 配置元数据

如上图所示, Spring IoC 容器使用一种形式的 配置元数据。此配置元数据表示您作为 application developer,告诉 Spring 容器实例化、配置、 并在应用程序中组装组件。

Spring IoC 容器本身与此格式完全解耦 配置元数据实际上是写入的。如今,许多开发人员为他们的 Spring 应用程序选择基于 Java 的配置:

  1. 基于注解的配置:使用 应用程序组件类上基于 Annotation 的配置元数据。
  2. 基于 Java 的配置:定义应用程序外部的 bean 类。要使用这些功能,请参阅 @Configuration、@Bean @Import、 和 @DependsOn 注释。

Spring 配置由至少一个(通常多个)bean 定义组成 容器必须管理。Java 配置通常使用 -annotated 方法,每个方法对应一个 bean 定义。@Bean@Configuration

这些 Bean 定义对应于组成应用程序的实际对象。 通常,您可以定义服务层对象、持久性层对象(如 存储库或数据访问对象 (DAO)、表示对象(如 Web 控制器)、 基础设施对象,例如 JPA、JMS 队列等。 通常,不会在容器中配置细粒度的域对象,因为 创建和加载通常是存储库和业务逻辑的责任 domain 对象。EntityManagerFactory

        1. XML 作为外部配置 DSL

基于XML的配置元数据将这些bean配置为顶级<beans/>元素内的<bean/>元素。以下示例显示了基于XML的配置元数据的基本结构:(beans.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

https://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的类型,并使用完全限定的类名。

该属性的值可用于引用协作对象。The XML 本例中未显示 for reference to collaborative objects。有关更多信息,请参阅依赖项。id

对于实例化容器,XML 资源文件的位置路径或 paths 需要提供给一个构造函数,该构造函数允许 容器加载来自各种外部资源的配置元数据,例如 作为本地文件系统、Java 等。ClassPathXmlApplicationContextCLASSPATH

Java

ApplicationContext context = new ClassPathXmlApplicationContext(

"beans.xml", "services.xml", "daos.xml");

在了解了 Spring 的 IoC 容器之后,您可能希望了解有关 Spring 抽象的更多信息(如 参考资料 中所述) 它提供了一种方便的机制,用于从定义的位置读取 InputStream 在 URI 语法中。特别是,paths 用于构建应用程序上下文, 如应用程序上下文和资源路径中所述。ResourceResource

以下示例显示了服务层对象配置文件:(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

https://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>

以下示例显示了数据访问对象文件:(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

https://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>

在前面的示例中,服务层由类 以及两个数据类型为 和 (基于 在 JPA Object-Relational Mapping 标准上)。该元素引用 name,并且该元素引用另一个 bean 的名称 定义。和 元素之间的这种联系表达了 协作对象。有关配置对象依赖项的详细信息,请参阅依赖项。PetStoreServiceImplJpaAccountDaoJpaItemDaoproperty namerefidref

        1. 编写基于 XML 的配置元数据

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

您可以使用ClassPathXmlApplicationContext构造函数从XML片段加载bean定义。此构造函数接受多个资源位置,如前一节所示。或者,使用一个或多个<import/>元素从另一个文件或多个文件加载bean定义。以下示例显示了如何执行此操作:(beans.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 定义是从三个文件加载的:、 、 和 。所有位置路径都是 相对于执行导入的定义文件,因此必须位于 与执行导入的文件相同的目录或 Classpath 位置,而 和 必须位于 导入文件的位置。如您所见,前导斜杠将被忽略。然而,鉴于 这些路径是相对的,最好根本不使用斜杠。这 正在导入的文件的内容(包括 top level 元素)必须 根据 Spring Schema 是有效的 XML bean 定义。services.xmlmessageSource.xmlthemeSource.xmlservices.xmlmessageSource.xmlthemeSource.xmlresources<beans/>

可以使用 相对 “../“ 路径。这样做会创建对当前 应用。特别是,不建议将此引用用于 URL(对于 example, ),其中运行时解析进程选择 “nearest” classpath 根目录,然后查看其父目录。类路径 配置更改可能会导致选择不同的错误目录。classpath:classpath:../services.xml

您始终可以使用完全限定的资源位置而不是相对路径:对于 example 或 .但是,be 知道您正在将应用程序的配置耦合到特定的 absolute 地点。通常最好为这种绝对的 locations — 例如,通过针对 JVM 解析的 “${...}” 占位符 系统属性。file:C:/config/services.xmlclasspath:/config/services.xml

命名空间本身提供了 import 指令功能。进一步 除了普通 Bean 定义之外的配置功能在 SELECTION 中可用 Spring 提供的 XML 命名空间 — 例如,和 命名空间。contextutil

        1. Groovy Bean 定义 DSL

作为外部化配置元数据的另一个示例,bean 定义还可以 用 Spring 的 Groovy Bean 定义 DSL 表示,如 Grails 框架所示。 通常,此类配置位于“.groovy”文件中,其结构如 以下示例:

beans {

dataSource(BasicDataSource) {

driverClassName = "org.hsqldb.jdbcDriver"

url = "jdbc:hsqldb:mem:grailsDB"

username = "sa"

password = ""

settings = [mynew:"setting"]

}

sessionFactory(SessionFactory) {

dataSource = dataSource

}

myService(MyService) {

nestedBean = { AnotherBean bean ->

dataSource = dataSource

}

}

}

这种配置样式在很大程度上等同于 XML bean 定义,甚至 支持 Spring 的 XML 配置命名空间。它还允许导入 XML bean 定义文件。importBeans

        1. 使用容器

这是能够维护 不同 bean 及其依赖项的注册表。通过使用 method ,您可以检索 bean 的实例。ApplicationContextT getBean(String name, Class<T> requiredType)

允许您读取 bean 定义并访问它们,如下所示 示例显示:ApplicationContext

Java

// create and configure beans

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

// retrieve configured instance

PetStoreService service = context.getBean("petStore", PetStoreService.class);

// use configured instance

List<String> userList = service.getUsernameList();

使用 Groovy 配置,引导看起来非常相似。它有不同的背景 implementation 类,该类是 Groovy 感知的(但也理解 XML bean 定义)。 以下示例显示了 Groovy 配置:

Java

ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");

最灵活的变体是与阅读器结合使用 delegates — 例如,对于 XML 文件,如下所示 示例显示:GenericApplicationContextXmlBeanDefinitionReader

Java

GenericApplicationContext context = new GenericApplicationContext();new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");

context.refresh();

您还可以使用 for Groovy 文件,如下所示 示例显示:GroovyBeanDefinitionReader

Java

GenericApplicationContext context = new GenericApplicationContext();new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy");

context.refresh();

您可以在同一个 上混合和匹配此类 Reader 委托 。 从不同的配置源读取 bean 定义。ApplicationContext

然后,您可以使用 来检索 bean 的实例。该接口有一些其他方法用于检索 bean,但理想情况下,您的应用程序 代码永远不应该使用它们。事实上,你的应用程序代码应该根本不调用该方法,因此根本不依赖于 Spring API。例如 Spring 与 Web 框架的集成为各种 Web 提供了依赖注入 框架组件(例如控制器和 JSF 托管 Bean),允许您声明 通过元数据(例如自动装配 Comments)对特定 bean 的依赖。getBeanApplicationContextgetBean()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950537.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学生公寓技术规格书如何编写?

学生公寓限电柜的技术规格书主要包括以下内容‌&#xff1a; ‌用电计量计费‌&#xff1a;限电柜可以通过计算机售电管理系统进行用电计量计费&#xff0c;学生需要预交电费&#xff0c;系统会自动将数据传给控电柜和配电箱&#xff0c;对宿舍的电量进行累减计量‌。 ‌时间控…

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS NEXT】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置R…

SpringBoot 使用 Cache 集成 Redis做缓存保姆教程

1. 项目背景 Spring Cache是Spring框架提供的一个缓存抽象层&#xff0c;它简化了缓存的使用和管理。Spring Cache默认使用服务器内存&#xff0c;并无法控制缓存时长&#xff0c;查找缓存中的数据比较麻烦。 因此Spring Cache支持将缓存数据集成到各种缓存中间件中。本文已常…

MySQL事件功能简介

MySQL 的事件调度器&#xff08;Event Scheduler&#xff09;提供了一种便捷的方法来定时执行 SQL 语句&#xff0c;从而实现数据维护、报告生成等自动化操作。本文将详细介绍 MySQL 的事件功能&#xff0c;并说明如何使用 Navicat 管理这些事件。 1. 什么是 MySQL 事件调度器…

高光谱相机的特点

光谱特性 高光谱分辨率&#xff1a;能将光谱范围分割成极窄的波段&#xff0c;光谱分辨率通常达到纳米级甚至亚纳米级&#xff0c;可精确捕捉到不同物质在细微光谱差异上的特征&#xff0c;比如可以区分不同种类的植被因叶绿素含量等差异而在光谱上的细微变化。 多波段探测&a…

备考蓝桥杯:数据结构概念浅谈

目录 1数据结构的概念 什么是数据结构: 为什么要有数据结构 2.数据结构的三个组成要素 1.逻辑结构 2.存储结构 3.数据运算 3。算法好坏的度量&#xff08;时间复杂度和空间复杂度&#xff09; 时间复杂度计算 最优和平均和最差时间复杂度 计算时间复杂度例子 空间复…

闲谭SpringBoot--ShardingSphere分库分表探究

文章目录 1. 背景2. 创建数据库3. 修改yml配置文件4. 分片算法类5. 测试6 小结 1. 背景 接上文&#xff0c;我们对日志表&#xff0c;进行了按月的分表&#xff0c;这样每个月几百万条数据量还是扛得住的。 但是如果数据再多呢&#xff0c;除了提高硬件性能&#xff0c;还有一…

基于伪分布式模式部署Hadoop集群

1.上传Hadoop安装包 在/export/software目录下使用rz命令上传Hadoop安装包 2.创建目录 在/export/servers目录下创建wfb-hadoop目录&#xff0c;用于存放Hadoop的安装目录&#xff0c;命令如下&#xff1a; mkdir -p /export/servers/wfb-hadoop 3.安装Hadoop 1)将Hadoop安…

Android车载音频系统目录

目录 第一章 1.1 Android Automotive&#xff08;一&#xff09; 1.2 Android Automotive&#xff08;二&#xff09; 1.3 Android Automotive&#xff08;三&#xff09; 第二章 2.1 Android车载音频系统概览 2.2 车载音频焦点 2.3 车载音频配置 2.4 Audio control HAL…

怎么管理电脑usb接口,分享四种USB端口管理方法

怎么管理电脑usb接口&#xff0c;分享四种USB端口管理方法 USB接口作为电脑重要的外部接口&#xff0c;方便了数据传输和设备连接。 然而&#xff0c;不加管理的USB接口也可能带来安全隐患&#xff0c;例如数据泄露、病毒传播等。 因此&#xff0c;有效管理电脑USB接口至关重…

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹&#xff0c;只保留部分有用的文件 3.项目配置&#xff1a; 配置项目的icon 配置项目的标题 配置项目的别名等&#xff08;craco.config.ts&…

conda+jupyter+pycharm:如何在Windows conda环境下运行jupyter并使用浏览器或者pycharm运行.ipynb

1 安装conda 2 conda环境下安装jupyter pip install jupyter3 设置jupyter配置文件 1&#xff09;创建 jupyter_notebook_config.py文件 jupyter notebook --generate-config 2&#xff09;设置密码 3&#xff09;设置参数 直接将以下参数修改为自己的配置后复制到配置文件…

微信小程序获取图片使用session(上篇)

概述&#xff1a; 我们开发微信小程序&#xff0c;从后台获取图片现实的时候&#xff0c;通常采用http get的方式&#xff0c;例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…

【江协STM32】9-1/2/3 USART串口协议、USART外设、串口发送串口发送+接收

1. 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发全双工&#xff1a;指通信双方能够同时进行双向通信。发送线路和接收线路互不影响&#xff0c…

第一 二章 小车硬件介绍-(全网最详细)基于STM32智能小车-蓝牙遥控、避障、循迹、跟随、PID速度控制、视觉循迹、openmv与STM32通信、openmv图像处理、smt32f103c8t6

第一篇-STM32智能小车硬件介绍 后续章节也放这里 持续更新中&#xff0c;视频发布在小B站 里面。这边也会更新。 B站视频合集: STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 小B站链接:https://www.bilib…

【网络】电路交换(Circuit Switching)、报文交换(Message Switching)和分组交换(Packet Switching)

电路交换&#xff08;Circuit Switching&#xff09;&#xff1a;一条专用的通信线路&#xff08;或电路&#xff09;&#xff08; 电话专用线路&#xff0c;好处&#xff1a;专用稳定&#xff0c;有没有数据都被占用&#xff0c;坏处&#xff1a;容易浪费&#xff09; 报文交换…

Pixel 6a手机提示无法连接移动网络,打电话失败!

1、开启VoLTE 2、如果没有&#xff0c;下载shizuku和PixelIMS应用。 shizuke Releases RikkaApps/Shizuku GitHub PixellMS Release v1.2.8 kyujin-cho/pixel-volte-patch GitHub 3、安装shizuke启动&#xff0c;开通root可以直接点击下面的启动&#xff0c;如果没有就…

游戏关卡设计的常用模式

游戏关卡分为很多种&#xff0c;但常用的有固定套路&#xff0c;分为若干种类型。 关卡是主角与怪物、敌方战斗的场所&#xff0c;包括装饰物、通道。 单人游戏的关卡较小&#xff0c;偏线性&#xff1b; 联机/MMO的关卡较大&#xff0c;通道多&#xff0c;自由度高&#xf…

DC/AC并网逆变器模型与仿真MATLAB

DC/AC并网逆变器是一种将直流电&#xff08;DC&#xff09;转化为交流电&#xff08;AC&#xff09;&#xff0c;并将其与电网并联的设备。它的核心功能是实现直流电源&#xff08;如光伏电池板或储能电池&#xff09;与电网的有效连接&#xff0c;同时保证输出电能质量满足电网…

作业:IO:day2

题目一 第一步&#xff1a;创建一个 struct Student 类型的数组 arr[3],初始化该数组中3个学生的属性 第二步&#xff1a;编写一个叫做save的函数&#xff0c;功能为 将数组arr中的3个学生的所有信息&#xff0c;保存到文件中去&#xff0c;使用fread实现fwrite 第三步&#xf…