java - 如何在 Spring 应用程序中基于 application.properties 中定义的环境加载属性。不使用 Springboot
问题描述
我是春天的新手,我正在研究它。偶然发现了@Profile 注释。
我想用Spring(不是Springboot)编写一个简单的项目来学习如何使用@profile注解基于环境加载属性。几乎无处不在,示例(Ex1,Ex2)我只在 Springboot 中看到。我想知道我们是否不能编写一个可以根据环境(dev、prod)动态加载属性的 Spring 应用程序。
一些示例(Ex3、Ex4、Ex5)与 @Profile 一起显示,但这些示例已经硬编码了每个环境的 bean 详细信息,如下所示。这就是我们必须编写属性加载的方式吗?
@Profile("dev") @Bean public String devDBCcnnection() { System.out.println(dbConfiguration.getUrl()); return "DB Connection for Dev"; } @Profile("test") @Bean public String devTestCcnnection() { System.out.println(dbConfiguration.getDriverClassName()); return "DB Connection for Test"; } @Profile("prod") @Bean public String devProdCcnnection() { System.out.println("DB Connection for Prod"); return "DB Connection for Prod"; }
它必须像上面的例子一样为每个配置文件编写一个 bean?
有人可以告诉我使用@Profiles,不能像在 Spring 应用程序中那样动态加载属性值吗?
如果您可以使用 Spring 5 提供样品,请不胜感激
解决方案
几乎到处都是我只在 Springboot 中看到的示例(Ex1、Ex2)。我想知道我们是否不能编写一个可以根据环境(dev、prod)动态加载属性的 Spring 应用程序。
Spring Boot 使用 spring 上下文。spring 上下文允许您使用配置文件。因此,在简单的 Spring 项目(非 spring-boot)中使用配置文件没有问题。
您可以通过多种方式使用配置文件。
其中之一是您使用特定 bean 提供的示例,这些 bean 已@Profile
在 spring 中为特定配置文件注册。
另一种在企业应用程序中更常用的方法是发布一个带有多个 application.yaml 文件的 jar 应用程序。因此,例如,您发布您的应用程序,其中包含dev-application.yaml
和qa-application.yaml
. 然后,您可以启动您的应用程序,选择要激活的特定配置文件。然后,当应用程序启动时,将使用特定的 application.yaml 来构建 spring 上下文。因此,应用程序将启动并qa-application.yaml
与 QA 数据库建立连接。
但请注意,默认的 application.yaml 也会被加载。例如,特定的 application.yamlqa-application.yaml
将在 default 之上加载application.yaml
。
以下文章包含有关弹簧型材的非常好的信息 弹簧型材文章
考虑到我在这里的例子,我引用了那篇文章中的一些相关内容。
默认配置文件 默认配置文件始终处于活动状态。Spring Boot 将 application.yml 中的所有属性加载到默认配置文件中。我们可以将配置文件重命名为 application-default.yml,它的工作原理是一样的。
其他配置文件将始终在默认配置文件之上进行评估。这意味着,如果在默认配置文件中定义了属性,但在 qa 配置文件中未定义,则将从默认配置文件填充属性值。这对于定义在所有配置文件中都有效的默认值非常方便。
为了激活特定的配置文件
对于非 spring-boot 项目,这里是一个很好的答案spring active profile
对于 spring-boot 项目,您可以
使用系统变量来启动你的 jar 文件
java -Dspring.profiles.active=qa -jar myApp.jar
使用环境属性启动 jar 文件
export SPRING_PROFILES_ACTIVE=qa
java -jar myApp.jar
推荐阅读
- c++ - 初学者的 C++:如何将列表作为函数参数传递?
- c - 导航功能正在打印其所有输出两次
- python-3.x - 输入验证以及如何改进它
- react-native - 反应本机中的连接对象单例
- java - 数组索引越界 Project Euler Problem 17
- python - 为什么 torch.nn.Sigmoid 是一个类而不是一个方法?
- jsrender - jsrender 模板中的基本数学运算
- c# - 通过 WebBrowser 控件查看 PDF 显示 adobe reader 菜单而不是 pdf
- javascript - 修改函数,如果两个参数都为真则返回真,否则返回假
- sql - 插入空 MAP