查看这段代码:
@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/