Я считаю, что интерфейс FactoryBean - хорошая альтернатива для вас. Это очень хороший выбор, когда вам нужно выполнить некоторую логику инициализации. Например, чтобы запустить базу данных в памяти или некоторые фоновые процессы в отдельных потоках.
Подробнее об этом можно прочитать в справочной документации .
Пример, демонстрирующий, как я создаю экземпляр базы данных и возвращаю источник данных каждый раз, когда кто-то хочет bean-компонент из реализации FactoryBean.
@PostConstruct
void init() {
embeddedDatabase = new EmbeddedDatabaseBuilder().addScript(schemaPath)
.addScript(dataPath).setType(embeddedDatabaseType).build();
}
public DataSource getObject() throws Exception {
return embeddedDatabase;
}
Это обеспечивает слабую связь между заводской логикой и возвращаемым объектом. Он интенсивно используется в среде Spring.
Если вы хотите, чтобы он был инициализирован при первом использовании, установите для lazy-initialization значение true.
Другая альтернатива, если вы хотите, чтобы ваш код взаимодействовал с контейнером Spring, - это создание фабрики, реализующей интерфейс ApplicationContextAware
. Тогда вы можете сделать что-то вроде этого:
myDao = context.getBean(MyDao.class);