一起学SF框架系列6.2-模块core-Environment

news2024/11/25 14:45:12

  Environment是集成在容器中的抽象接口,它对应用程序环境的两个关键方面进行建模:配置文件(profiles)和属性(properties)。

配置文件(profiles)

  配置文件为核心容器中提供了一种机制,允许在不同的环境中注册不同的bean。这个“环境”对不同的用户可能意味着不同的东西,这个特性可以帮助处理很多用例,包括:
1、开发环境、测试环境和生产环境使用的数据源是不同的,通过配置文件管理对应数据源配置。
2、只有在将应用程序部署到性能环境时才注册监控基础设施。
3、为A客户和B客户的部署注册自定义的bean实现。
Environment 的作用是确定当前处于活动状态配置文件,以及默认情况下应该处于活动状态配置文件。
以开发环境和测试环境加载数据源为例,两个数据源实现:

//数据源1-内存数据库
@Bean
public DataSource dataSource() {
	return new EmbeddedDatabaseBuilder()
		.setType(EmbeddedDatabaseType.HSQL)
		.addScript("my-schema.sql")
		.addScript("my-test-data.sql")
		.build();
}
//数据源1-jdbc访问数据库
@Bean(destroyMethod = "")
public DataSource dataSource() throws Exception {
	Context ctx = new InitialContext();
	return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}

  如何根据当前环境在这两种数据源之间进行切换。Spring用户设计了一些方法来完成这项工作,通常依赖于系统环境变量(如启动参数 -Dspring.profiles.active=development)和XML配置的组合。配置文件是提供此问题解决方案的核心容器功能。

@Profile注解模式

@Configuration
@Profile("development")
public class StandaloneDataConfig {
	@Bean
	public DataSource dataSource() {
		return new EmbeddedDatabaseBuilder()
			.setType(EmbeddedDatabaseType.HSQL)
			.addScript("classpath:com/bank/config/sql/schema.sql")
			.addScript("classpath:com/bank/config/sql/test-data.sql")
			.build();
	}
}
@Configuration
@Profile("production")
public class JndiDataConfig {
	@Bean(destroyMethod = "")
	public DataSource dataSource() throws Exception {
		Context ctx = new InitialContext();
		return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
	}
}

xml配置

用两个bean配置文件(适合配置bean多):

//development模式文件
<beans profile="development"
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="...">

	<jdbc:embedded-database id="dataSource">
		<jdbc:script location="classpath:com/bank/config/sql/schema.sql"/>
		<jdbc:script location="classpath:com/bank/config/sql/test-data.sql"/>
	</jdbc:embedded-database>
</beans>

//production模式文件
<beans profile="production"
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="...">

	<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/>
</beans>

用一个配置文件(适合配置bean少):

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xsi:schemaLocation="...">

	<!-- other bean definitions -->

	<beans profile="development">
		<jdbc:embedded-database id="dataSource">
			<jdbc:script location="classpath:com/bank/config/sql/schema.sql"/>
			<jdbc:script location="classpath:com/bank/config/sql/test-data.sql"/>
		</jdbc:embedded-database>
	</beans>

	<beans profile="production">
		<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/datasource"/>
	</beans>
</beans>

激活配置文件

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
//用Environment激活配置文件,"development"可通过命令行参数传递进来
ctx.getEnvironment().setActiveProfiles("development"); 
ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class);
ctx.refresh();

属性(properties)

  属性就是应用常用到的可配置参数,并且可能来自各种来源:属性文件、JVM系统属性(如*.properties、*.yml)、系统环境变量、JNDI、servlet上下文参数、特定属性对象、映射等等。Environment 的作用就是为用户提供方便的服务接口,用于从属性源中解析出相关属性。
  spring框架和应用访问属性都是通过Environment提供的PropertySource对象中进行搜索。PropertySource是对任意键值对来源的简单抽象,而Spring的StandardEnvironment被配置了两个PropertySource对象——一个表示JVM系统属性集(System.getProperties()),另一个表示系统环境变量集(System.getenv())。
  spring实现访问属性的设计比较复杂,类关系图大致如下:
