Ввод свойств с помощью Spring & annotation @Value

Я пытаюсь загрузить файл свойств в Spring bean, а затем вставьте этот bean в класс.

Единственная часть, с которой я не могу работать, по-видимому, использует ссылку @Resource. Может кто-нибудь связать последнюю часть для меня? Я получаю нулевое значение каждый раз. Кажется, что не хочет вводить значение.

[EDIT] - Я думал, что использование @Resource было лучшим способом, но предлагаемое решение мне было легче.

Я видел это решение в другом сообщении:

Ссылка для ссылочного решения: Ввести значение свойства в Spring - отправлено DON

Кредит Дону за сообщение, но я просто не был уверен, как закончить его с помощью @Resource.

Результаты отладки: Значение переменной appProperties всегда равно нулю. Он не вводится.

Spring Конфигурация. enter image description here

Пример класса:

package test;

import java.util.Properties;
import javax.annotation.Resource;


public class foo {
    public foo() {}
    @Resource private java.util.Properties appProperties;
}

Основываясь на рекомендации в утвержденном решении ниже. Вот изменения, которые я сделал.


Обновление решения:

Spring Конфигурация: enter image description here

Класс Java: enter image description here

Ответ 1

Для вашего решения для работы вам также потребуется сделать foo Spring bean; потому что иначе как Spring знает, что он должен иметь дело с любыми вашими аннотациями в вашем классе?

  • Вы можете указать его в своем appcontext xml как bean с ..class="foo"
  • Или используйте component-scan и укажите базовый пакет, содержащий ваш класс foo.

Поскольку я не совсем уверен, что это именно то, что вы хотите (не хотите ли вы, чтобы файл .properties анализировался с помощью Spring и имел ли он пары ключ-значение вместо объекта Properties?), Я предлагаю вам другое решение: использование пространства имен util

<util:properties id="props" location="classpath:com/foo/bar/props.properties"/>

И ссылайтесь на значения внутри вашего beans (также должны быть Spring):

@Value("#{props.foo}")
public void setFoo(String foo) {
    this.foo = foo;
}

EDIT:

понял, что вы импортируете org.springframework.context.ApplicationContext в свой класс, который, вероятно, не нужен. Я настоятельно рекомендую вам прочитать Spring ссылку, по крайней мере, в первых нескольких главах, потому что a) это замечательно прочитано b) вам будет намного легче понять Spring если основы понятны.

Ответ 2

Еще одно решение, использующее свойства placeholder.

Контекст spring:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <context:component-scan base-package="your.packege" />

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

</beans>

Класс java, в который вы хотите ввести значения свойств:

public class ClassWithInjectedProperty {

    @Value("${props.foo}")
    private String foo;
}