我想使用依赖性反转和依赖注入来使我的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包含类:
模块B包含MyService的实现。
我希望 MyServiceWrapper 注入模块B 提供的 MyService 的实施,因此模块A 可以调用使用 MyServiceWrapper 实施 MyService ,但同时模块A 独立于模块B 。
上面代码的问题是容器不知道应该注入哪个 MyService 实现。
应如何编写 MyServiceWrapper ,因此不会将其注入自身,但会注入正确的实现(在其他模块中提供)?
答案 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
,但这是对界面进行编码的好习惯。