EJB3 инстанцирование - PullRequest
       4

EJB3 инстанцирование

4 голосов
/ 28 апреля 2011

У меня есть какой-то тривиальный вопрос.

Если я определил интерфейс EJB3 +, скажем, он удаленный, вот так:

@Remote
public class FooServiceRemote {
   void foo();
}

и одна реализация

@Stateless
public class FooService implements FooServiceRemote {
   void foo() { ... }
}

Как сервер приложений по умолчанию разрешает какую реализацию использовать (и вызывать через прокси), если он знает только аннотацию @EJB для внедрения зависимостей, как в интерфейсе:

public class SomeClass {
   @EJB
   private FooServiceRemote fooService;
}

Это так?сделано отражением (сокращение имени интерфейса)?Или он сканирует возможные реализации такого интерфейса, выбирая один.Или же.. ?А что, если я хочу создать больше реализаций одного интерфейса, возможно ли это и как указать, какую реализацию следует создать (возможно, с помощью некоторого аргумента аннотации).

Спасибо: -)

Ответы [ 2 ]

4 голосов
/ 28 апреля 2011

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

@Stateless(name="FooService1")
public class FooService1 implements FooService { }

@Stateless(name="FooService2")
public class FooService2 implements FooService { }

public class SomeClass {
   @EJB(beanName="FooService1") 
   private FooService fooService;
}

Другие возможные подходы - это поиск с использованием JNDI или свойства mappedName.См. Javadoc для аннотации EJB здесь: http://download.oracle.com/javaee/6/api/javax/ejb/EJB.html

1 голос
/ 28 апреля 2011

Просто исправление,

@Remote
interface FooServiceRemote {
   void foo();
}

@Stateless
public class FooService implements FooServiceRemote {
   void foo() { ... }
}

При этом сервер приложений знает, какие классы реализуют указанный интерфейс.

Если у вас есть два класса, вы должны указать, какой класс вам нужен.

...