Подтвердить что ты не робот

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

4b9b3361

Ответ 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/