Зависимости жизненного цикла EJB-компонентов? - PullRequest
0 голосов
/ 27 октября 2018

Я не могу найти в спецификации какое-либо четкое утверждение о том, как внедрение зависимостей с помощью @EJB или @Inject взаимодействует с управлением жизненным циклом бина контейнера.

Я хочу внедрить одноэлементный компонент A в одноэлементный компонент B. Я хочу, чтобы контейнер гарантировал, что A существует к тому времени, когда вызывается метод @PostConstruct B, и продолжает существовать до тех пор, пока не завершится метод B @PreDestroy.

  1. Будет ли @Inject (инъекция CDI) выполнить это?
  2. А как насчет @EJB?
  3. Или мне всегда нужно добавлять @DependsOn?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

CDI и EJB - две разные спецификации.CDI обеспечивает интеграцию, позволяющую вам использовать EJB-компоненты, как если бы они были CDI (но не наоборот!).Обратите внимание, говорите ли вы о CDI или EJB, поскольку не все аннотации применимы ко всем компонентам.Например, @Singleton (EJB) может иметь @Startup, тогда как @ApplicationScoped бин из CDI не может.

Вы упоминаете "синглтон-бин".Просто чтобы рассеять путаницу, в EJB это означает @Singleton, в CDI это означает @ApplicationScoped bean.

При этом, на ваши вопросы:

  1. Will @Inject(Внедрение CDI) выполнить это?

@Inject должно работать так же хорошо, пока вы используете его для создания некруговой зависимости между этими компонентами - например, если вы используете @Inject в конструктореодин компонент, CDI сначала инициирует зависимость, чем этот компонент пытается использовать.Имейте в виду, что CDI инициирует что-то лениво - ничего не произойдет, пока вы на самом деле не попытаетесь использовать этот компонент.

А как насчет @EJB?

Не уверен, что вы здесь имеете в виду - @EJB является эквивалентом EJB @Inject в CDI.

Или мне всегда нужно добавлять @DependsOn?

Это также будет вариант, но, опять же, обратите внимание, что его можно использовать только для EJB @Singleton бинов (что совершенно нормально, просто обозначая здесь разницу между CDI и EJB).

0 голосов
/ 30 октября 2018
  1. Inject (CDI) не является частью спецификации EJB. Это, вероятно, поведение конкретного поставщика. Используйте EJB-инъекцию с EJB. Возможно, эта часть спецификации CDI может помочь: спецификация cdi: связь с другими спецификациями

  2. и 3. См. EJB Spec 3.2, глава 4.8.1: Инициализация одноэлементного сессионного компонента. Вы ничего не сказали об инициализации (с нетерпением или при запуске), поэтому, пожалуйста, обратитесь к документации для подробностей.

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

Обратите внимание, что если одному одноэлементному сессионному компоненту просто нужно вызвать другой одноэлементный сессионный компонент из его метода PostConstruct, явного упорядочения метаданных не требуется. В этом случае первый одноэлементный сессионный компонент будет просто использовать ссылку EJB для вызова целевого одноэлементного сессионного компонента. В этом случае получение ссылки на EJB (с помощью внедрения или поиска) не обязательно подразумевает фактическое создание соответствующего экземпляра сессионного компонента синглтона.

...