LoggerProducer.java là một lớp được sử dụng để sản xuất Loggers được tiêm trong đậu CDI với:Tại sao @Singleton trên @ApplicationScoped in Producers?
@Inject
Logger LOG;
Full mã:
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();
}
}
HỎI: có thể @Singleton
được một cách an toàn biến thành @ApplicationScoped
?
Ý tôi là, tại sao mọi người lại muốn có EJB ở đây? Có lý do kỹ thuật nào không, vì không có giao dịch nào có liên quan, và (AFAIK) nó có an toàn không?
Tôi rõ ràng đang đề cập đến javax.enterprise.context.ApplicationScoped
, không phải là javax.faces.bean.ApplicationScoped
.
HashMap không threadsafe –
@SME_Dev tất nhiên, lỗi của tôi đã nghĩ rằng '@ ApplicationScoped' là, cảm ơn cho các bình luận BTW –
@AndreaLigios bạn có thể làm rõ cho dù câu hỏi của bạn là về' javax.ejb.Singleton' hoặc 'javax.inject.Singleton'? –