В 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, создав прокси-сервер, который будет перехватывать вызов поля (я знаю только о перехватчиках метода и конструктора).