即使没有可用的 SessionFactory 实例,Spring @Autowired 如何绑定 SessionFactory 对象
How Spring @Autowired binds the SessionFactory object even if there is no SessionFactory instance available
我正在使用基于 Java 配置的 Hibernate 和 Spring。我的配置文件是这个:
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(s);
return txManager;
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] { "dto" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
工作正常。这没问题,但是当我手动尝试为 trasactionManager
设置 sessionfactory
参数时,如下所示:
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory());
return txManager;
}
IDE 正在显示:
`The method setSessionFactory(SessionFactory) in the type HibernateTransactionManager is not applicable for the arguments (LocalSessionFactoryBean)`
所以,我创建了一个如下所示的 sessionFactory
@Bean
@Autowired
public SessionFactory sessionFactory(DataSource dataSource) {
LocalSessionFactoryBuilder sessionFactory = new LocalSessionFactoryBuilder(dataSource);
sessionFactory.addProperties(hibernateProperties());
sessionFactory.scanPackages("dto");
return sessionFactory.buildSessionFactory();
}
并传递给 trasactionManager
它起作用了。
我的问题是,即使第一种方法中没有 sessionFactory
实例,spring 如何自动装配 sessionFactory 对象?
您需要将方法 return 类型从 SessionFactory
更改为 HibernateTransactionManager
。
它应该是这样的:
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(s);
return txManager;
}
@Bean
public SessionFactory sessionFactory() {
Properties properties = new Properties();
properties.setProperty("hibernate.show_sql", "true")
properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory")
properties.setProperty("hibernate.cache.use_query_cache", "true")
properties.setProperty("hibernate.cache.use_second_level_cache", "true")
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect")
return new LocalSessionFactoryBuilder(dataSource())
.scanPackages("dto")
.addProperties(properties)
.buildSessionFactory();
}
我正在使用基于 Java 配置的 Hibernate 和 Spring。我的配置文件是这个:
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(s);
return txManager;
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] { "dto" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
工作正常。这没问题,但是当我手动尝试为 trasactionManager
设置 sessionfactory
参数时,如下所示:
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory());
return txManager;
}
IDE 正在显示:
`The method setSessionFactory(SessionFactory) in the type HibernateTransactionManager is not applicable for the arguments (LocalSessionFactoryBean)`
所以,我创建了一个如下所示的 sessionFactory
@Bean
@Autowired
public SessionFactory sessionFactory(DataSource dataSource) {
LocalSessionFactoryBuilder sessionFactory = new LocalSessionFactoryBuilder(dataSource);
sessionFactory.addProperties(hibernateProperties());
sessionFactory.scanPackages("dto");
return sessionFactory.buildSessionFactory();
}
并传递给 trasactionManager
它起作用了。
我的问题是,即使第一种方法中没有 sessionFactory
实例,spring 如何自动装配 sessionFactory 对象?
您需要将方法 return 类型从 SessionFactory
更改为 HibernateTransactionManager
。
它应该是这样的:
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(s);
return txManager;
}
@Bean
public SessionFactory sessionFactory() {
Properties properties = new Properties();
properties.setProperty("hibernate.show_sql", "true")
properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory")
properties.setProperty("hibernate.cache.use_query_cache", "true")
properties.setProperty("hibernate.cache.use_second_level_cache", "true")
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect")
return new LocalSessionFactoryBuilder(dataSource())
.scanPackages("dto")
.addProperties(properties)
.buildSessionFactory();
}