나는 봄 부팅없이 스프링 프레임 워크 4.3을 사용하고 있습니다. 지금까지 내가 빈의 라이프 사이클에 대한 이해 :
- 로드 빈 정의
- BeanFactoryPostProcessor를 클래스를 사용하여 프로세스 bean 정의
- 실체화 및 분사 콩 (오른쪽 순서 루프)
- 사용 콩
- 가비지 수집기가 콩을 파괴하자
PropertyPlaceholderConfigurer
A는 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을 설정하고 널 달라야합니다.
그렇지?
내 코드에 뭔가 잘못인가? 또는 콩의 라이프 사이클에 대한 이해와?
때이 생성자 호출 URL 속성이 널 (null) 봄이다! @Value 속성은 URL을 설정하고 널 달라야합니다, 그래서 콩을 instanciating 전에 반드시 숙지해야합니다. 그렇지?
이것은의 생성자 경우는 어떻게 작동되지 않습니다 ReadValueFromFile
필요 @Value
다음은 봄이 인스턴스화하기 전에 보장합니다 봄 인스턴스화 그렇지 않으면 값을 볼 수 있습니다 호출하여 다음 기본 생성자를 사용하고 방법 재산은 값을 주입하는 것입니다.ReadValueFromFile
url
ReadValueFromFile
setter
url
따라서, 생성자 실행하는 동안 당신은 값이 표시되지 않습니다.
코드와 아무것도 잘못이있다.
당신은 봄이 의존성 (또는 값)을 주입하는 방법을 이해해야합니다
Constructor
분사 - 의존성 수단 / 값 주사 종속 인스턴스화 중에 존재해야Setter
사출 - 의존성 수단 / 값 의존 인스턴스화시 요구되지 않고, 세터의 방법을 사용하여 나중에 분사 될Field
사출 - 의존성 수단 / 값 의존 인스턴스화시 요구되지 않고 반사하여 나중에 분사 될