在这里插入图片描述
从类关系图看出,基本是通过ProperyResolver(将属性资源解析成PropertySource供访问,注:属性文件的加载是在ResourceLoader中完成的)完成。这么设计的目的,需要阅读相关代码去体会。
属性文件默认支持:properties格式和yaml格式,如果是其它格式文件,需提供相应的解析器。

加载

自动加载

自动加载系统环境变量。
如果配置文件参数和系统环境变量参数重名,系统环境的优先级更高。

xml加载

单个加载

//方式1
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    	property name="location" value="classpath:app.properties"/>
	</bean>
//方式2
	<context:property-placeholder location="classpath:app.properties"/>

多个文件加载:

方式1:
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   	    <property name="locations">
	        <list>
	            <value>classpath*:app.properties</value>
	            <value>classpath*:app1.properties</value>
	        </list>
    </property>
	</bean>
方式2:
	<context:property-placeholder location="app.properties,app1.properties"/>

注多个文件加载,有同名参数,后加载的覆盖前加载的。

如果是yaml格式文件,按如下配置:

	<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
	    <property name="resources" value="classpath:app.yml"/>
	</bean>
	<context:property-placeholder properties-ref="yamlProperties"/>

注解加载

@PropertySource(value={"classpath:app.properties","classpath:app1.properties"})

使用

@Value

这是应用使用配置参数最常用最简单的方法。

@Value("${JAVA_HOME}")

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

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

相关文章

Redis7---单线程和多线程(一)

目录 一、几个面试题 1.Redis的单线程部分 1.2 Redis所谓的“单线程” 1.3 Redis演进变化 1.3.1 Redis 3.x 单线程时代性能很快的原因 1.3.2 Redis 4.0 之前一直采用单线程的主要原因有三个 2. Redis单线程为什么加了多线程特性 3.Redis 6/7的多线程特性和IO多路复用入…

【系统架构】第二章-计算机系统基础知识(一)

计算机硬件 1、处理器&#xff1a;CISC&#xff08;复杂指令集&#xff09;、RISC&#xff08;精简指令集&#xff09; 2、存储器&#xff1a;按照与处理器的物理距离&#xff1a;片上缓存、片外缓存、主存、外存 3、总线&#xff1a;按照总线在计算机中的位置划分&#xff1a…

大厂流出2023年最新软件测试面试题【全】

1.B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c;因…

格雷码转换电路

目录 格雷码转换电路 1、简介 1.2、格雷码转化为二进制码原理如下&#xff1a; 1.3、二进制码转化为格雷码原理如下&#xff1a; 2、实验任务 3、程序设计 3.1、格雷码转换二进制 3.2、二进制转换格雷码 4、仿真测试 5、仿真验证 格雷码转换电路 格雷码&#xff0c;…

推荐一款能够节省办公空间的显示器!

作为一名高校科研人员&#xff0c;课题组师生日常科研工作必备电子设备的维护及更新对于科研进度有着极大影响作用。近日购买了最新一代的戴尔显示器E2424HS。 以下是我的一些真实使用体验&#xff1a; 01 外观高端大气 拆箱前&#xff0c;在检查外包装没有任何破损后&#…

城市道路工程设计技术措施

为在城市道路工程建设中正确执行国家和行业有关法律、标准、规范和规程&#xff0c;提高工程建设质量&#xff0c;特制定《城市道路工程设计技术规程》&#xff08;2011年版&#xff09;专门编的。  本办法主要依据国家和行业有关法规、标准、规范和规程等&#xff0c;参照地…

Spring 是什么框架?

对于一门技术&#xff0c;我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那在说Spring这三点之前&#xff0c;我们先看Spring之前要学什么。 Java基础、Java语法进阶、MySQL基础操作、MySQL数据库设计和多表操作、JDBC、Maven基础、MyBatis、HMLCSS、JavaScrip…

字节跳动做了3年软件测试,五月无情被辞,想给划水的兄弟提个醒

前言 先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;20 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成…

