LoggerProducer.java является класс, используемый для производства Лесорубы, который будет введен в CDI фасоли с:Почему @Singleton над @ApplicationScoped в производителях?
@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', спасибо за комментарий BTW –
@AndreaLigios вы можете уточнить, есть ли у вас вопрос о' javax.ejb.Singleton' или 'javax.inject.Singleton'? –