Spring @Bean 名称,不适用于@Qualifier
Spring @Bean Name, is not working with @Qualifier
我有一个 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)}
我认为这里发生的是 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
我有一个 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)}
我认为这里发生的是 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