【问题标题】:Inject logger by CDI, an anti-pattern?通过 CDI 注入记录器,一种反模式?
【发布时间】:2019-08-14 15:26:24
【问题描述】:

看这段代码:

@Stateless
public class AStatelessEJB {

@Inject
private Logger logger;

(...)

为什么 CDI 将记录器(通常是最终的和静态的)注入到无状态 EJB(作为实例变量)?

有什么优势吗?或者只有缺点,例如:

  • CDI 查找开销(每个 bean 初始化)
  • CDI 初始化开销(每个 bean 初始化)
  • CDI 注入开销(每个 bean 初始化)
  • 垃圾收集器清理的开销(每次 bean 被销毁)

【问题讨论】:

  • 许多人已经忘记了您可以在不使用注释的情况下进行编码:-P。只有缺点,但 CDI 粉丝肯定会创造一些优点 ;-)

标签: java design-patterns ejb instance cdi


【解决方案1】:

如果你从性能的角度来评估它......没有太大的区别,但静态初始化通常比托管 bean 更好。

通常,CDI 在应用程序初始化和上下文实例创建时需要更多处理。它需要在生产者方法/类中增加几行代码,但会提供易用性和某种灵活性。顺便说一句,使用 CDI,您可以使用最少的生产者方法为每个类或应用程序管理一个实例。

优点:

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

缺点:

  • 额外的最低处理成本
  • Lo​​mbok 等其他工具易于使用并提供注释配置(在编译时以静态方式)。
  • 通常不需要额外的日志功能(如国际化/本地化)。

在我的观点和总结中,我更喜欢使用静态字段,但如果您想要某个抽象点、提供附加功能、提供多个 Logger 实现/配置或提供一些易于使用的东西,使用 cdi bean 并不是一个坏习惯供开发人员使用。

【讨论】:

    【解决方案2】:

    我认为爱丽儿的回答是正确的。我想补充一点,您可能对 CDI 的工作原理有一个基本的误解:CDI 不会直接注入 bean,也不会为每个注入点实例化 bean。 CDI 注入代理,这些代理具有对真实 bean 的引用。这些代理的创建和 gc 非常便宜。 SL4J 还为快速记录器查找进行了汇集和优化。结合这两者,与非常轻量级的 CDI 注入相比,可能有更多以前的项目会影响您的应用程序。

    在进行任何性能测试时,第一条规则是使用分析器。我认为让自己有一个好的测试设置可以评估你的假设是关键。话虽如此,我认为 CDI 注入可能会同样快或更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 2012-09-12
      相关资源
      最近更新 更多