性能:效用 class 与 CDI bean

Performance: Utility class vs. CDI bean

我想将常用的应用程序逻辑外部化到一个名为 Helper 的 "utility class" 中。应用程序逻辑需要其他 CDI bean 才能工作。

两种可能性:

一)

@SessionScoped
class ControllerWithCdiBean {

  @Inject
  Helper helper;

  public void doIt() {
      Object result = helpder.calculate();
  }
}

@RequestScoped
class Helper{

  @Inject
  Service anyService;

  public Object calculate() {
     return anyService.calc();
  }
}

b)

@SessionScoped
class ControllerWithStaticCallsViaDeltaspike {

  public void doIt() {
      Object result = Helpder.calculate();
  }
}

class Helper{

  private static Service anyService = BeanProvider.getContextualReference(Service.class);

  public static Object calculate() {
     return anyService.calc();
  }

性能如何?有什么显着差异吗?这两种解决方案对我来说都是可行的,一种解决方案比另一种更好吗?

一个缺点: 每个请求初始化帮助程序。

将您的 Helper class 标记为 @ApplicationScoped。这样,每个应用程序上下文将有一个实例。

不过,如果它只是一个实用程序 class,它根本不应该是托管 bean。我会改为将其标记为 final,定义一个 private 构造函数并将所有方法标记为 static。这是因为它是一个实用程序 class,不需要维护任何状态。