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

配置文件是一个命名的、逻辑的 bean 定义组,仅当给定的配置文件处于活动状态时才向容器注册。可以将 Bean 分配给配置文件,无论是在 XML 中定义还是使用注释定义。与配置文件相关的对象的作用Environment是确定哪些配置文件(如果有)当前处于活动状态,以及哪些配置文件(如果有)默认情况下应该是活动的。

属性在几乎所有应用程序中都发挥着重要作用,并且可能源自多种来源:属性文件、JVM 系统属性、系统环境变量、JNDI、servlet 上下文参数、ad-hocProperties对象、Map对象等。与属性相关的对象的作用Environment是为用户提供一个方便的服务接口,用于配置属性源并从中解析属性。

Bean 定义配置文件

Bean 定义配置文件在核心容器中提供了一种机制,允许在不同环境中注册不同的 bean。“环境”这个词对不同的用户可能意味着不同的东西,这个功能可以帮助许多用例,包括:

  • 在开发中处理内存中的数据源,而不是在 QA 或生产中从 JNDI 中查找相同的数据源。
  • 仅在将应用程序部署到性能环境时才注册监控基础架构。
  • 为客户 A 和客户 B 部署注册定制的 bean 实现。

考虑实际应用程序中需要 DataSource,在测试环境如下

@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("my-schema.sql")
.addScript("my-test-data.sql")
.build();
}

生产环境的配置是另外一种。问题是如何根据当前环境进行切换。

使用 @Profile

@Profile 一个或多个指定的配置文件处于活动状态时,注释可让您指示组件有资格注册。使用我们前面的示例,我们可以重写dataSource配置如下:

@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();
}
}

配置文件字符串可能包含一个简单的配置文件名称(例如,production)或配置文件表达式。配置文件表达式允许表达更复杂的配置文件逻辑(例如,production & us-east)。配置文件表达式中支持以下运算符:

  • !:配置文件的逻辑“非”
  • &:配置文件的逻辑“与”
  • |:配置文件的逻辑“或”

@Profile 也可以在方法级别声明为仅包含配置类的一个特定 bean

@Configuration
public class AppConfig { @Bean("dataSource")
@Profile("development")
public DataSource standaloneDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
} @Bean("dataSource")
@Profile("production")
public DataSource jndiDataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}
}
XML Bean 定义配置文件

XML 对应物是元素的profile属性。

<beans profile="development"
激活配置文件

现在我们已经更新了配置,我们仍然需要指示 Spring 哪个配置文件处于活动状态。

激活配置文件可以通过多种方式完成,但最直接的方式是以编程方式针对Environment通过 ApplicationContext.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("development");
ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class);
ctx.refresh();

此外,您还可以通过 spring.profiles.active属性以声明方式激活配置文件

  -Dspring.profiles.active="profile1,profile2"
默认配置文件

默认配置文件表示默认启用的配置文件。

@Configuration
@Profile("default")
public class DefaultDataConfig { }

如果没有激活的配置文件,dataSource则创建。您可以将此视为一种为一个或多个 bean 提供默认定义的方法。如果启用了任何配置文件,则默认配置文件不适用。

PropertySource

Spring 的Environment抽象提供了对属性源的可配置层次结构的搜索操作。

ConfigurableApplicationContext ctx = new GenericApplicationContext();
MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
sources.addFirst(new MyPropertySource());

执行的搜索是分层的。默认情况下,系统属性优先于环境变量。

完整的层次结构如下,最高优先级的条目位于顶部:

  1. ServletConfig 参数(如果适用——例如,在DispatcherServlet上下文的情况下)
  2. ServletContext 参数(web.xml 上下文参数条目)
  3. JNDI 环境变量(java:comp/env/条目)
  4. JVM 系统属性(-D命令行参数)
  5. JVM系统环境(操作系统环境变量)

使用@PropertySource

@PropertySource 注解提供了一种方便且声明性的机制,用于将 文件添加到PropertySource Spring 的Environment.

