Как заставить spring ввести значение в статическое поле



Я знаю, что это может выглядеть как ранее заданный вопрос, но я столкнулся с другой проблемой здесь.



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



public class Utils{
private static Properties dataBaseAttr;
public static void methodA(){

}

public static void methodB(){

}
}


теперь мне нужна Весна, чтобы заполнить dataBaseAttr свойствами атрибутов базы данных.Весенняя конфигурация:



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

<util:properties id="dataBaseAttr"
location="file:#{classPathVariable.path}/dataBaseAttr.properties" />
</beans>


Я уже сделал это в других бобах, но проблема здесь, в этом классе (Utils), не является Бобом, и если я сделаю его Бобом ничего изменения я все еще не могу использовать переменную, так как класс не будет создан и переменная всегда равна нулю.

756   2  

2 ответов:

у вас есть две возможности:

  1. нестатический сеттер для статического свойства / поля;
  2. используя org.springframework.beans.factory.config.MethodInvokingFactoryBean для вызова статического сеттера.

в первом варианте у вас есть боб с обычным сеттером, но вместо установки свойства экземпляра вы устанавливаете статическое свойство/поле.

public void setTheProperty(Object value) {
    foo.bar.Class.STATIC_VALUE = value;
}

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

во втором случае это будет сделано следующим образом:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod" value="foo.bar.Class.setTheProperty"/>
    <property name="arguments">
        <list>
            <ref bean="theProperty"/>
        </list>
   </property>
</bean>

на вас случай, если вы добавите новый сеттер на Utils класс:

public static setDataBaseAttr(Properties p)

и в вашем контексте вы настроите его с помощью подхода, приведенного выше, более или менее похожего:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod" value="foo.bar.Utils.setDataBaseAttr"/>
    <property name="arguments">
        <list>
            <ref bean="dataBaseAttr"/>
        </list>
   </property>
</bean>

у меня было аналогичное требование: мне нужно было ввести в мойPerson класс сущности ("сущность", как в" что-то с идентификатором", например сущность JPA). А Person экземпляр имеет друзей, и для этого Person экземпляр, чтобы вернуть своих друзей, он должен делегировать в свой репозиторий и запросить там друзей.

@Entity
public class Person {
    private static PersonRepository personRepository;

    @Id
    @GeneratedValue
    private long id;

    public static void setPersonRepository(PersonRepository personRepository){
        this.personRepository = personRepository;
    }

    public Set<Person> getFriends(){
        return personRepository.getFriends(id);
    }

    ...
}

.

@Repository
public class PersonRepository {

    public Person get Person(long id) {
        // do database-related stuff
    }

    public Set<Person> getFriends(long id) {
        // do database-related stuff
    }

    ...
}

так как же я ввел это PersonRepository синглтон в статическое поле Person класс?

Я создал @Configuration, который забирается в Весна ApplicationContext время строительства. Это @Configuration вводится со всеми теми бобами, которые мне нужно ввести в качестве статических полей в другие классы. Тогда с @PostConstruct аннотация, я ловлю крючок, чтобы сделать всю логику статического поля инъекции.

@Configuration
public class StaticFieldInjectionConfiguration {

    @Inject
    private PersonRepository personRepository;

    @PostConstruct
    private void init() {
        Person.setPersonRepository(personRepository);
    }
}

Comments

    Ничего не найдено.