2014-10-19 2 views
4

내 속성 파일에서 속성을로드하는 데 어려움이 있습니다. 아래 나열된 구성 클래스에 속성을로드하려고합니다. 내가 파일 (application.properties) 또는 "@PropertySource의 이름을 변경하는 경우속성 및 env 항상 null

package dk.fitfit.budget.config; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
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; 
import org.springframework.core.env.Environment; 


@Configuration 
@PropertySource("classpath:application.properties") 
public class ApplicationConfig { 
    private static final Logger logger = LoggerFactory.getLogger(ApplicationConfig.class); 

    @Autowired 
    private Environment env; 

    @Value("${snot:test}") 
    private String snot; 

    public ApplicationConfig() { 
     logger.info("Application config loaded!"); // Displays as expected 
     logger.info("snot: {}", snot);    // snot: null 
     logger.info("env: {}", env);    // env: null 
    } 

    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

} 

는 ("클래스 경로 : application.properties을 ")"나는 파일이 존재하지에 대해 오류가 발생합니다. 그래서 분명히로드되고 있습니다 (어쨌든 확장 될 수 있습니다).

변수 snot에 "test"라는 기본 문자열이 삽입 될 것으로 예상되었습니다. 그러나 그것조차도 끝나지 않습니다. 나는 환경을 autowire 수 없습니다 ... 관계가 있는지 확실하지 않습니다.

내 application.properties의 내용은 다음과 같습니다.

snot=snog 

내 application.properties 파일은 src/main/resources /에 있습니다.

누구나 내가 뭘 잘못하고 있는지에 대한 단서가 있습니까?

답변

5

생성자의 목적은 클래스 인스턴스를 초기화하는 것입니다. Spring이 무엇인가를하기 전에 클래스 인스턴스를 생성하고 초기화해야한다. 따라서 envsnot 필드에는 생성자 내에서 기본값 인 null 이외의 값을 사용할 수 없습니다.

+1

축하해, 마지막 투표가 있습니다. 다른 시간에 투표 할 수 없습니다. –

4

봄 (및 모든 종속성 삽입 도구)은 인스턴스 생성 전에 필드를 삽입 할 수 없으므로, 이는 생성자 삽입이 필드 주입보다 우선되어야하는 한 가지 이유입니다. 일반적으로 @Value을 생성자 매개 변수에 사용할 수 있지만 @Configuration 클래스에는 생성자 삽입을 실용적이지 않게 만드는 특정 문제가 있습니다.

그러나 정확하게이 상황을위한 해결책이 있습니다 : @PostConstruct. 이 메소드는 DI 프레임 워크가 bean에게 모든 마술을 수행 한 후에 호출됩니다.

@PostConstruct 
public void log() { 
    logger.info("Application config loaded!"); // Displays as expected 
    logger.info("snot: {}", snot);    // snot: null 
    logger.info("env: {}", env);    // env: null 
} 
+0

이것은 내가 찾고있는 것입니다. 감사! –