gpt4 book ai didi

java - 基于 EJB 的应用程序中的依赖关系反转

转载 作者:行者123 更新时间:2023-12-02 12:14:26 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com