2015-08-01 16 views
11

Czy ktoś może doradzić, dlaczego musimy zadeklarować komponent PropertySourcesPlaceholderConfigurer przy użyciu metody static? Właśnie okazało się, że jeśli używam non-statyczne poniżej następnie url zostanie ustawiona na wartość null zamiast brać z pliku nieruchomości -Konfiguracja oparta na Java Spring z metodą statyczną

@Value("${spring.datasource.url}") 
private String url; 

@Bean 
public static PropertySourcesPlaceholderConfigurer propertyConfig(String profile) { 
    String propertyFileName = "application_"+profile+".properties"; 
    System.out.println(propertyFileName); 
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); 
    configurer.setLocation(new ClassPathResource(propertyFileName)); 
    return configurer; 
} 

@Bean 
@Profile("local") 
public static String localProfile(){ 
    return "local"; 
} 

@Bean 
@Profile("prod") 
public static String prodProfile(){ 
    return "prod"; 
} 

Odpowiedz

16

PropertySourcesPlaceholderConfigurer obiekty są odpowiedzialne za rozwiązywanie @Value adnotacje przeciwko obecnej wiosennej środowisku i jego zestaw Źródeł PropertySources. PropertySourcesPlaceholderConfigurer klasy implementuje BeanFactoryPostProcessor. W cyklu życia kontenera obiekt BeanFactoryPostProcessor musi zostać utworzony wcześniej niż obiekt klasy niezaangażowanej.

Jeśli masz @Configuration -annotated klasę z metody instancji zwracanie PropertySourcesPlaceholderConfigurer obiekt, a następnie pojemnik może nie instancję obiektu PropertySourcesPlaceholderConfigurer bez uruchamianiu tego samego obiektu @Configuration -annotated klasy. W tym przypadku nie można rozstrzygnąć, @Value, ponieważ obiekt PropertySourcesPlaceholderConfigurer nie istnieje w momencie tworzenia obiektu klasy niezaangażowanej w klasę . Tak więc pole nieaktywne przyjmuje wartość domyślną, czyli null.

Aby uzyskać więcej informacji, zobacz część "Bootstrapping" pod numerem @Beanjavadoc.

+0

dzięki za odpowiedź .... –

Powiązane problemy