【问题标题】:How to access a property in .properties file during or before the main() method in Spring?如何在 Spring 的 main() 方法期间或之前访问 .properties 文件中的属性?
【发布时间】:2020-04-09 21:21:57
【问题描述】:

我们已将现有的 Web 应用程序转换为 Spring Boot。

我想做的就是能够使用@Profile("production")。我们将其存储在资源文件夹的 myProps.properties 中。

我可以使用@Value 访问整个应用程序中的 .properties 文件,但似乎为了让@Profile 工作,您必须在设置/最终设置 ServletContext 之前设置活动配置文件,这似乎在 main() 方法期间发生。

我已经尝试了几十件事,但都失败了。我发现您不能在主应用程序类中使用 @Value 设置静态字段。我尝试创建一个实现 WebApplicationInitializer 的类,例如https://www.baeldung.com/spring-profiles,但是我覆盖的 onStartup() 方法永远不会运行。我设置了一个断点,它永远不会被击中。我可以获得断点的唯一方法是,如果我在该方法上@Autowire servletContext,但是上下文已经设置并且无法更改。

我试过 AnnotationConfigWebApplicationContext,我试过 ServletContainerInitializer,我试过 ConfigurableEnvironment 等等。我感觉我在绕圈子。

我觉得为了以“春天的方式”做事,我在这里遗漏了一大块。谁能为我提供 Java 注释配置方式来获取属性并设置活动配置文件以供以后在产品中使用?谢谢。

【问题讨论】:

  • @Thomas__ 该链接中的 4.1 中的 onStartup() 永远不会为我运行。断点永远不会被击中。
  • 你想用@Profile("production") 达到什么目的?
  • @ThisIsNoZaku 我们的一些网络服务器会根据某些属性运行不同的任务。该属性由我们的 Ops 人员在部署过程中在属性文件中设置。即在代码库之外。

标签: java spring spring-boot


【解决方案1】:

为什么在 main 之前需要它?为什么不直接创建多个属性文件并在顶级属性文件中定义配置文件?

(父)application.properties

spring.profiles.active = development-application.properties

(profile) development-application.properties

my.value = foo

【讨论】:

  • 如果 'development-application.properties' 有 1000 个条目,其中大部分与配置文件无关怎么办?我可以为配置文件制作第三个 .properties 文件,但我试图不必这样做。
【解决方案2】:

根据您的 cmets,我建议使用以下解决方案:

使用 @Components 将您的任务定义为 bean,并使用 @Profile 对其进行注释,以根据您希望它们使用的环境将它们划分(我更喜欢将配置文件设置为环境变量)。

@Component
@Profile("production")
public class TaskA implements Task {
    public void doWork(){}
}

@Component
@Profile("staging")
public class TaskB implements Task {
    public void doWork(){}
}

@Component 标记这些类意味着Spring 将管理它们并且它们可以被注入,也许注入到执行任务的@Component

@Component
public class TaskDoer {
    private List<Task> tasksToDo;
    @Inject
    public TaskDoer(List<Task> tasksToDo) {
        this.tasksToDo = tasksToDo;
    }
}

在部署您的应用时,以适合您的设置的任何方式设置要在环境变量中使用的配置文件:

SPRING_PROFILES_ACTIVE = production, someOtherProfile

现在,当应用程序启动时,Spring 将看到活动配置文件是“production”和“someOtherProfile”(可以设置多个配置文件),并且不会加载任何不属于该配置文件的 @Profile bean .

【讨论】:

  • 感谢您的回复。 “.. 以适合您的设置的任何方式设置要在环境变量中使用的配置文件:”= 是的,这就是问题所在.. 除了那部分之外,我已经弄清楚了其他所有内容。我们已经在自定义 .properties 文件中有一个自定义设置,我希望重新使用它。尽管我在上面列出了所有努力,但我找不到为此使用这些自定义属性的方法。我想我们只需要在属性文件中执行 spring.profiles.active 即可。 :耸肩:
猜你喜欢
  • 2014-06-20
  • 2013-10-07
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多