복붙노트

[SPRING] Spring 3.2 순수 Java 구성을 사용하는 @value 주석이 작동하지 않지만 Environment.getProperty가 작동 함

SPRING

Spring 3.2 순수 Java 구성을 사용하는 @value 주석이 작동하지 않지만 Environment.getProperty가 작동 함

나는이 머리에 머리를 부러 뜨 렸어. 내가 무엇을 놓치고 있는지 잘 모르겠다. @Value 주석을 순수 Java 구성 Spring 응용 프로그램 (비 웹)에서 사용할 수 없습니다.

@Configuration
@PropertySource("classpath:app.properties")
public class Config {
    @Value("${my.prop}") 
    String name;

    @Autowired
    Environment env;

    @Bean(name = "myBean", initMethod = "print")
    public MyBean getMyBean(){
         MyBean myBean = new MyBean();
         myBean.setName(name);
         System.out.println(env.getProperty("my.prop"));
         return myBean;
    }
}

속성 파일에는 my.prop = avalue 만 있습니다. bean은 다음과 같습니다.

public class MyBean {
    String name;
    public void print() {
        System.out.println("Name: " + name);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

환경 변수가 값을 올바르게 인쇄하지만 @Value는 값을 표시하지 않습니다. 가치 이름 : $ {my.prop}

메인 클래스는 컨텍스트를 초기화합니다.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

그러나 내가 사용한다면

@ImportResource("classpath:property-config.xml")

이 스 니펫으로

<context:property-placeholder location="app.properties" />

다음 그것은 잘 작동합니다. 물론 환경은 null을 반환합니다.

해결법

  1. ==============================

    1.Config 클래스에 다음 bean 선언을 추가하십시오.

    Config 클래스에 다음 bean 선언을 추가하십시오.

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

    @Value 주석을 사용하려면 PropertySourcesPlaceholderConfigurer를 등록해야합니다. XML에서 를 사용할 때 자동으로 수행되지만 @Configuration을 사용할 때는 정적 @Bean으로 등록해야합니다.

    @PropertySource 문서와이 Spring Framework Jira 문제를 보라.

  2. from https://stackoverflow.com/questions/17097521/spring-3-2-value-annotation-with-pure-java-configuration-does-not-work-but-env by cc-by-sa and MIT license