Компоненты Spring Boot Request с областью действия Autowired, не заполненные - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в Spring Boot, мне нравится использовать только его внедрение зависимостей, не все его самоуверенные фреймворки, но некоторые. Я знаю, что есть другие альтернативы этой функциональности, но я хотел бы узнать больше о Spring.

Я пытаюсь создать bean-компонент с ограниченным объемом запроса и заполнить его регулярной инъекцией зависимостей. Мой план состоит в том, чтобы иметь некоторый объект User, который я могу заполнить, содержащий некоторые настраиваемые бизнес-детали, к которым легко получить доступ, что делает код чистым.

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
class MyBean {
  @Autowired
  lateinit var req: HttpServletRequest

  @Autowired
  lateinit var env: Environment

  @PostConstruct
  fun pc() {
    println("I am constructed $this, $req, $env")
  }

  var a = 3
}


@RestController
class MyController {
    @GetMapping("/api/xyz")
    fun login(m: MyBean): Int {
        println("new bean m")
        return m.a
    }
}

Каждый раз, когда я нажимаю на эту конечную точку, я вижу, что создаются новые объекты. Однако внутренние зависимости не подключаются автоматически, они всегда нулевые. Что я делаю не так? Нужно ли писать фильтр? Но как мне узнать, как найти все конечные точки, которым требуется инициализировать этот компонент? Если я удалю область запроса, переменные инициализируются.

1 Ответ

1 голос
/ 03 августа 2020

RestControllers - это бобы, такие как Components или Services. Таким образом, во всех этих случаях вы должны иметь дело с внедренными зависимостями одинаково.

Возвращаясь к добавленному вами примеру, beans не должен быть параметрами фактических сопоставлений конечных точек. Запрашивание спецификации запроса c информация, такая как заголовки, переменные пути или тело полезной нагрузки, являются кандидатами в качестве аргументов метода сопоставления конечных точек.

Для экземпляра bean-компонента вашего класса MyBean вам лучше использовать переменную-член, введенную напрямую или через конструктор вашего MyController (где рекомендуемый подход - внедрение на основе конструктора).

Не путайте, когда вы вводите свой MyBean, который равен RequestScoped, в конструктор MyController: это полностью задумано и работает. Spring фактически внедряет экземпляр прокси, который будет разрешен в экземпляр c запроса, как только ваш запрос достигнет вызова контроллера.

...