Создание значения динамического поля Spring во время выполнения (аналог CDI @Produces) - PullRequest
0 голосов
/ 03 апреля 2019

В CDI мы можем создать продюсера, который будет вызываться для конкретной InjectionPoint:

@ApplicationScoped
public class IntProducer implements Serializable {

    @Produces @MyCustomAnnotation
    Integer getInt(InjectionPoint injectionPoint) {
        return someConfigurationMap.getDynamicallyChangedInt();
    }
}

и этот производитель можно использовать здесь:

class MyBean {

   @MyCustomAnnotation
   @Inject
   int myIntProp;
}

Когда клиент вызывает свойство myIntProp, будет вызван продюсер. Таким образом, каждый раз myIntProp изменяется в someConfigurationMap, клиент, который использует MyBean, получает новое свойство.

Можно ли сделать то же самое в Spring (либо с помощью пользовательской аннотации, либо @Value). Что я знаю, так это то, что все значения вводятся в bean-компоненты при запуске приложения. И если нам нужно изменить какое-либо значение поля, то мы можем перебрать все наши bean-компоненты и повторно ввести измененные значения поля, используя отражение. Или, возможно, можно использовать AOP, создав прокси-сервер, который будет перехватывать вызов поля (я знаю только о перехватчиках метода и конструктора).

...