一尘不染

如何使用Spring Boot加载外部配置?

spring-boot

我目前正在学习如何使用Spring Boot。到目前为止,我从未使用过像Spring这样的框架,也没有直接使用过文件(FileInputStream等)。

情况就是这样:我有一些动态配置值,例如OAuth令牌。我想在我的应用程序中使用它们,但是我不知道如何用Spring实现它们。

这是一些代码来明确我要搜索的内容:

@Config("app.yaml")
public class Test {
    @Value("app.token")
    private String token;
    private IClient client;

    public Test(String token) {
        this.client = ClientFactory.build(token).login();
    }
}

当然,这个例子很简单。在这里,我想从YAML配置文件中动态获取值“ token”。该文件必须可供用户访问,并且不包含在JAR文件中。

我还发现了该文档:https :
//docs.spring.io/spring-boot/docs/current/reference/html/boot-features-
external-config.html,
但是我现在知道如何将其应用于我的项目。

我该如何实现?先感谢您 :)

编辑:

这是我的代码的某些部分:

看门狗Bootstrap.java

package de.onkelmorph.watchdog;

import org.springframework.boot.Banner.Mode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource("classpath:Beans.xml")
public class WatchdogBootstrap {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(WatchdogBeans.class);
        app.setBannerMode(Mode.OFF);
        app.setWebEnvironment(false);
        app.run(args);
    }
}

Beans.xml (位于默认包中)

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:annotation-config></context:annotation-config>
</beans>

看门狗

package de.onkelmorph.watchdog;

// Imports ...

@Component
@PropertySource("file:/watchdog.yml")
public class Watchdog {
    // ...

    // Configuration
    @Value("${watchdog.token}")
    private String token;

    public Watchdog() {
        System.out.println(this.token);
        System.exit(0);
    }

    // ...
}

watchdog.yml (位于src / main / resources中)

watchdog:
  token: fghaepoghaporghaerg

阅读 624

收藏
2020-05-30

共1个答案

一尘不染

首先,Test应该为您的类添加注释,@Component以便在spring之前将其注册为Bean(还要确保所有类都位于您的主程序包下-
主程序包是带有注释的类@SpringBootApplication所在的位置)。

现在,您应该将所有属性移至application.ymlsrc/main/resources/application.yml),由Spring
Boot自动选择(请注意,它应.yml代替.yaml或注册一个custom)PropertySourcesPlaceholderConfigurer

示例PropertySourcesPlaceholderConfigurer

@Bean
public static PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() throws IOException {
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    MutablePropertySources propertySources = new MutablePropertySources();
    Resource resource = new DefaultResourceLoader().getResource("classpath:application.yml");
    YamlPropertySourceLoader sourceLoader = new YamlPropertySourceLoader();
    PropertySource<?> yamlProperties = sourceLoader.load("yamlProperties", resource, null);
    propertySources.addFirst(yamlProperties);
    configurer.setPropertySources(propertySources);
    return configurer;
}

现在,应该将属性加载到spring的环境中,并且可以将其注入@Value到您的bean中。

2020-05-30