Нужна помощь с пружинным автоуведомлением и областями.Spring @Autowired - Создать новый bean-компонент
Вот основная структура приложения:
У меня есть CustomHttpClient, аннотированный, как @Component, а также вытягивать некоторые конфигурационные свойства, связанные с application.properties файла (через @value аннотацию).
CustomHttpClient используется несколькими службами в моем приложении. Всякий раз, когда я использую CustomHttpClient, я autowire экземпляр, который с помощью:
@Autowired private CustomHttpClient httpClient;
Я использую перехватчик для изменения некоторых переменных внутри CustomHttpClient, например, так:
public class MyInterceptor extends HandlerInterceptorAdapter { @Autowired CustomHttpClient httpClient; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { httpClient.setSomeProperty(newValue); ...
сейчас , вот в чем проблема. Если у меня все настроено так, как описано выше, то всякий раз, когда я изменяю любой параметр CustomHttpClient через перехватчик, это новое значение сохраняется для всех других клиентов, пока работает VM. Поэтому, когда я запускаю httpClient.setSomeProperty(), этот параметр теперь сохраняется навсегда. Даже если я подключаюсь к приложению от другого клиента.
В основном то, что мне нужно иметь две вещи:
- Еще будучи в состоянии переопределить настройки по умолчанию с помощью CustomHttpClient перехватчик (запрос перехватчик, сконфигурированные с помощью).
- Убедитесь, что для каждого запроса создается новый экземпляр CustomHttpClient (после того, как перехватчик делает свое «волшебство»).
Я попытался изменить область CustomHttpClient на @Scope («прототип»), но таким образом я больше не могу изменять настройки CustomHttpClient с помощью перехватчика.
Возможно, я ошибаюсь, но я думаю, что дизайн, вероятно, испорчен, если вам нужна инъекция для этого прототипического многоразового компонента, свойства которого необходимо изменить для каждого запроса. Возможно, лучше всего, если вы контролируете создание и уничтожение вручную. В конце концов, не все объекты должны быть введены. –
Хммм, это может быть хорошим моментом. Но если я не буду автоувеличивать и не вставлять компонент, смогу ли я все же отрегулировать его свойства с помощью перехватчика? Допустим, у меня нет контроля над фактическим сервисом, который использует этот компонент, и может изменять только некоторые свойства через HTTP-заголовки и/или параметры строки запроса. Это была основная причина, по которой я ездил с автоматом. – isyndicate
Если вам просто нужно настроить заголовки и/или параметры, почему бы вам просто не изменить «HttpServletRequest' /' HttpServletResponse »? Вот почему они доступны вам в перехватчике. – Aurand