У меня есть приложение на основе CDI. Во время выполнения мое приложение генерирует пользовательское событие, которое вызывает перезагрузку компонента. Перезагрузка бина означает просмотр всех бинов и повторную инициализацию уже введенных бинов. Повторная инициализация должна учитывать зависимости bean-компонентов. Например:
class BeanA {
String url;
@PostConstruct
void init(){
url = UrlFactory.getNewUrl()
}
}
class BeanB {
@Inject
BeanA beanA;
@PostConstruct
void init(){
url = beanA.getUrl();
doSomethingWith(url);
}
Следовательно, когда наступает событие, BeanA и BeanB должны быть повторно инициализированы в строгом порядке, поэтому во время повторной инициализации BeanB BeanB уже знает о новом URL-адресе, инициализированном в BeanA. Можно ли это сделать во время выполнения, используя уже существующие инструменты в CDI (что-то вроде Spring: AutowireCapableBeanFactory)? Я обнаружил, что EJB уже имеет аннотацию @DependsOn, которая способна создавать порядок компонентов во время запуска приложения.
Самое грубое решение, которое я придумал, это прослушивание одного из событий CDI во время запуска приложения, сбор всех bean-компонентов и построение графа зависимостей, а во время перезагрузки просмотр этого графа и повторная инициализация. Боюсь, я не знаю о многих подводных камнях, с которыми я могу столкнуться (таких как циклические зависимости, ленивая инициализация (в данном случае она может вообще не работать) и многих других, о которых я не знаю, потому что не имеет довольно хорошее понимание внутренней работы контейнера CDI)
Существуют ли какие-либо другие существующие методы, которые действительно решают мою проблему?
Provider<T>
илиInstance<T>
: подробнее здесь - person Renato   schedule 26.02.2020