Как сделать spring значение вставки в статическое поле
Я знаю, это может выглядеть как ранее заданный вопрос, но я столкнулся с другой проблемой здесь.
У меня есть класс утилиты, который имеет только статические методы. Я этого не делаю, и я не буду принимать экземпляр из него.
public class Utils{
private static Properties dataBaseAttr;
public static void methodA(){
}
public static void methodB(){
}
}
Теперь мне нужно Spring заполнить dataBaseAttr атрибутами базы данных Properties.Spring config:
<?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>
Я уже сделал это в другом beans, но проблема здесь в этом классе (Utils) не является bean, и если я сделаю это bean, ничего не изменится, я все еще не могу использовать переменную, поскольку класс не будет создан и переменная всегда равна нулю.
Ответы
Ответ 1
У вас есть две возможности:
В первом варианте у вас есть bean с обычным сеттером, но вместо установки свойства экземпляра вы устанавливаете статическое свойство /field.
public void setTheProperty(Object value) {
foo.bar.Class.STATIC_VALUE = value;
}
но для этого вам нужно иметь экземпляр bean, который будет выставлять этот сеттер (более похожим на обходной путь).
Во втором случае это будет сделано следующим образом:
<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>
Ответ 2
У меня было аналогичное требование: мне нужно было внедрить Spring -установленный репозиторий 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
singleton в статическое поле класса Person
?
Я создал a @Configuration
, который получает в Spring время построения ApplicationContext. Это @Configuration
получает все эти beans, которые мне нужно вводить как статические поля в другие классы. Затем с помощью аннотации @PostConstruct
я поймаю крючок, чтобы выполнить всю статическую логику ввода поля.
@Configuration
public class StaticFieldInjectionConfiguration {
@Inject
private PersonRepository personRepository;
@PostConstruct
private void init() {
Person.setPersonRepository(personRepository);
}
}
Ответ 3
Поскольку эти ответы старые, этот мне понравился и очень чистый, он работает только с java-аннотациями:
Чтобы исправить это, создайте "без статического установщика", чтобы назначить введенное значение для статической переменной. Например:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class GlobalValue {
public static String DATABASE;
@Value("${mongodb.db}")
public void setDatabase(String db) {
DATABASE = db;
}
}
https://www.mkyong.com/spring/spring-inject-a-value-into-static-variables/