java - 通过 CDI 注入(inject)记录器,一种反模式?

标签 java design-patterns ejb instance cdi

查看这段代码:

@Stateless
public class AStatelessEJB {

@Inject
private Logger logger;

(...)

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

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

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

最佳答案

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

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

优点:

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

缺点:

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

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

关于java - 通过 CDI 注入(inject)记录器,一种反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57497729/

相关文章:

java - 两个 JVM 上的单例

transactions - EJB 中的容器管理事务

java - 当没有调用 @Remove 注释方法时,有状态 session bean 会导致泄漏吗?

servlets - javax.ejb.EJBException : Illegal non-business method access on no-interface view

java - 排除 Maven 中的目标

c++ - 解释器模式中的错误处理

java - 模拟持久化类返回 IllegalArgumentException

c# - 在 NHibernate 中使用哪种算法处理多对多关系

java - 在 Eclipse 中查看 gcmv 使用的堆数量?

java - Eclipse 中调试器的基本 Java 程序崩溃