Kon*_*rus 12 java spring hibernate
在@Configuration
类中使用工厂bean的正确方法是什么?
假设我有以下内容SessionFactory
:
@Bean
public AnnotationSessionFactoryBean sessionFactory() {
AnnotationSessionFactoryBean factory = new AnnotationSessionFactoryBean();
// set up properties etc.
return factory;
}
Run Code Online (Sandbox Code Playgroud)
现在这个方法返回一个没有实现的bean工厂SessionFactory
.如果我在另一个bean中使用@Autowired
as SessionFactory
,它可以正常工作并从bean工厂获取它:
@Controller
public class MyController {
@Autowired SessionFactory sessionFactory;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我想那没关系.
但是,如果我想SessionFactory
在同一个配置类中使用它,它就成了一个问题:
@Bean
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager man = new HibernateTransactionManager();
// Ideal - doesn't work because sessionFactory() return type doesn't match:
// SessionFactory sessionFactory = sessionFactory();
// Is this one correct?
// SessionFactory sessionFactory = (SessionFactory) sessionFactory().getObject();
man.setSessionFactory(sessionFactory);
return man;
}
Run Code Online (Sandbox Code Playgroud)
实现这种依赖的正确方法是什么?
Tom*_*icz 21
@Configuration
方法仍然比较新鲜,并且有一些粗糙的边缘.工厂豆是其中之一.所以没有正确的方法,至少我不知道.也许未来的Spring版本会以某种方式处理这个案例.现在,这是我的首选方式:
@Bean
public AnnotationSessionFactoryBean sessionFactoryBean() {
AnnotationSessionFactoryBean factory = new AnnotationSessionFactoryBean();
// set up properties etc.
return factory;
}
@Bean
public SessionFactory sessionFactory() {
return (SessionFactory) sessionFactoryBean().getObject();
}
Run Code Online (Sandbox Code Playgroud)
并sessionFactory()
在需要时使用方法.如果sessionFactoryBean().getObject()
由于某种原因想要多次调用(例如,当FactoryBean
不返回单例时),请记住使用@Scope
注释.否则Spring将确保sessionFactory()
仅调用一次并缓存结果.
Spring足够智能,可以在调用@Bean
方法之后和返回bean本身之前执行所有必需的初始化.所以InitializingBean
,DisposableBean
,@PostConstruct
,等都是认可和妥善处理.事实上,我总是发现afterPropertiesSet
有点像黑客,因为它是容器的责任.
另外,在Spring数据存储文档 - 参考文档中建议了第二种方法,乍一看看起来有些不一致,但效果很好:
@Resource
private Mongo mongo;
@Bean
MongoFactoryBean mongo() {
return new MongoFactoryBean();
}
Run Code Online (Sandbox Code Playgroud)
因此,工厂是使用@Bean
方法创建的,但工厂创建的bean可以使用自动装配字段获得.聪明.
归档时间: |
|
查看次数: |
15257 次 |
最近记录: |