全网最全,Web测试点详细整理(测试场景举例+常见问题分析)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Web测试检查表 功…

go环境安装配置(windows)

下载go 安装包 官网&#xff1a; https://go.dev/dl/ go语言中文网&#xff1a; https://studygolang.com/dl 下载压缩包&#xff0c;解压 环境变量配置 GOROOT 配置你解压的目录 在Path中追加一条 %GOROOT%\bin 这里go对比JAVA还多了一个配置&#xff1a; GOPATH 配置go以…

原生微信小程序基础-分包加载自定义组件项目全流程

小程序基础-分包加载&&自定义组件 小程序分包加载 小程序分包加载-为什么要分包加载 微信平台对小程序单个包的代码体积限制为 2M&#xff0c;超过 2M 的情况下可以采用分包来解决即使小程序代码体积没有超过 2M 时也可以拆分成多个包来实现按需加载配置文件能忽略的…

远程控制电脑软件全方位测评,远程控制工具哪家强

*本文内容以及测试数据来自“B站” 作者&#xff1a;小李student 先问大家一个问题&#xff0c;你心目中最好的远控软件是哪个? 今天我要测评几个有意思的远控软件&#xff0c;他们分别是todesk 、向日葵、RayLink、parsec、其实我还测试了微软自带的远程控制&#xff0c;但…

用 Optaplanner 实现云资源优化:建模详解

引言 装箱问题是一个经典的计算机科学优化问题,它的目标是将一堆物品尽可能地放入一些容器中,以最小化容器数量或最大化容器利用率。在实际应用中,我们可以在物流、资源调度、计算机集群等领域看到装箱问题的应用。 问题描述 在云计算领域,装箱问题同样非常重要。比如,…

Java中关于字符串常量池的详解!!!

字符串常量池 前言1. 直接赋值法&#xff0c;默认从常量池中取对象2. new一个对象3. 字符串常量池、字符串对象、内部的value引用、具体的字符数组之间的关系4. 手动入池方法&#xff1a;intern方法 前言 Java使用 “ ” 称为字符串常量&#xff0c;为了提高程序的运行速度&am…

2023最新软件测试面试题【1000道题含答案】

1、自动化代码中,用到了哪些设计模式? 单例设计模式 工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果&#xff0c;如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化测…

非法收集儿童数据,微软与 2000w 美元和解

文章目录 &#x1f928; 非法收集儿童数据&#xff0c;微软与 2000w 美元和解&#x1f4c8; 苹果股价和 Vision Pro 一样高涨&#x1f46e;‍♀️ 美国证监会狙击币安和其老板赵长鹏3️⃣ 红杉资本一拆为三&#x1f62e; 加息出乎意料&#xff01;澳洲央行对抗通胀&#x1f91c…

硬核拆解 | 拓尔微65W 2C1A氮化镓多口快充

随着身边智能设备的增多&#xff0c;一个充电头对应一个设备&#xff0c;出门需要携带多个充电器已经成为日常&#xff0c;有时还会忘带匹配的充电头&#xff0c;无法充电造成困扰...... 多口快充的出现解决了这一难题&#xff0c;出门仅需携带一个充电头&#xff0c;减轻背包…

AI智慧安监平台EasyCVR新版本v3.3如何接入V1版智能分析网关硬件?

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流…

VFP发送公众号模板消息

公众号模板消息向用户发送重要的服务通知&#xff0c;比如验证码&#xff0c;消费通知&#xff0c;比如时间提醒什么的。 调用代码很简单 *--发送模板消息TEXT TO msgJson NOSHOW TEXTMERGE {"touser":"oljsK6OgHA9ftJxuCUWg7cFylj6Y","template_id&…

Godot 4 源码分析 - Project Manager

简单来说&#xff0c;Godot 4一共有三种运行模式&#xff1a;工程管理、编辑、运行 有点意思的是&#xff0c;每次调试&#xff0c;只能在其中一种模式下运行 如果同时配置了编辑器与工程管理器&#xff0c;则会报错&#xff1a; if (editor && project_manager) {O…