Инъекция Java EE 6 для создания различных стратегий - PullRequest
3 голосов
/ 29 июня 2011

Скажите, что у меня есть класс Controller со стратегией свойств типа IStrategy.В Spring я могу создавать разные экземпляры Controller и внедрять разные реализации стратегии, определяя bean-компоненты в файле конфигурации xml, как показано ниже:

<bean id="strategyAController" class="com.test.Controller"> 
    <property name="strategy" ref="strategyAImpl">
</bean>

<bean id="strategyBController" class="com.test.Controller"> 
    <property name="strategy" ref="strategyBImpl">
</bean>

<bean id="strategycController" class="com.test.Controller"> 
    <property name="strategy" ref="strategycImpl">
</bean>

Затем я могу ссылаться на эти bean-компоненты с помощью @Autowired и @Qualifier ("стратегииAController).") и т. д. Что является эквивалентным способом сделать это в Java EE 6

Ответы [ 3 ]

4 голосов
/ 29 июня 2011

Забавно, вы должны спросить!Гэвин Кинг, который разработал Java EE 6 CDI, вступил в неприятную борьбу с кем-то из тех же проблем.

http://www.tsolak.com/?p=59

Код Spring, конечно, выглядит ужасно, как Java.Мы можем сделать это в Java - создать некоторые переменные, установить некоторые свойства, не важно.Мне любопытно, в чем ваше приложение, в чём состоит из простого Java?Какую конкретную выгоду вы получаете от Spring для этих бобов?

1 голос
/ 29 июня 2011

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

1 голос
/ 29 июня 2011

В CDI вы можете использовать Qualifer, чтобы идентифицировать различные экземпляры и методы производителя, чтобы предоставить эти экземпляры.

public class  ControllerFactory {

  @Produces
  @StrategyA
  public Controller createControllerA {
      return new Controller(configA);
  }

  @Produces
  @StrategyB
  public Controller createControllerB {
      return new Controller(configB);
  }
}

@StrategyB
@Inject
Controller howToAccessIt;

Если вам не нравится создавать новую StrategyA/B/C Аннотация для каждой стратегии, вы можетеиспользуйте одну аннотацию с полем (например, Enum), которое идентифицирует стратегию.Чтобы вы могли написать: @Strategy(StratType.A).

Затем вы можете использовать InjectionPoint в своем методе продюсера, чтобы вы могли создавать экземпляр в зависимости от аннотации в общем виде вместо написания новогометод производителя для каждой стратегии:

@Produces
//must add a Annotation to clarify that this producer produces for all Strategies!
public Controller createController(InjetionPoint ip) {
    Annotated annotated = ip.getAnnotated(); 
    if (annotated.isAnnotationPresent(Strategy.class)) {
       Strategy stragtegyAnnotation = (Strategy) annotated.getAnnotation(Strategy.class);
       switch(stragtegyAnnotation.value) {
          case A: return new Controller(configA);
          ...
       }
    }
}
...