以下@Configuration@PropertySource以调用testBean.getName()返回的方式使用myTestBean

@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig { @Autowired
Environment env; @Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}

1

Spring系列之基于环境抽象-10的更多相关文章

  1. Spring系列15:Environment抽象

    本文内容 Environment抽象的2个重要概念 @Profile 的使用 @PropertySource 的使用 Environment抽象的2个重要概念 Environment 接口表示当前应用 ...

  2. 基于Maven的Spring + Spring MVC + Mybatis的环境搭建

    基于Maven的Spring + Spring MVC + Mybatis的环境搭建项目开发,先将环境先搭建起来.上次做了一个Spring + Spring MVC + Mybatis + Log4J ...

  3. Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  4. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.10.配置用户NTF服务

    2.10.配置用户NTF服务 2.10.1.配置节点RAC1 1) [root@linuxrac1 sysconfig]#sed -i 's/OPTIONS/#OPTIONS/g' /etc/sysc ...

  5. Spring系列之JDBC对不同数据库异常如何抽象的?

    前言 使用Spring-Jdbc的情况下,在有些场景中,我们需要根据数据库报的异常类型的不同,来编写我们的业务代码.比如说,我们有这样一段逻辑,如果我们新插入的记录,存在唯一约束冲突,就会返回给客户端 ...

  6. Keil MDK STM32系列(六) 基于抽象外设库HAL的ADC模数转换

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  7. Spring系列(零) Spring Framework 文档中文翻译

    Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...

  8. Spring 系列: Spring 框架简介 -7个部分

    Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...

  9. Spring 系列: Spring 框架简介(转载)

    Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...

  10. Spring系列

    Spring系列之访问数据库   阅读目录 一.概述 二.JDBC API的最佳实践 三.Spring对ORM的集成 回到顶部 一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结 ...

随机推荐

  1. MyBatis_04(MyBatis获取“参数值”的两种方式)

    MyBatis获取"参数值"的两种方式 (重点!!!) MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接 , #{}的本质就是占位符赋值 ${}使用字 ...

  2. esp8266 -rtos-sdk-vscode-config

    kiteconfig 工作区配置文件:hello_world.code-workspace {      "folders": [         {             &q ...

  3. OKHttp 之--------http/https协议处理方法 (Finn_ZengYuan博客)

    如果遇到okttp需要使用https协议,那么就需要在支持ssl,不说了,撸码搞起: 加入下面代码即可搞定:主要就是设置 builder.sslSocketFactory(sslParams.sSLS ...

  4. win10关闭自动更新的方法

    win10关闭自动更新的方法和步骤: 一.禁用Windows Update服务 1.打开服务项,win+r 输入 services.msc ,或者控制面板-管理工具-服务. 2.找到 Windows ...

  5. csp2020——T3表达式

    后缀表达式基本可以使用栈来表达,所以30分的暴力做法很好做 正解的做法是: 暴力的做法是每次重新建立栈,用符号来把栈顶的元素弹出来,做完运算之后再放入栈中,如果是与运算,弹出两个元素,如果是或运算,弹 ...

  6. AndroidStudio中的读取本地Gradle设置,gradle-wrapper.properties内容解释

    gradle-wrapper.properties文件长成下面这个样子 distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsd ...

  7. uniapp安卓本地文件读取(html5+)

    plus.io.resolveLocalFileSystemURL(                    "_www/static/caise.json",//static下路径 ...

  8. tvm中使用了xgboost库中的_fmt_metric

    _fmt_metric这个xgboost的回调函数已经被遗弃了. 为了能跑起来tvm,可以pip install xgboost==1.5.0

  9. clickhouse杂记

    1,clickhouse show tables SHOW [TEMPORARY] TABLES [FROM ] [LIKE ''] [LIMIT ] [INTO OUTFILE ] [FORMAT ...

  10. wpf treeview 选中节点加载数据并绑定

    <TreeView Grid.Row="0" Grid.Column="0" x:Name="FolderView" Canvas.T ...