EJB 3.1. Позволяет ли вводить компоненты в ресурсы, не управляемые контейнером? - PullRequest
4 голосов
/ 23 декабря 2011

Я использую JBoss 6.1 и он не полностью совместим с EJB 3.1. На данный момент я не могу внедрить EJB в мои классы действий Struts (или в любой другой класс, управляемый контейнером, не связанным с Java EE) через @EJB, но будет ли это возможно, когда спецификация EJB 3.1 будет полностью реализована? *

Если нет, то будет ли это слишком невозможным по причинам производительности в обозримом будущем?

Ответы [ 2 ]

4 голосов
/ 23 декабря 2011

Ни один контейнер никогда не сможет внедрить что-либо в неуправляемый объект.

Чтобы иметь возможность внедрить в объект, контейнер должен управлять жизненным циклом объекта или, по крайней мере, участвовать в нем.управление его жизненным циклом, так что он может получить объект на ранней стадии, чтобы выполнить инъекцию.Если объект создается и используется, не подвергаясь воздействию контейнера (как я представляю, компоненты действия Struts), то у контейнера никогда не будет шанса вставить в него что-либо.Контейнер не волшебный - он не может просто обнаруживать объекты, создаваемые по всей JVM, и что-то с ними делать.

В ответе Микко есть хороший список типов объектов, которые можно будет ввести.Если боевые бины не являются одними из тех, я не боюсь, я боюсь.

Теперь, после всего сказанного, в конце туннеля есть свет: вполне возможно написать расширение дляРаспорки, которые обрабатывают инъекцию.Инъекции @EJB и @Resource довольно просто соответствуют конкретным поискам JNDI;расширение может рефлексивно искать аннотированные поля, затем выполнять соответствующий поиск JNDI и вводить результаты.Внедрение CDI еще проще, потому что у него есть API, специально предназначенный для написания расширений.В качестве примера выполнения всего этого взгляните на обогащение для инъекций Stripes , которое добавляет поддержку @EJB, @Resource и @Inject в веб-инфраструктуру Stripes .*

3 голосов
/ 23 декабря 2011

Ожидается, что он будет иметь полную реализацию спецификации.Это объясняется в спецификации Java EE v6 (EJB 3.1 является своего рода под спецификацией одной части Java EE 6).Следующие компоненты могут внедрять (спецификация, классы компонентов):

  • Сервлет: сервлеты, фильтры сервлетов, прослушиватели событий
  • JSP: обработчики тегов, прослушиватели событий библиотеки тегов
  • JSF: управляемые bean-объекты области действия
  • JAX-WS: конечные точки службы, обработчики
  • EJB: bean-компоненты, перехватчики
  • Управляемые компоненты: bean-компоненты
  • CDI: Управляемые bean-компоненты в стиле CDI, декораторы
  • Платформа Java EE: основной класс (статический), обработчик обратного вызова при входе в систему

Более подробно поясняется в упомянутой спецификации, стр. 68-71.

...