LoggerProducer.java è una classe usata per la produzione di registratori da iniettare in grani CDI con:Perché @Singleton su @ApplicationScoped in Producers?
@Inject
Logger LOG;
codice completo:
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();
}
}
DOMANDA: può @Singleton
essere girato in modo sicuro in @ApplicationScoped
?
Voglio dire, perché qualcuno dovrebbe voler un EJB qui? Ci sono motivi tecnici, dal momento che non sono coinvolte transazioni e (AFAIK) sarebbe comunque thread-safe?
Mi riferisco ovviamente a javax.enterprise.context.ApplicationScoped
, non a javax.faces.bean.ApplicationScoped
.
HashMap non è disponibile threadsafe –
@SME_Dev ovviamente, il mio errore stava pensando che '@ ApplicationScoped' è, grazie per il commento BTW –
@AndreaLigios puoi chiarire se la tua domanda riguarda' javax.ejb.Singleton' o 'javax.inject.Singleton'? –