gpt4 book ai didi

java - @Value 无需配置静态 PropertySourcesPlaceholderConfigurer 即可工作

转载 作者:搜寻专家 更新时间:2023-11-01 01:40:42 24 4
gpt4 key购买 nike

我试图了解不使用@Autowiring 和Spring Environment 类时@PropertySource 注释的行为。我正在尝试使用 @Value 在运行时从属性文件中注入(inject)值。从我正在阅读的书和在线资源中,需要配置一个静态 bean - PropertySourcesPlaceholderConfigurer 才能使其工作。但对我来说,@Value 也可以在没有 PropertySourcesPlaceholderConfigurer 静态 bean 的情况下工作。有人能指出我这里发生的事情的正确方向吗?可能是我遗漏了一些非常基本的东西。我们什么时候需要 PropertySourcesPlaceholderConfigurer 什么时候不需要?

下面是我正在尝试的代码 -

package com.nilaysundarkar.demos;

public class Person {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

AppConfig.java -

package com.nilaysundarkar.demos;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@PropertySource("classpath:/com/nilaysundarkar/demos/app.properties")
public class AppConfig {

// This bean does not make any difference, or does it?
/*@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}*/

@Bean
public Person person(@Value("${person.name}") String name){
Person person = new Person();
person.setName(name);
return person;
}

}

Bootstrap -

package com.nilaysundarkar.demos;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class App {

public static void main(String[] args){

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Person person = context.getBean(Person.class);
System.out.println(person.getName());
((AnnotationConfigApplicationContext)context).close();
}

}

属性文件 - app.properties -

person.name=John Doe

pom-

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nilaysundarkar.demos</groupId>
<artifactId>demos-runtime-injections</artifactId>
<version>0.0.1-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>

当我运行 App.java 时 -

enter image description here

最佳答案

在 spring boot 和一般的 spring 中,application.properties(和自 spring boot 以来的 application.yml)可以放在 src/main/resources 它由 spring 环境自动选取。这意味着该文件中的任何属性都将加载到您的 Environment 中,并准备好使用 @Value 进行注入(inject)。

您可以使用 PropertySourcesPlaceholderConfigurer 来按顺序注册更多属性源,例如 foo.properties[NAME].properties 等等为 spring Environment 添加它们。

当您使用 @PropertySource 时,您会向 spring Environment 注册另一个属性文件,因此您不需要使用自定义 PropertySourcesPlaceholderConfigurer 来注册它再次。 @PropertySource 可以更轻松地注册不需要某些特殊加载的属性文件,例如文件系统中的文件等。

只要您使用默认位置 (application.properties),您就不需要注册此类型的自定义 bean

编辑:

PropertySourcesPlaceholderConfigurer 示例,其功能与 @PropertySource 相同。该示例基于驻留在 src/main/resources 中的 foo.properties 文件:

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocation(new ClassPathResource("foo.properties"));
return configurer;
}

关于java - @Value 无需配置静态 PropertySourcesPlaceholderConfigurer 即可工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43299542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com