【发布时间】:2015-01-22 02:05:45
【问题描述】:
LoggerProducer.java 是一个用于生成要注入到 CDI bean 中的 Logger 的类:
@Inject
Logger LOG;
完整代码:
import javax.ejb.Singleton;
/**
* @author rveldpau
*/
@Singleton
public class LoggerProducer {
private Map<String, Logger> loggers = new HashMap<>();
@Produces
public Logger getProducer(InjectionPoint ip) {
String key = getKeyFromIp(ip);
if (!loggers.containsKey(key)) {
loggers.put(key, Logger.getLogger(key));
}
return loggers.get(key);
}
private String getKeyFromIp(InjectionPoint ip) {
return ip.getMember().getDeclaringClass().getCanonicalName();
}
}
问题:@Singleton 可以安全地变成@ApplicationScoped 吗?
我的意思是,为什么有人要在这里使用 EJB?是否有技术原因,因为不涉及任何事务,并且(AFAIK)无论如何它都是线程安全的?
我显然指的是javax.enterprise.context.ApplicationScoped,而不是javax.faces.bean.ApplicationScoped。
【问题讨论】:
-
HashMap 不是线程安全的
-
@SME_Dev 当然,我的错误是认为
@ApplicationScoped是,谢谢你的评论顺便说一句 -
@AndreaLigios 你能澄清一下你的问题是关于
javax.ejb.Singleton还是javax.inject.Singleton? -
@johnament javax.ejb.Singleton
-
导入在这里非常重要。 inject 的单例没有 EJB 的单例的品质。
标签: java jakarta-ee thread-safety cdi ejb-3.1