通过CDI注入日志记录器,是一种反模式吗?

4

看这段代码:

@Stateless
public class AStatelessEJB {

@Inject
private Logger logger;

(...)

为什么logger(通常是final和static的)会被CDI注入到无状态EJB中(作为实例变量)?
是否有任何优点?或者只有缺点,如:
- CDI查找的开销(每个bean初始化一次) - CDI初始化的开销(每个bean初始化一次) - CDI注入的开销(每个bean初始化一次) - 垃圾收集器清理的开销(每次销毁bean时)

3
好的,我会尽力进行翻译。以下是需要翻译的内容:related: https://www.slf4j.org/faq.html#declared_static - jaco0646
许多人已经忘记了,你可以在不使用注释的情况下编写代码 :-P。只有缺点,但CDI粉丝肯定会制造一些优点;-) - Gas
2个回答

1

从性能角度来看,没有太大的差别,但静态初始化通常比托管bean更好。

通常,CDI需要在应用程序初始化和上下文实例创建时进行一些额外的处理。它需要在生产者方法/类中添加几行代码,但可以提供易于使用和某种灵活性。顺便说一下,使用CDI可以通过最小的生产者方法管理类或应用程序的一个实例。

优点:

  • 易于提供对常见日志框架的抽象
  • 易于添加对其他功能(如国际化和本地化)的支持
  • 易于使用(像使用注释一样简单)
  • 易于管理多个实现/配置(像使用多个限定符一样简单)
  • 标准化使用(与其他字段类似)

缺点:

  • 额外的最小处理成本
  • 其他工具(如Lombok)提供易于使用并提供注释配置(在编译时和静态方式中)。
  • 通常不需要为日志添加其他功能(如国际化/本地化)。
在我看来,总的来说,我更喜欢使用静态字段,但如果您想要一定程度的抽象、提供附加功能、提供多个Logger实现/配置或为开发人员提供易于使用的东西,则使用CDI bean也不是坏习惯。

0

我认为Ariel的回答是正确的。我想补充一下,您可能对CDI的工作原理有基本的误解:CDI不直接注入bean,也不为每个注入点实例化bean。CDI注入代理,代理具有对真实bean的引用。这些代理非常便宜且易于垃圾回收。SL4J也经过池化和优化,以快速查找记录器。结合这两者,可能会影响应用程序的先前项远远超过非常轻量级的CDI注入。

在进行任何性能测试时,首要规则是使用分析器。我认为获得一个良好的测试设置,可以评估您的假设是关键。话虽如此,我认为CDI注入很可能会更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接