Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于EJB的应用程序中的依赖倒置_Java_Jakarta Ee_Dependency Injection_Ejb - Fatal编程技术网

Java 基于EJB的应用程序中的依赖倒置

Java 基于EJB的应用程序中的依赖倒置,java,jakarta-ee,dependency-injection,ejb,Java,Jakarta Ee,Dependency Injection,Ejb,我想使用依赖项反转和依赖项注入使JEE应用程序的某些部分独立于其他部分。下面是一些主要核心部分的代码,它使用了MyService,但独立于其他应该提供MyService实现的模块 public interface MyService { public void send(MyObject myObject); } 澄清: 模块A包含类: 我的对象 我的服务 MyServiceWrapper 模块B包含MyService的实现 public interface MyService

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

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

澄清:

模块A包含类

  • 我的对象
  • 我的服务
  • MyServiceWrapper
模块B包含MyService的实现

public interface MyService {
    public void send(MyObject myObject);
}
我希望MyServiceWrapper注入了模块B提供的MyService的实现,这样模块A可以使用MyServiceWrapper调用MyService的实现,但同时,模块A独立于模块B

上述代码的问题在于,容器不知道应该注入MyService的哪个实现


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

正确的方法是使用被称为
限定符的
,CDI的一个例子是名为
@的注释
,这将消除容器的歧义

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
来自一个名为(上下文和依赖项注入)的Java规范,有了这个注释,您在EJB或CDIBeans上使用它并不重要,但是@EJB将只与EJB容器一起工作。还要注意的是,您实际上不需要界面
MyService
,至少现在不需要了,但在界面上编写代码是一种很好的做法。

我可以问一下,您为什么要向其自身注入对象吗?除了MyServiceWrapper,还有其他的MyService实现吗?我编辑了这个问题来澄清我的意思。Owkay,我想我可能知道。我在下面编辑了我的答案。