基于EJB的应用程序中的依赖性反转

时间:2017-09-19 13:54:01

标签: java java-ee dependency-injection ejb

我想使用依赖性反转和依赖注入来使我的JEE应用程序的某些部分独立于其他部分。以下是主要核心部分的一些代码,它使用 MyService ,但独立于应提供 MyService 实现的其他模块。

public interface MyService {
    public void send(MyObject myObject);
}

@Stateless
@LocalBean
public class MyServiceWrapper implements MyService {

    @Inject
    private MyService myService;

    @Override
    public void send(MyObject myObject) {
        myService.send(myObject);
    }
} 

澄清:

模块A包含类

  • MyObject的,
  • 为MyService,
  • MyServiceWrapper,

模块B包含MyService的实现

我希望 MyServiceWrapper 注入模块B 提供的 MyService 的实施,因此模块A 可以调用使用 MyServiceWrapper 实施 MyService ,但同时模块A 独立于模块B

上面代码的问题是容器不知道应该注入哪个 MyService 实现。

应如何编写 MyServiceWrapper ,因此不会将其注入自身,但会注入正确的实现(在其他模块中提供)?

1 个答案:

答案 0 :(得分:1)

正确的方法是使用所谓的Qualifier,CDI的一个例子是注释@Named,这样就可以消除容器的歧义。

public interface MyService {
void send(MyObject myObject);
}

以及MyService的实施:

@Named("fromModuleA")
@ApplicationScoped
public class MyServiceWrapper implements MyService {

    @Inject
    @Named("fromModuleB")
    private MyService someOtherBean;

    @Override
    public void send(MyObject myObject) {
        this.someOtherBean.send(myObject);
    }
} 

@Named("fromModuleB")
@ApplicationScoped
public class SomeOtherBeanFromModuleB implements MyService{
  @Override
    public void send(MyObject myObject) {
        // implementation
    }
}

@Inject来自一个名为CDI的Java规范(上下文和依赖注入),这个注释与你在EJB或CDI bean上使用它并不重要,但@EJB只能使用EJB容器。另请注意,您至少不再需要界面MyService,但这是对界面进行编码的好习惯。