2015-03-02 51 views
0

我想将常用的applicationlogic外部化为一个名为Helper的“工具类”。 applicationlogic需要其他CDI bean才能工作。性能:工具类与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(); 
    } 

什么性能?有什么显着的差异?这两种解决方案对我来说都是可能的,比其他解决方案更好

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

+0

我会去** **。实用程序类是邪恶的 – 2015-03-02 16:23:32

+0

@SvetlinZarev你的意思是类像java.util.Arrays',java.util.Collections'和整个Apache Commons Xyz库是邪恶的?你当然从来没有用过他们:) – 2015-03-02 16:29:22

+0

@LuiggiMendoza有区别。 'Arrays'和'Collections'带有JRE,而'Helper'不带。同样,过多使用静态方法(因此实用程序类)会导致程序代码并使其很难测试。过度使用效用类违反了OOP和TDD的原则,应尽可能避免使用这种原则,并且在OP的情况下,它绝对不可能使用实用类。 – 2015-03-02 17:14:56

回答

1

将您的Helper类标记为@ApplicationScoped。有了这个,你将在每个应用程序上下文中有一个实例。

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

+0

由于我只向CDI bean注入一个引用(= proxy)一次并让它在Helper的整个lefetime中出现,所以可能会出现“private static Service anyService”问题? – Ginkgochris 2015-03-02 16:27:52

+0

然后你没有一个实用工具类,而是一个代理类。如果这是您的目的,请使用方法A并将您的代理标记为“@ ApplicationScoped”。 – 2015-03-02 16:31:17

+0

Apache Commons Xyz课程绝对有帮助......但毕竟,我认为,我的_Helper_不仅仅是这个。它包含“更多”逻辑,在所有情况下都不可重用。所以我宁愿采用方法a)并使其成为@ApplicationScoped。这对组件测试具有优势,尽管有像Powermock这样的框架可以很容易地测试静态方法。 – Ginkgochris 2015-03-03 10:26:13