我有一个spring启动应用程序。它创建localsessionfactorybean对象并注入会话工厂变量。它的工作原理如下:
@Autowired
@Qualifier(value="sessionFactory")
private SessionFactory sessionFactory;
@Primary
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setPackagesToScan(
new String[] {
"com.abc..entities",
"com.abc.xyz.entities",
"
});
factory.setHibernateProperties(hibernateProperties());
return factory;
}
但是,我需要将sessionfactory的bean名称(默认为函数名)从sessionfactory更改为entitymanagerfactory,所以我做了以下操作:
@Autowired
@Qualifier(value="entityManagerFactory")
private SessionFactory sessionFactory;
@Primary
@Bean(name="entityManagerFactory")
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setPackagesToScan(
new String[] {
"com.abc..entities",
"com.abc.xyz.entities",
"
});
factory.setHibernateProperties(hibernateProperties());
return factory;
}
但它抛出了一个错误:
> Error creating bean with name 'XYZ': Unsatisfied dependency expressed
> through field 'sessionFactory'; nested exception is
> org.springframework.beans.factory.NoSuchBeanDefinitionException: No
> qualifying bean of type 'org.hibernate.SessionFactory' available:
> expected at least 1 bean which qualifies as autowire candidate.
> Dependency annotations:
> {@org.springframework.beans.factory.annotation.Autowired(required=true),
> @org.springframework.beans.factory.annotation.Qualifier(value=entityManagerFactory)}
我相信我做得对,我错过了什么?
更新:-
我尝试了以下一个答案中提到的方法,但没有成功:
@Autowired
@Qualifier(value = "entityManagerFactory")
private SessionFactory sessionFactory;
并将方法更改为
@Primary
@Bean
public LocalSessionFactoryBean entityManagerFactory()
{ ..........},
> Unsatisfied dependency expressed through field 'sessionFactory';
> nested exception is
> org.springframework.beans.factory.NoSuchBeanDefinitionException: No
> qualifying bean of type 'org.hibernate.SessionFactory' available:
> expected at least 1 bean which qualifies as autowire candidate.
> Dependency annotations:
> {@org.springframework.beans.factory.annotation.Autowired(required=true),
> @org.springframework.beans.factory.annotation.Qualifier(value=entityManagerFactory)}
2条答案
按热度按时间du7egjpx1#
我认为这里发生的是,entitymanagerfactory从spring自动注册到另一个bean。所以你没有得到你想要的。
试着把名字改一下
然后
xqk2d5yq2#
所以,让我对这一切作一个高度的概述
@Autowire
@Qualifier@Component
...@Autowire
:这是一种使spring中的注入显式化的好方法。但有些情况下,spring会对注入哪个依赖项感到困惑。有人来了
@Qualifier
:您消除了模糊性问题:)因此,即使spring找到多个相同类型的bean进行注入,它也知道该注入哪个bean。但如果要使用特定的实现,则需要使用
@Component
因此将使用限定符名称。然后:
正如@boug在上面的回答中所说的,还有另一种选择。你在哪里
@Autowire
名字。因此spring将知道它必须使用与@Component
.例如
我希望这一切都有意义:)
在这里你可以阅读更多检查这里