(十)Spring教程——Spring配置概述

目录

前言

1.Spring容器高层视图

2.基于XML的配置


前言

        在使用Spring所提供的各项丰富而神奇的功能之前,必须在Spring IoC容器中装配好Bean,并建立好Bean和Bean之间的关联关系。Spring的配置文件已经很精简了,但是广大的开发者希望它做得更好。Spring对这个进行了许多重大的改进,很多原来冗长的配置拥有了简洁的版本。此外,Spring还提供了多种配置方式,既可以选择一种配置,也可以同时使用多种配置。

1.Spring容器高层视图

        要使应用程序中的Spring容器成功启动,需要同时具备以下三方面的条件:

        Spring框架的类包都已经放到应用程序的类路径下。

        应用程序为Spring提供了完备的Bean配置信息。

        Bean的类都已经放到应用程序的类路径下。

        Spring启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。

        Bean配置信息时Bean的元数据信息,它由以下4个方面组成:

        Bean的实现类。

        Bean的属性信息,如数据源的连接数、用户名、密码等。

        Bean的依赖关系,Spring根据依赖关系配置完成Bean之间的装配。

        Bean的行为配置,如生命周期范围及生命周期各过程的回调函数等。

        Bean元数据信息在Spring容器中的内部对应物是由一个个BeanDefinition形成的Bean注册表,Spring实现了Bean元数据信息内部表示和外部定义的解耦。

        Spring支持多种形式的Bean配置方式。Spring 1.0仅支持基于XML的配置,Spring 2.0新增基于注解配置的支持,Spring 3.0新增基于Java类配置的支持,而Spring 4.0则新增基于Groovy动态语言配置的支持。

          Bean配置信息首先定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表;然后根据注册表加载、实例化Bean,并建立Bean和Bean之间的依赖关系;最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用。

2.基于XML的配置

        对于基于XML的配置,Spring 2.0以后采用Schema格式,这样让不同类型的配置拥有了自己的命名空间,使得配置文件更具扩展性。此外,Spring基于Schema配置方案为许多领域的问题提供了简化的配置方法,配置工作因此得到了大幅简化。

        采用基于Schema的配置格式,文件头的声明会复杂一些。看一个简单的示例,配置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"

 xmlns:aop="http://www.springframework.org/schema/aop"

 xsi:schemaLocation=

"http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/aop

" >http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

<!--默认命名空间的配置-->

<bean id="foo" class="com.smart.Foo" />

<!--aop命名空间的配置-->

<aop:config>

         <aop:advisor pointcut-ref="execution(**..PetStoreFacade.*(..))" advice-ref="txAdvice" />

</aop:config>

</beans>

        其中xmlns="http://www.springframework.org/schema/beans"是默认的命名空间;

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 是xsi标准命名空间,用于指定自定义命名空间的Schema文件;

        xmlns:aop="http://www.springframework.org/schema/aop"是自定义命名空间,aop是该命名空间的简称,其值"http://www.springframework.org/schema/aop"是命名空间全称,必须在xsi命名空间为其指定空间对应的Schema文件;

 xsi:schemaLocation=

"http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-4.0.xsd",是为每个命名空间指定具体的Schema文件;

        要了解文件头所声明的内容,需要学习一些XML Schema的知识。Schema在文档根节点中通过xmlns对文档所引用的命名空间就行声明。在上面的配置文件中定义了3个命名空间。

①默认命名空间:它没有空间名,用于Spring Bean的定义。

②xsi标准命名空间:这个命名空间用于为每个文档中的命名空间指定相应的Schema样式文件,是W3C定义的标准命名空间。

③aop命名空间:这个命名空间是Spring配置AOP的命名空间,即一种自定义的命名空间。

        命名空间的定义分为两个步骤:第一步是指定命名空间的名称;第二步指定命名空间的Schema文档格式文件的位置,用空格或回车换行进行分隔。

        在第一步中,需要指定命名空间的缩略名和全名,请看下面配置所定义的命名空间:

 xmlns:aop="http://www.springframework.org/schema/aop"

        aop为命名空间的别名,一般使用简洁易记的名称,文档后面的元素可通过命名空间别名加以区分,如<aop:config/>等。而http://www.springframework.org/schema/aop为空间的全限定名,习惯上用文档发布机构的官方网站和相关网站目录作为全限定名。这种命名方式既可以标识文档所属的机构,又可以很好地避免重名的问题。但从XML Schema语法来说,别名和全限定名都可以任意命名。

        如果命名空间的别名为空,则标识该命名空间为文档默认命名空间。文档中无命名空间前缀的元素都属于默认命名空间,如<beans/>、<bean/>等都属于默认命名空间。

