我想使用依赖倒置和依赖注入(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/