Я пытаюсь ввести объект-регистратор в класс, который реализован после одноэлементного подхода.Использование CDI в одноэлементном шаблоне
код выглядит почти так:
Logger
класс:
public class LoggerFactory {
@Produces
public Logger getLogger(InjectionPoint caller){
return Logger.getLogger(caller.getMember().getDeclaringClass().getName());
}
}
Затем я создаю класс, который нуждается в логгер и реализующий Singleton Pattern:
public class MySingleton{
@Inject
private Logger logger;
private MySingleton instance;
/*
* Private constructor for singleton implementation
*/
private MySingleton(){
logger.info("Creating one and only one instance here!");
}
public MySingleton getInstance(){
if(instance == null) {
instance = new MySingleton();
}
return instance;
}
}
Если я запустил код (на Glassfish 3.1.2.2), я получаю NPE как только я попытаюсь использовать регистратор. Что я делаю неправильно (beans.xml
файл на месте)? Я также попытался использовать @Inject
с методом setter для объекта Logger
, но не повезло.
Инъекции происходят после конструкции. Таким образом, вы не можете использовать его в конструкторе. –
Почему вы используете синглтон вместо инъекции, если вам это нужно, и пусть CDI делает его однобортным компонентом? –
Я не знаю много о CDI, но разве вы не должны использовать ваш инжектор для создания своего объекта? С Spring инъекция выполняется только при создании объекта с использованием контекста приложения и с помощью Guice только при использовании инжектора. –