Как заставить 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), не является Бобом, и если я сделаю его Бобом ничего изменения я все еще не могу использовать переменную, так как класс не будет создан и переменная всегда равна нулю.
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