java - 基于 EJB 的应用程序中的依赖关系反转

标签 java jakarta-ee dependency-injection ejb

我想使用依赖倒置和依赖注入(inject)使我的 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 包含类:

  • 我的对象,
  • 我的服务,
  • MyServiceWrapper,

模块 B 包含 MyService 的实现

我希望MyServiceWrapper注入(inject)由模块B提供的MyService实现,以便模块A可以调用使用MyServiceWrapper实现MyService,但同时模块A独立于模块B

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

应该如何编写MyServiceWrapper,这样它就不会被注入(inject)到自身,而是会注入(inject)正确的实现(在其他模块中提供)?

最佳答案

正确的方法是使用所谓的 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 规范(上下文和依赖注入(inject)),使用此注释,无论您在 EJB 还是 CDI bean 上使用它都没有关系,但 @EJB 只能与 EJB 容器一起使用。另请注意,您实际上不再需要接口(interface) MyService ,至少不再需要,但向接口(interface)编写代码是一个很好的做法。

关于java - 基于 EJB 的应用程序中的依赖关系反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46302343/

相关文章:

java - 通过 Javamail 在 MySql 表中存储数据失败

java - GWT客户端和服务器不同的接口(interface)实现

java - Collection.toArray() 和 Collection.toArray(Object obj[]) 的区别

用于 ListView 的 JavaFX 平滑滚动

java - jsf(richfaces)只读输入文本验证

java - 是否可以使用 @RequestParam 从 JSON 转换为域对象

dependency-injection - Flutter:(如何)我可以拥有一个每个都依赖 Provider 的小部件的 PageView 吗?

java - 使用 Spring 引导 play 2.4 Java 应用程序的方法是什么?

java - 如何声明最终的 HashMap 不允许更新或删除元素

oracle - Oracle 会淘汰 10gAS 转而采用 WebLogic 吗?