봄 콩 라이프 사이클 - @value 속성은 생성자에서 널 (null)입니다

왈 리드 :

나는 봄 부팅없이 스프링 프레임 워크 4.3을 사용하고 있습니다. 지금까지 내가 빈의 라이프 사이클에 대한 이해 :

  1. 로드 빈 정의
  2. BeanFactoryPostProcessor를 클래스를 사용하여 프로세스 bean 정의
  3. 실체화 및 분사 콩 (오른쪽 순서 루프)
  4. 사용 콩
  5. 가비지 수집기가 콩을 파괴하자

PropertyPlaceholderConfigurerA는 BeanFactoryPostProcessor. 그래서 @Value속성은 콩을 instanciating 전에 반드시 숙지해야합니다. (2 단계).

이 내 코드, 메인 클래스입니다 :

public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    ReadValueFromFile dc = ctx.getBean(ReadValueFromFile.class);
    System.out.println("Main : " + dc.getUrl());
}

ReadValueFromFile.java

@Component
@PropertySource("classpath:db/db.properties")
public class ReadValueFromFile {
    @Value("${url}")
    private String url;

    public ReadValueFromFile() {
        System.out.println("url constructor : " +  url);
    }

    @PostConstruct
    void init() {
        System.out.println("url postconstruct : " +  url);
    }

    @PreDestroy
    void dest() {
        System.out.println("url @PreDestroy : " +  url);
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

구성 클래스 :

@Configuration
@ComponentScan(basePackages={"tn.esprit.beans"})
public class AppConfig {

     //it works well without declaring this bean.
//   @Bean
//   public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
//      return new PropertySourcesPlaceholderConfigurer();
//   }
}

그리고 마지막으로 SRC / 메인 / 자원 / DB에서 내 프로퍼티 파일 :

url=jdbc:mariadb://localhost:3306/client_project

내가 메인 클래스를 실행하면 나는이 출력을 얻을 :

url constructor : null
url postconstruct : jdbc:mariadb://localhost:3306/client_project
Main : jdbc:mariadb://localhost:3306/client_project

때이 생성자 호출 URL 속성이 널 (null) 봄이다! 경우 @Value속성은 콩을 instanciating 전에 읽을 수 있어야합니다, 그래서 URL을 설정하고 널 달라야합니다.

그렇지?

내 코드에 뭔가 잘못인가? 또는 콩의 라이프 사이클에 대한 이해와?

아툴 Dwivedi :

때이 생성자 호출 URL 속성이 널 (null) 봄이다! @Value 속성은 URL을 설정하고 널 달라야합니다, 그래서 콩을 instanciating 전에 반드시 숙지해야합니다. 그렇지?

이것은의 생성자 경우는 어떻게 작동되지 않습니다 ReadValueFromFile필요 @Value다음은 봄이 인스턴스화하기 전에 보장합니다 봄 인스턴스화 그렇지 않으면 값을 볼 수 있습니다 호출하여 다음 기본 생성자를 사용하고 방법 재산은 값을 주입하는 것입니다.ReadValueFromFileurlReadValueFromFilesetterurl

따라서, 생성자 실행하는 동안 당신은 값이 표시되지 않습니다.

코드와 아무것도 잘못이있다.

당신은 봄이 의존성 (또는 값)을 주입하는 방법을 이해해야합니다

  1. Constructor 분사 - 의존성 수단 / 값 주사 종속 인스턴스화 중에 존재해야
  2. Setter 사출 - 의존성 수단 / 값 의존 인스턴스화시 요구되지 않고, 세터의 방법을 사용하여 나중에 분사 될
  3. Field 사출 - 의존성 수단 / 값 의존 인스턴스화시 요구되지 않고 반사하여 나중에 분사 될

추천

출처http://43.154.161.224:23101/article/api/json?id=204541&siteId=1