Spring系列之基于环境抽象-10
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());
执行的搜索是分层的。默认情况下,系统属性优先于环境变量。
完整的层次结构如下,最高优先级的条目位于顶部:
- ServletConfig 参数(如果适用——例如,在
DispatcherServlet
上下文的情况下) - ServletContext 参数(web.xml 上下文参数条目)
- JNDI 环境变量(
java:comp/env/
条目) - JVM 系统属性(
-D
命令行参数) - 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的更多相关文章
- Spring系列15:Environment抽象
本文内容 Environment抽象的2个重要概念 @Profile 的使用 @PropertySource 的使用 Environment抽象的2个重要概念 Environment 接口表示当前应用 ...
- 基于Maven的Spring + Spring MVC + Mybatis的环境搭建
基于Maven的Spring + Spring MVC + Mybatis的环境搭建项目开发,先将环境先搭建起来.上次做了一个Spring + Spring MVC + Mybatis + Log4J ...
- Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- 基于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 ...
- Spring系列之JDBC对不同数据库异常如何抽象的?
前言 使用Spring-Jdbc的情况下,在有些场景中,我们需要根据数据库报的异常类型的不同,来编写我们的业务代码.比如说,我们有这样一段逻辑,如果我们新插入的记录,存在唯一约束冲突,就会返回给客户端 ...
- Keil MDK STM32系列(六) 基于抽象外设库HAL的ADC模数转换
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- Spring系列(零) Spring Framework 文档中文翻译
Spring 框架文档(核心篇1和2) Version 5.1.3.RELEASE 最新的, 更新的笔记, 支持的版本和其他主题,独立的发布版本等, 是在Github Wiki 项目维护的. 总览 历 ...
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
- Spring 系列: Spring 框架简介(转载)
Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...
- Spring系列
Spring系列之访问数据库 阅读目录 一.概述 二.JDBC API的最佳实践 三.Spring对ORM的集成 回到顶部 一.概述 Spring的数据访问层是以统一的数据访问异常层体系为核心,结 ...
随机推荐
- python快速制作可视化报表
- Android Studio相关配置说明
介绍:Android Sdutio 是谷歌推出的一个 Android 集成开发工具. 现已将 SDK(software development kit)集成到 Android Studio 中.可以直 ...
- MQTT QoS 0, 1, 2 介绍
什么是 QoS 很多时候,使用 MQTT 协议的设备都运行在网络受限的环境下,而只依靠底层的 TCP 传输协议,并不能完全保证消息的可靠到达.因此,MQTT 提供了 QoS 机制,其核心是设计了多种消 ...
- C#判断窗体是否打开,并获取聚焦、未打开则新建一个子窗体
在桌面程序开发会遇到的情况,托盘功能或者是小功能弹窗问题: 现有一个主窗体有子窗体 子窗体每个都可以新建其他窗体问题:新建子窗体时怎么判断子窗体是否打开?若子窗体打开则置顶获取焦点.若未打开则新建一个 ...
- 从零搭建hadoop集群之CentOS7配置网卡为静态IP
CentOS7默认网卡设备文件存放于 /etc/sysconfig/network-scripts/ CentOS7的网卡设备名称是 ifcfg-ens33 vim /etc/sysconfi ...
- python实现web应用程序(1)虚拟环境与Django
前言 在这个系列博客中,我将使用python实现一个名为"OI笔记"的项目. 1 建立项目目录 第一步,我们先为自己的项目建立一个目录. 首先,打开终端. win+r键,然后输入c ...
- Ubuntu下CodeBlocks控制台程序中文显示乱码解决问题
今天在CodeBlocks下折腾来半天,终于把中文乱码给解决了,其实很简单. 在环境设置里进行如下设置:把Terminal to launch console programs那个选项改成gnome- ...
- download links
1 anaconda https://mirrors.bfsu.edu.cn/anaconda/archive/
- sql server 与mysql差异(innodb)
MySQL SQL SERVER CHAR_LENGTH(str) LEN(character_expression) CONCAT(str1,str2,...) str1+str2 INSERT(s ...
- 整合jUnit4和jUnit5
整合jUnit4 1.引入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId ...