当前位置: 首页 > 知识库问答 >
问题:

在Spring添加新属性源的最佳方式是什么?

诸葛苏燕
2023-03-14

我想添加一个新的属性源,可用于读取应用程序中的属性值。我想使用Spring来做到这一点。我在@Configuration类中有一段这样的代码:

@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {        
    PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
    MutablePropertySources sources = new MutablePropertySources();
    MyCustomPropertySource propertySource = new MyCustomPropertySource("my custom property source");
    sources.addFirst(propertySource);
    properties.setPropertySources(sources);
    return properties;
}

这看起来工作得很好。但是,它也在覆盖我不想覆盖的其他属性值(例如server.port在Spring启动使用的application.properties文件中的属性)。所以基本问题是添加此属性源但不让它覆盖其他属性的最佳方法是什么。有什么方法可以获取现有的属性源并简单地添加到其中吗?

共有3个答案

方恺
2023-03-14

还有一种可能性(经过大量实验后,这对我很有效)是在应用程序上下文初始值设定项中声明您的属性源,然后将其注入到SpringBootServletializer中:

public class MyPropertyInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    private static final Logger logger = LoggerFactory.getLogger(ApplicationPropertyInitializer.class);

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        MyPropertySource ps = new MyPropertySource();
        applicationContext.getEnvironment().getPropertySources().addFirst(ps);
    }

}
public class MyInitializer extends SpringBootServletInitializer{

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return super.configure(builder.initializers(new MyPropertyInitializer()));
    }

}
谷玉韵
2023-03-14

尝试将IgnoreUn解析的占位符设置为TRUE。我有一个类似的问题,我可以通过这种方式解决。在我的例子中,我有另一个占位符配置程序,它正在工作——但是第二个中的属性没有被解析,除非我将此属性设置为TRUE。

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {        
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    propertySourcesPlaceholderConfigurer.setIgnoreUnresolvablePlaceholders(Boolean.TRUE);
    propertySourcesPlaceholderConfigurer.setIgnoreResourceNotFound(Boolean.TRUE);
    return propertySourcesPlaceholderConfigurer;
}
裴心思
2023-03-14

我通过在我的Spring启动应用程序中添加一个自定义初始化程序来实现这一点:

@SpringBootApplication
public class MyApp {

    public static void main(String[] args) {
        new SpringApplicationBuilder(MyApp.class)
            .initializers(new MyContextInitializer())  // <---- here
            .run(args);
    }

}

其中MyContextInitializer包含:-

public class MyContextInitializer implements
    ApplicationContextInitializer<ConfigurableApplicationContext> {

    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        ConfigurableEnvironment environment = configurableApplicationContext.getEnvironment();

        // Create map for properites and add first (important)
        Map<String, Object> myProperties = new HashMap<>();
        myProperties.put("some-prop", "custom-value");
        environment.getPropertySources().addFirst(
            new MapPropertySource("my-props", myProperties));
    }

}

注意,如果您的应用程序。yaml包含:-

some-prop: some-value
another-prop: this is ${some-prop} property

然后,initialize(初始化)方法将把一些属性更新为自定义值,当应用程序加载时,它在运行时将具有以下值:

some-prop: custom-value
another-prop: this is custom-value property

注意,如果初始化方法执行了一个简单的系统。setProperty调用,即。

    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        ConfigurableEnvironment environment = configurableApplicationContext.getEnvironment();
        System.setProperty("some-prop", "custom-value");
    }

... 然后另一个属性将等于这是一个值属性,这不是我们通常想要的(并且我们失去了Spring-config属性解析的能力)。

 类似资料:
  • 问题内容: 我想使用JavaScript 重新加载。到目前为止,我发现的最好方法是将iframe的属性设置为其自身,但这并不是很干净。有任何想法吗? 问题答案: 注意,在Firefox中,不能通过id进行索引,而只能通过名称或索引进行索引

  • 我的应用程序是关于艺术家画墙壁的。 在这一点上,艺术家有许多墙,墙属于艺术家。 但现在我想使可能的一面墙归属许多艺术家。( 我想不出解决这个问题的最好办法。那么: 1-一个旋转台:艺术家的墙壁,那里有许多艺术家和艺术家的墙壁 •可能吗?还是双方都必须有自己的关系? • 2-我的墙表中的艺术家ID数组 •那么我想我会失去这段雄辩关系的好处 看起来很脏 有什么经验可以分享吗?够清楚吗?我用的是拉威尔5

  • 问题内容: 我需要比较两个对象(同一类的实例)中的许多字段,并做一些记录和更新,以防出现差异。元代码可能看起来像这样: 具有所有比较的代码非常简洁,我想以某种方式使其更紧凑。如果我有一个方法可以将setter和getter的调用作为参数并在所有字段中调用,那将是很好的,但是不幸的是,这对于Java是不可能的。 我提出了三个选择,每个选择都有其自身的缺点。 1.使用反射API来找出getter和se

  • 问题内容: 我有一个状态数组,比方说this.state.arr。我想向此状态属性添加一些内容,然后更改更多属性。 选项1 选项2 所以..我知道this.state应该被视为不可变的。但是可以像在选项1中那样使用它还是可以通过它设置状态,还是可以像在选项2中那样使用它,这样总是总是首先在内存中进行复制 问题答案: 使用concat的另一种简单方法:

  • 有一个 K8S 群集,我们的大多数部署只是更新映像的版本,但有时我们也希望更新部署配置的某些部分。我们的部署配置不包括映像的标记。 对于更新映像版本似乎是我最好的选择。至于一起更新部署配置和映像,我看到了几种方法: < li>kubectl部署...:< code>kubectl集合图像...[但是有两个部署] < li >使用实际图像标记编辑部署YAML[看起来不太优雅] < li>kubect

  • 问题内容: 我需要能够根据作用域上的布尔变量向元素添加例如“ contenteditable”。 使用示例: 如果设置为,将导致contenteditable = true被添加到元素。有一些简单的方法可以实现这种ng- class这样的属性行为吗?我正在考虑编写指令,如果没有,请共享。 编辑: 我可以看到我提议的attrs指令和ng-bind- attrs 之间似乎有些相似之处,但是在1.0.0