Spring-Boot: делить объект между компонентами - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть пользовательский объект, который мне нравится делить между различными компонентами Spring-Boot (например, WebHandler, Authenticator, Filter).

Возможно, самый простой способ - это объект stati c в основном классе но это не очень элегантно.

Какой самый распространенный способ сделать это?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Весь смысл Spring как контейнера заключается в управлении вашими объектами.

Теперь у статики нет четко определенного жизненного цикла (когда создается именно этот объект, кто его удаляет, когда приложение закрывается, и т. Д. c)

Speing отвечает на все эти вопросы, используя методы инъекции зависимости. Если вы уже используете Spring, то вам следует определить этот «общий объект» как Spring Bean (по умолчанию он будет иметь объем синглтона, такой же как у stati c объекта, который вы предложили, но который управляется контейнером Spring, который лучше - это будет управлять жизненным циклом объекта самостоятельно)

Затем, учитывая, что классы, которые должны зависеть от объекта, сами являются компонентами, вы можете добавить этот компонент:

class MySharedObject {}

class MyWebHandler implementsWebHandler {
  private final MySharedObject mySharedObject;

public MyWebHandler(MySharedObject mySharedObject) {
  this.mySharedObject = mySharedObject;

В дополнение к Таким образом, управление жизненным циклом позволяет легко выполнять модульное тестирование классов, использующих общий объект (в данном случае, например, «MyWebHandler»), - теперь вы можете создать заглушку / макет общего объекта и передать его в обработчик - то, что на самом деле не может быть легко сделано при использовании статики

Итак, если вы можете использовать spring и определить ее как bean-компонент - во что бы то ни стало, использование статики не рекомендуется, если у вас уже есть контейнер внедрения зависимостей

1 голос
/ 20 апреля 2020

Если у вас общий объект, в первую очередь он не должен содержать никакого состояния, так как разные компоненты могут его изменить, а также он должен быть потокобезопасным. Можно повторно использовать его во всех компонентах с помощью аннотации @Autowired, но вы должны быть уверены, что это потокобезопасно. Синглтон Spring Spring bean не является поточно-ориентированным, это зависит от того, как вы пишете код.

Вы можете использовать как метод stati c, но это зависит от логики c, которая у вас есть, и от того, имеет ли этот компонент зависимость от других объектов и если они нужны весной IO C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...