Автоматическая инъекция Spring с конструктором через код или аннотации

Учитывая наличие следующих классов:

  • XRepository с объявленным конструктором с 1 аргументом (простым, не автосвязываемым), у него есть некоторые автосвязываемые поля.
  • XService, использующий XRepository в качестве автоматического связывания.
  • XPProcessor использует XService как автосвязывание.

Поэтому мне нужно инициировать XPProcessor во время выполнения для определенного значения, которое будет использоваться в конструкторе XRepository. При разных вызовах у меня будут разные аргументы, поэтому инъекция должна быть во время выполнения. Любая идея, как добиться этого с помощью конфигурации кода или аннотаций?


person Stanislav Trifan    schedule 20.09.2015    source источник
comment
Можете ли вы быть более конкретным? Откуда этот 1 аргумент? Конфигурационный файл?   -  person luboskrnac    schedule 20.09.2015
comment
Нет, получается как часть URL-адреса и может быть изменен при каждом запросе. Также могут быть разными одновременно для разных пользователей.   -  person Stanislav Trifan    schedule 20.09.2015


Ответы (1)


Помните, что Spring необходимо внедрить все параметры конструктора управляемых компонентов Spring.

Я считаю, что у вас есть два варианта:

  1. Проанализируйте информацию об URL-адресе в контроллере и передайте ее через параметры на уровень сохранения. Это был бы мой предпочтительный механизм. Вы можете создать специальный DTO для передачи различной информации и сохранить краткие сигнатуры методов.
  2. Ваша ситуация также может быть решена с помощью компонента области видимости request. Вы создадите один bean-компонент следующим образом:

    @Component
    @Scope("request")
    public class {
        private String urlPart;
    }
    

    И вы бы автоматически подключили этот компонент к XProcessor и XRepository. Каждый запрос к вашему приложению будет создавать новый экземпляр XRequestContext, и вы будете анализировать свою информацию в XProcessor и сохранять ее в XRequestContext.

    В XRepository вы будете использовать экземпляр XRequestContext для получения информации, хранящейся в XProcessor.

    Вы можете прочитать об объеме запроса в Документы Spring. Это похоже на ThreadLocal для каждого потока запросов.

person luboskrnac    schedule 20.09.2015