@Configuration
подход все еще относительно свежий и имеет некоторые неровные края. Фабричные бобы являются одним из них. Так что это не Правильный путь , по крайней мере, я не знаю ни о чем. Возможно, будущие релизы Spring как-то справятся с этим делом. На данный момент это мой предпочтительный способ:
@Bean
public AnnotationSessionFactoryBean sessionFactoryBean() {
AnnotationSessionFactoryBean factory = new AnnotationSessionFactoryBean();
// set up properties etc.
return factory;
}
@Bean
public SessionFactory sessionFactory() {
return (SessionFactory) sessionFactoryBean().getObject();
}
И используйте метод sessionFactory()
всякий раз, когда это необходимо. Если по какой-то причине вы хотите вызвать sessionFactoryBean().getObject()
несколько раз (например, когда FactoryBean
не возвращает синглтоны), не забудьте использовать аннотацию @Scope
. В противном случае Spring проверит, что sessionFactory()
вызывается только один раз, и кеширует результат.
Spring достаточно умен, чтобы выполнить всю необходимую инициализацию после вызова метода @Bean
и перед возвратом самого компонента. Так что InitializingBean
, DisposableBean
, @PostConstruct
и т. Д. Все распознаются и обрабатываются должным образом. На самом деле, я всегда находил вызов afterPropertiesSet
чем-то вроде хака, потому что это ответственность контейнера.
Также есть второй метод, рекомендованный в Spring Datastore Document - Справочная документация , который на первый взгляд выглядит немного противоречивым, но прекрасно работает:
@Resource
private Mongo mongo;
@Bean
MongoFactoryBean mongo() {
return new MongoFactoryBean();
}
Таким образом, фабрика создается с помощью метода @Bean
, но созданный фабрикой компонент может быть получен с помощью поля с автопроводкой. Clever.