如何解决Spring @Bean 名称,不适用于 @Qualifier
我有一个 Spring Boot 应用程序。它创建 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","
});
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)}
解决方法
我认为这里发生的是 entityManagerFactory 是从 spring 自动为另一个 bean 注册的。因此你没有得到你所要求的。
试着稍微改变一下名字
@Bean(name="customEntityManagerFactory")
public LocalSessionFactoryBean sessionFactory() {
然后
@Autowired
@Qualifier("customEntityManagerFactory")
private SessionFactory sessionFactory;
,
那么让我对所有这些@Autowire
@Qualifier
@Component
...
@Autowire
:这是使 Spring 中的注入显式的好方法。但是在某些情况下,Spring 会混淆要注入哪个依赖项。
出现了 @Qualifier
:您消除了歧义问题 :) 因此,即使 Spring 发现要注入多个相同类型的 bean,它也知道应该注入哪个 bean。
但如果您想使用您的特定实现,您需要使用 @Component
指定该实现,以便使用限定符名称。
@Component("fooFormatter")
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
然后:
public class FooService {
@Autowired
@Qualifier("fooFormatter")
private Formatter formatter;
}
正如@Boug 在上面的回答中所说,还有另一种选择。你@Autowire
的名字。因此 Spring 将知道它必须使用与 @Component
的值匹配的字段名称。
例如
public class FooService {
@Autowired
private Formatter fooFormatter;
}
我希望这一切都有意义:)
在这里你可以阅读更多Check here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。