簡體   English   中英

Spring:無法從 application.properties 獲取價值

[英]Spring : Cannot get value from application.properties

我通過 Spring Initializr 創建了 Spring 項目,項目結構如下:

在此處輸入圖像描述

我在 application.properties 文件中定義了屬性:

my.prop=testvalue

我將這個值注入到 MyClass 中,如下所示:

@Component
class MyClass {

    @Value("${my.prop}")
    private String myProp;

    public String getMyProp() {
        return myProp;
    }
}

ConfigBeans 定義如下:

package com.example.propertiesdemo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfigBeans {
    @Bean
    public MyClass myLitoBean() {
        return new MyClass();
    }
}

屬性demoApplication.java:

package com.example.propertiesdemo;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@SpringBootApplication
public class PropertiesdemoApplication {
    public static void main(String[] args) {

        ApplicationContext context
                = new AnnotationConfigApplicationContext(
                        ConfigBeans.class);
        MyClass myClass = context.getBean(MyClass.class);
        System.out.println(myClass.getMyProp());
    }
}

我期待在執行行 System.out.println(myClass.getMyProp()); 之后將打印 application.properties 中定義的 myprop 值(即 testvalue),但運行后(通過 Netbeans IDE)我得到輸出:

${my.prop}

這段代碼中遺漏了什么? 提前致謝

您正在創建MyClass bean 兩次。

  1. 使用@component注解
  2. 在配置類中使用@bean注釋(使用方法名稱 lowerCamelCase 即在您的情況下為myClass()

使用上述任何一種方法僅創建一次 bean。

您不需要像這樣在 main 方法中創建應用程序上下文。 呈現的代碼是一種“傳統”彈簧和彈簧靴的混合體。 所以你有點繞過了 spring boot 提供的所有好東西,其中包括自動application.properties加載。

如果您使用的是 spring boot(有一個@SpringBootApplication注釋),那么它將自行創建所有內容。

通常它應該是這樣的

    public static void main(String[] args) {
        SpringApplication.run(PropertiesdemoApplication.class, args);
    }

是的,正如 Navnath Adsul 所說,您需要創建一次 bean,而且,由於您使用的是 Spring Boot,因此需要使用特殊方法來提升上下文

@SpringBootApplication
public class PropertiesdemoApplication implements CommandLineRunner {

    // Inject Bean
    @Autowired
    private MyClass myClass;

    public static void main(String[] args) {
        new SpringApplicationBuilder()
                .sources(PropertiesdemoApplication.class)
                .run(args);
       // or SpringApplication.run(PropertiesdemoApplication.class, args);

    }

    @Override
    public void run(String[] args) throws Exception {
        System.out.println(myClass.getMyProp());                    
    }
}
@SpringBootApplication
public class PropertiesdemoApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(PropertiesdemoApplication.class, args);
        MyClass myClass = context.getBean(MyClass.class);
        System.out.println(myClass.getMyProp());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM