2012-06-26 72 views
4

我正在考虑使用CDI注射SLF4J记录器,所以我创建了一个制片人。CDI注入和系列化

我将其注入的ApplicationScoped豆这是序列化:

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

它必须是短暂的,因为org.slf4j.Logger是不延伸Serializable的接口,但是这意味着该记录器必须重新反序列化后注入。

我认为,CDI不处理,什么是你的知识?

此外,供应商总是会提供一个新的Logger实例怎么一回事,因为它必须从InjectionPoint设置记录器的名字,这意味着RequestScoped豆有自己的记录器实例,而不是每个类记录静态。

也许记录不是CDI注入了良好的背景下...你有什么考虑?

+0

虽然org.slf4j.Logger未标记为向后兼容的原因为可序列化,若大部分的org.slf4j.Logger不是所有实际实现的序列化。请参阅http://glauche.de/2009/08/24/ – Ceki

+0

>>我认为CDI不处理这个问题,你知道什么 不,不。 >>也许记录不是CDI注入 这是一个很大的背景下:)你原来的代码应该有警告编好的情况下,你应该就好 –

回答

1

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

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

这意味着RequestScoped豆每班记录静态的自己记录器实例,而不是

如果你的生产方法是像下面

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

的LoggerFactory.getLogger( )正在为每个班级创建一个记录器。

也许日志记录不是CDI注入的好上下文......您有什么注意事项?

这是你的选择。

+1

的CDI代理是序列化的。但是,试图注入的非序列化类成CDI豆可能成为钝化时,您将获得在启动时的异常:“”不能生产用于注射非序列化的情况下进入钝化豆非瞬态字段'。所以这里的建议是将该领域标记为瞬态的,这实际上在钝化/激活之后引起问题。 – MrD