性能:效用 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,不需要维护任何状态。
我想将常用的应用程序逻辑外部化到一个名为 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,不需要维护任何状态。