Java 基于EJB的应用程序中的依赖倒置
我想使用依赖项反转和依赖项注入使JEE应用程序的某些部分独立于其他部分。下面是一些主要核心部分的代码,它使用了MyService,但独立于其他应该提供MyService实现的模块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
public interface MyService {
public void send(MyObject myObject);
}
澄清:
模块A包含类:
- 我的对象
- 我的服务
- MyServiceWrapper
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,我想我可能知道。我在下面编辑了我的答案。