在第二步中,为每个命名空间指定了对应的Schema文档格式的定义文件,定义的语法如下:

<命名空间1> <命名空间1Schema文件> <命名空间2> <命名空间2Schema文件>

        命名空间使用全限定名,每个组织机构在发布Schema文件后,都会为该Schema文件提供一个引用的URL地址,一般使用这个URL地址指定命名空间对应的Schema文件。命名空间名称和对应的Schema文件之间使用空格或回车分隔,不同的命名空间之间也使用这种分隔方法。

        指定命名空间的Schema文件地址有两个用途:其一,XML解析器可以获取Schema文件并对文档进行格式合法性验证;其二,在开发环境下,IDE可以引用Schema文件对文档编辑提供诱导功能(自动补全功能)。当然,这个Schema文件的远程地址并非一定能够访问,一般的IDE都提供了从本地类路径查找Schema文件的功能,只有找不到时才从远程加载。

        Spring4.0配置的Schema文件放置在各模块JAR文件内一个名为config的目录下。

        虽然Spring为AOP、声明事务、Java EE都提供了专门的Schema XML配置,但Spring也允许继续使用低版本的基于DTD的XML配置方式。Spring4.0配置的升级是向后兼容的,但强烈建议使用新的基于Schema的配置方式。

        除了支持XML配置方式外,Spring还支持基于注解、Java类及Groovy的配置方式,不同的配置方式在本质上是基本相同的,只是存在形式的区别。由于基于XML的配置方式是最基础、最传统的,所以后面主要以基于XML的配置方式讲解Spring的配置,其他3种配置方式则作简要介绍。

  

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AV1技术学习:Transform Coding

对预测残差进行变换编码&#xff0c;去除潜在的空间相关性。VP9 采用统一的变换块大小设计&#xff0c;编码块中的所有的块共享相同的变换大小。VP9 支持 4 4、8 8、16 16、32 32 四种正方形变换大小。根据预测模式选择由一维离散余弦变换 (DCT) 和非对称离散正弦变换 (ADS…

免费分享一套微信小程序图书馆座位预约管理系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序图书馆座位预约管理系统(SpringBoot后端Vue管理端)&#xff0c;分享下哈。 项目介绍 随着移动互联网技术的飞速发展和智能设备的普及&#xff0c;图书馆服务模式正在经历深刻的变革。本论文旨在…

从PyTorch官方的一篇教程说开去(3.3 - 贪心法)

您的进步和反馈是我最大的动力&#xff0c;小伙伴来个三连呗&#xff01;共勉。 贪心法&#xff0c;可能是大家在处理陌生问题时候&#xff0c;最容易想到的办法了吧&#xff1f; 还记得小时候&#xff0c;国足请了位洋教练发表了一句到现在还被当成段子的话&#xff1a;“如…

第2章-数学建模

目录 一、数据类型 【函数】&#xff1a; &#xff08;1&#xff09;find()、rfind()、index()、rindex()、count() &#xff08;2&#xff09;split()、rsplit() &#xff08;3&#xff09;join() &#xff08;4&#xff09;strip()、rstrip()、lstrip() &#xff08;5&…

【Python】sqlite加密库pysqlcipher3编译安装步骤

目录 说明准备工作openssl编译sqlite tclsetup.py修改quote_argumentopenssl路径 安装加密示例代码测试附录参考 说明 pysqlcipher3是针对Python 3使用的pysqlcipher的一个分支&#xff0c; 尽管仍然维护对Python 2的支持。它仍然处于测试阶段&#xff0c; 尽管这个库包含的最…

请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理

BeanPostProcessor的postProcessBeforeInitialization方法是在bean的依赖注入&#xff08;即属性填充&#xff09;完成后&#xff0c;但在bean的初始化回调&#xff08;如PostConstruct注解的方法或InitializingBean接口的afterPropertiesSet方法&#xff09;之前被调用的。 具…

vue3角色路由封装

在市面上很多网站都是左侧菜单栏&#xff0b;左侧内容页的样式&#xff0c;同时具有很多个角色&#xff0c;只是左边菜单栏显示的内容不一致罢了&#xff0c;有些人会单独写俩个页面来显示不同的角色&#xff0c;但是这样页面复用性不高&#xff0c;这个时候我们就需要动态路由…

easyexcel的读写操作

easyexcel是基于java的读写excel的开源项目 --读写也可理解为上传和下载 写操作 一、引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version> </dependency> 二、封…

力扣 19删除链表倒数第N个结点

