Я преобразовал проект на основе Spring 4.0 из xml в javaconfig.
При инициализации одному из моих bean-компонентов необходимо получить доступ к Hibernate, чтобы получить некоторые данные конфигурации из БД через Spring @Service (buildingService
). Инициализация бина выглядит так:
@Bean
@DependsOn({ "transactionManager", "webSocketHandler", "buildingService" })
Smarty smarty() {
Smarty bean = new Smarty();
bean.init(); // I also tried @Bean(initMethod = "init") with no difference
return bean;
}
Проблема в том, что в bean.init()
осуществляется доступ к службе, которая завершается с ошибкой NullPointerException
.
Я добавил buildingService
к @DependsOn
, но это не помогло.
Вероятно, классы с аннотациями @Service
обрабатываются после @Bean
!?
Могу ли я заранее инициализировать класс с аннотациями @Service
?
Изменить 1
Спасибо за все отзывы!
Мне нужно добавить некоторые детали:
BuildingService — это не @Bean
, это, ну, @Service
и выглядит так:
@Service("buildingService")
@Transactional
public class BuildingService {
...
public List<Building> getAll() {
final Session session = sessionFactory.getCurrentSession();
final Query query = session.createQuery("from Building order by name");
return query.list();
}
...
}
Smarty — это управляемый компонент Spring, инициализированный в классе с аннотацией @Configuration
, который выполняет инициализацию корневого контекста.
Smarty имеет прямую зависимость от buildingService, например:
@Resource(name = "buildingService")
private BuildingService buildingService;
Я попытался аннотировать Smarty.init()
с помощью @PostConstruct
, но это ничего не изменило.
Обратите внимание, что первое, что делает Smarty.init()
, — это звонит buildingService.getAll();
.