Пружина не нагружает свойства


Пружина не загружает свойства, когда applicationContext.на xml ссылаются в классе @ Configuration

@Configuration
@ImportResource("classpath:applicationContext.xml")
public class SpringConfig {

  @Autowired
    private MyBean1 myBean1;

  @Bean
    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();

    }

  @Bean(name = "myBean2")
    public MyBean2 myBean2() {
    MyBean2 bean2 = new MyBean2();
    return bean2;
    }


}

ApplicationContext.xml:

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
       <property name="location">           
                <value>classpath:test.properties</value>           
        </property>
    </bean>

  <bean id="myBean1" class="com.foo.bar.MyBean1">
        <property name="name" value="${name}" />  
        <property name="age" value="${age}" />  
    </bean>

Тест.свойства: (в пути к классу)

name=foo
age=10

Когда я загружаю applicationContext.xml-файл, используя следующие строки кода, он работал:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

Я вижу следующие напечатанные строки:

2015-05-30 10:01:08.277 [INFO] org.springframework.beans.factory.config.PropertyPlaceholderConfigurer:172 - Loading properties file from class path resource [test.properties]
2015-05-30 10:01:08.292 [INFO] org.springframework.beans.factory.support.DefaultListableBeanFactory:596 - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5c001eb0: defining beans [placeholderConfig,myBean1]; root of factory hierarchy

У меня нет проблем с загрузкой теста.файл свойств с "myBean1" получает значение ${name} и {age} из файла свойств.

Проблема у меня возникает, когда я пытаюсь загрузить SpringConfig:

ApplicationContext ctx =   new AnnotationConfigApplicationContext(SpringConfig.class);

Класс SpringConfig ссылается на applicationContext.xml as: @ImportResource ("classpath:applicationContext.xml")

Ошибка, которую я вижу:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'myBean1' defined in class path resource [applicationContext.xml]: Could not resolve placeholder 'name' in string value "${name}"
                            at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209)
                            at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.processProperties(PropertySourcesPlaceholderConfigurer.java:174)
                            at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.postProcessBeanFactory(PropertySourcesPlaceholderConfigurer.java:151)
                            at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694)
                            at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:669)
                            at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
                            at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:73)

В двух словах, когда я загружаю applicationContext с помощью ClassPathXmlApplicationContext, то у меня нет проблем:

Работа:

Контекст ApplicationContext = new ClassPathXmlApplicationContext ("applicationContext.xml");

Но когда на него ссылается SpringConfig, то я вижу, что applicationContext не видит мой файл свойств.

Не Работает:

ApplicationContext ctx = new AnnotationConfigApplicationContext (SpringConfig.класс);

Пожалуйста, обратите внимание на этот тест.свойства находятся в моем пути к классу, и это не имеет никакого отношения к отсутствию файла свойств или чему-то еще.

Я не знаю, должен ли я использовать другой подход для AnnotationConfigApplicationContext, поскольку мне нужно, чтобы myBean1 автоматически подключался к SpringConfig, и myBean1 использует некоторые свойства из теста.файл свойств.

1 2

1 ответ:

При использовании

new AnnotationConfigApplicationContext(SpringConfig.class);

Вы регистрируете два боба PlaceholderConfigurerSupport, которые используются для разрешения свойств. Один через Java

@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();

}

И один через импортированный XML

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
   <property name="location">           
            <value>classpath:test.properties</value>           
    </property>
</bean>

Боб PropertySourcesPlaceholderConfigurer быстр на отказ, когда дело доходит до разрешения свойств. То есть, если он не найдет совпадения, он выдаст исключение (на самом деле вложенный класс, который делает разрешение, сделает это).

Поскольку ваш PropertySourcesPlaceholderConfigurer не был инициализирован никакими locations, у него нет никаких источников откуда разрешить ${name} или ${age} (у него есть некоторые источники, но не ваш файл test.properties).

Либо правильно настроить bean, чтобы найти файл свойств

@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    propertySourcesPlaceholderConfigurer.setLocation(new ClassPathResource("test.properties"));
    return propertySourcesPlaceholderConfigurer;
}

Или удалить его полностью. Если вы удалите его, Spring будет использовать правильно настроенный Боб PropertyPlaceholderConfigurer из XML.