CDI注入和序列化

mor*_*y76 5 logging code-injection cdi

我正在考虑对 slf4j 记录器使用 CDI 注入,所以我创建了一个生产者。

我将它注入到一个ApplicationScoped可序列化的bean 中:

@ApplicationScoped
public final class CurrentApplicationBean implements Serializable {
    @Inject
    private transient Logger          logger;
}
Run Code Online (Sandbox Code Playgroud)

它必须是瞬态的,因为它org.slf4j.Logger是一个不扩展的接口Serializable,但这意味着必须在反序列化后重新注入记录器。

我认为 CDI 不处理这个,你有什么知识?

此外,提供者总是提供一个新Logger实例,因为它必须从 设置记录器名称InjectionPoint,这意味着RequestScopedbean 有自己的记录器实例,而不是每个类的静态记录器。

也许日志记录不是 CDI 注入的好环境……你有什么考虑?

小智 1

但这意味着记录器必须在反序列化后重新注入。

CDI 容器代理是可序列化的。反序列化时,代理定位/绑定到正确的注入。我不会不将注入点标记为瞬态;因为这会阻止容器定位/重新绑定注入并导致 NPE。

这意味着 RequestScoped bean 有自己的记录器实例,而不是每个类的静态记录器

如果您的生产者方法类似于以下内容

@RequestScoped
@Produces   
public Logger produceLog(InjectionPoint injectionPoint) {   
    return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());   
}
Run Code Online (Sandbox Code Playgroud)

LoggerFactory.getLogger() 为每个类创建一个记录器。

也许日志记录对于 CDI 注入来说不是一个好的上下文......您有什么考虑因素?

这是你的选择。