CDI注入和序列化

时间:2012-06-26 16:24:06

标签: logging cdi code-injection

我正在考虑为slf4j logger使用CDI注入,所以我创建了一个生产者。

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

@ApplicationScoped
public final class CurrentApplicationBean implements Serializable {
    @Inject
    private transient Logger          logger;
}

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

我认为CDI没有处理这个问题,你知道什么?

此外,提供程序始终提供新的Logger实例,因为它必须从InjectionPoint设置记录器名称,这意味着RequestScoped bean具有自己的记录器实例而不是静态每级记录器。

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

如果你的制作人方法类似于以下

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

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

  

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

这是你的选择。