在 CDI Passivation Capable bean 中,是否可以重新注入而不是钝化不支持钝化的依赖项?
In a CDI Passivation Capable bean, is it possible to have non-passivation capable dependencies be re-injected rather than passivated?
在支持 CDI 钝化的 bean 中,是否可以重新注入而不是钝化不支持钝化的依赖项?
考虑这段代码:
@SessionScoped
public class UserData implements Serializable {
@Inject
private Logger log;
private String data;
}
@ApplicationScoped
public class LoggerFactory {
@Produces
public Logger getLogger(){
...
}
}
public class Logger {
...
}
所以Logger
是不是Serializable
,但我真的不在乎。当 UserData
被反序列化时,是否有可能以某种方式再次调用 Logger
的生产者?
编辑
最初的讨论从这里开始:
http://www.cdi-spec.org/news/2015/07/03/CDI-2_0-EDR1-released/#comment-2119769909
希望CDI专家组提出比@Instance
更好的方法
检查spec,您就有了答案。 Logger
不可序列化,因此 Logger
类型的 bean 不支持钝化。容器未提供您请求的技巧。
解决方案是这样写:
@SessionScoped
public class UserData implements Serializable {
@Inject
private Instance<Logger> logInstance;
private String data;
public Logger getLog() {
return logInstance.get();
}
}
Ans 在您的代码中使用 getLog()
而不是 log
。
在支持 CDI 钝化的 bean 中,是否可以重新注入而不是钝化不支持钝化的依赖项?
考虑这段代码:
@SessionScoped
public class UserData implements Serializable {
@Inject
private Logger log;
private String data;
}
@ApplicationScoped
public class LoggerFactory {
@Produces
public Logger getLogger(){
...
}
}
public class Logger {
...
}
所以Logger
是不是Serializable
,但我真的不在乎。当 UserData
被反序列化时,是否有可能以某种方式再次调用 Logger
的生产者?
编辑
最初的讨论从这里开始:
http://www.cdi-spec.org/news/2015/07/03/CDI-2_0-EDR1-released/#comment-2119769909
希望CDI专家组提出比@Instance
检查spec,您就有了答案。 Logger
不可序列化,因此 Logger
类型的 bean 不支持钝化。容器未提供您请求的技巧。
解决方案是这样写:
@SessionScoped
public class UserData implements Serializable {
@Inject
private Instance<Logger> logInstance;
private String data;
public Logger getLog() {
return logInstance.get();
}
}
Ans 在您的代码中使用 getLog()
而不是 log
。