Я аннотировал класс с @ApplicationScoped. С @Inject я получаю экземпляры этого класса инжектированных в несколько @RequestScopded услуг JAX-RS:Почему конструктор класса бина CDI называется более одного раза
@ApplicationScoped
public class MySingleton {
MySingleton() {
System.out(this + " created.");
}
}
@RequestScoped
public class MyRS {
@Inject MySingleton mySingleton;
public void someMethod() {
// do something with mySingleton
}
}
В основном это работает отлично. Howeger, по крайней мере, когда я запускаю это в WebSphere 8.5 конструктор MySingleton вызывается дважды, что приводит к выходу, как
[email protected] created.
[email protected] created.
Я планировал сделать некоторые дорогие инициализации в конструкторе, который, очевидно, будет выполнен в два раза.
Я считаю, что один из вызовов конструктора предназначен для создания своего рода прокси-сервера для фактического экземпляра «рабочий». Но как я могу избежать выполнения кода инициализации, выполняемого дважды? «Решение» для ленивой инициализации во всех методах MySingleton не очень привлекательно.
Просто ослепить гадать, но попытаться использовать @ PostConstruct, чтобы узнать, будет ли он дважды вызываться. –
@@ PostConstruct вызывается только один раз, и это именно то, что мне нужно. С этим намеком я также нашел связанный вопрос [why-use-postconstruct]. Если вы опубликуете это как ответ, я приму это. Спасибо, @Adrian. –
Вы должны использовать интерфейсы вместо конкретных классов для ввода. –