思路 双指针法&#xff0c;快指针用于与慢指针拉开距离&#xff0c;慢指针用于删除元素&#xff0c;越过慢指针后面的元素。 具体删除时&#xff0c;应该注意如果倒数第N个结点是头结点的话&#xff0c;slow指向的就是头结点&#xff0c;没有吧办法用 slow->next slow-&…

sql_exporter通过sql收集业务数据并通过prometheus+grafana展示

下载并解压安装sql_exporter wget https://github.com/free/sql_exporter/releases/download/0.5/sql_exporter-0.5.linux-amd64.tar.gz #解压 tar xvf sql_exporter-0.5.linux-amd64.tar.gz -C /usr/local/修改主配置文件 cd /usr/local/ mv sql_exporter-0.5.linux-amd64 s…

Electron 的open-file事件

在 Electron 中,open-file 事件是一个重要的事件,它允许开发者在应用程序已经运行的情况下,通过文件打开请求(如双击文件或在命令行中使用 open 命令打开文件)来捕获文件路径。以下是对 open-file 事件的详细解析: 触发条件 应用已经打开。用户通过双击与应用程序关联的…

google 浏览器插件开发简单学习案例:TodoList

参考&#xff1a; google插件支持&#xff1a; https://blog.csdn.net/weixin_42357472/article/details/140412993 这里是把前面做的TodoList做成google插件&#xff0c;具体网页可以参考下面链接 TodoList网页&#xff1a; https://blog.csdn.net/weixin_42357472/article/de…

SwiftSage:参考人脑双系统,结合快思和慢想的智能体,解决复杂任务同时降低成本

SwiftSage&#xff1a;参考人脑双系统&#xff0c;结合快思和慢想的智能体&#xff0c;解决复杂任务同时降低成本 提出背景解法拆解子解法1&#xff1a;SWIFT模块子解法2&#xff1a;SAGE模块模块整合和决策树 SwiftSage 工作流程效果 论文&#xff1a;SWIFTSAGE: A Generative…

5G赋能新能源,工业5G路由器实现充电桩远程高效管理

随着5G技术的广泛应用&#xff0c;新能源充电桩的5G应用正逐步构建起全新的生态系统。在数字化转型的浪潮中&#xff0c;新能源充电桩行业正迎来数字化改革。工业5G路由器的引入&#xff0c;为充电桩的远程管理提供了强有力的技术支持&#xff0c;新能源充电桩5G路由器网络部署…

共享充电桩语音ic方案,展现它的“说话”的能力

随着电动汽车的普及&#xff0c;充电设施的便捷性、智能化需求日益凸显&#xff0c;共享充电桩语音IC应运而生&#xff0c;成为连接人与机器、实现智能交互的桥梁。本文将为大家介绍共享充电桩语音ic的概述、应用词条以及优势&#xff0c;希望能够帮助您。 一、NV170D语音ic概述…

选购指南:如何挑选最适合的快手矩阵系统

在短视频风潮席卷的今天&#xff0c;快手作为其中的佼佼者&#xff0c;吸引了无数创作者和商家的目光。然而&#xff0c;想要在快手上脱颖而出&#xff0c;仅凭内容和创意是远远不够的。一个强大且适合的快手矩阵系统&#xff0c;将是你通往成功的重要钥匙。那么&#xff0c;如…

SEO域名外链生成工具PHP源码

两款不同版本的SEO超级外链工具PHP源码&#xff0c;网址外链-seo外链推广工具源码&#xff0c;SEO网站推广外链工具源码SEO域名外链生成工具PHP源码 _ 博客趣两款不同版本的SEO超级外链工具PHP源码&#xff0c;网址外链-seo外链推广工具源码&#xff0c;SEO网站推广外链工具源码…

Web前端:HTML篇(一)

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点&#xff0c;HTML 运行在浏览器上&#xff0c;由浏览器…

批量打断相交线——ArcGISpro 解决方法

在数据处理&#xff0c;特别是地理空间数据处理或是任何涉及图形和线条分析的场景中&#xff0c;有时候需要把相交的线全部从交点打断一个常见的需求。这个过程对于后续的分析、编辑、或是可视化展现都至关重要&#xff0c;因为它可以确保每条线都是独立的&#xff0c;避免了因…

.NET下支持多框架的托盘功能NotifyIconEx(WPF / WinForms / Avalonia / WinUI / MAUI / Wice)

支持 WPF / WinForms / Avalonia / WinUI / MAUI / Wice 应用。 先看效果&#xff1a; using NotifyIconEx;var notifyIcon new NotifyIcon() {Text "NotifyIcon",Icon Icon.ExtractAssociatedIcon(Process.GetCurrentProcess().MainModule?.FileName!)! }; not…