簡體   English   中英

基於EJB的應用程序中的依賴反轉

[英]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包含類

  • 為MyObject,
  • 為MyService,
  • MyServiceWrapper,

模塊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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM