В CDI нет механизмов, которые позволяли бы упорядочивать инициализацию bean-компонентов в той же области (@ApplicationScoped
в приведенном выше примере).
CDI предоставляет другие возможности для использования:
@Inject @Any Instance<>
- запускается в зависимости от приложения c событий
Пример кода с Instance
:
@ApplicationScoped
public class PollingService {
@Inject
@Any
protected Instance<MessageListener> listeners;
protected void init(@Observes @Initialized(ApplicationScoped.class) Object o) {
for (MessageListener listener : listeners) {
//for each subscribers there's some task to execute.
}
}
}
Здесь есть возможность ввести приоритетную обработку, обнаружив аннотации в фактическом классе listener
, поскольку код обрабатывает список явно.
Пример кода со специфичными для приложения c событиями:
public class PollingServiceInit {
private final PollingService service;
...
public void subscribe(MessageConsumer consumer) {
service.subscribe(consumer);
}
}
@ApplicationScoped
public class PollingService {
@Inject
private Event<PollingServiceInit> event;
protected void init(@Observes @Initialized(ApplicationScoped.class) Object o) {
event.fire(new PollingServiceInit(this));
}
void subscribe(MessageListener listener) {
//for each subscribers there's some task to execute.
}
}
@ApplicationScoped
public class MessageListener {
void onPollingServiceInit(@Observes final PollingServiceInit event) {
event.subscribe(this);
}
}