[英]Dependency inversion in EJB based application
我想使用依賴關系反轉和依賴關系注入來使我的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 ,這樣就不會將其注入自身,而是將注入適當的實現(在其他模塊中提供)?
正確的方法是使用所謂的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
來自Java規范CDI (上下文和依賴項注入),帶有此批注並不重要,無論您在EJB還是CDI Bean上使用它,但@EJB僅與EJB容器一起使用。 還要注意,您真的不再需要Interface MyService
了,但這是對接口進行編碼的一種好習慣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.