Java Spring@Bean Name,不使用@Qualifier
我有一个spring启动应用程序。它创建LocalSessionFactoryBean对象并注入会话工厂变量。它的工作原理如下:Java Spring@Bean Name,不使用@Qualifier,java,spring,spring-boot,annotations,spring-bean,Java,Spring,Spring Boot,Annotations,Spring Bean,我有一个spring启动应用程序。它创建LocalSessionFactoryBean对象并注入会话工厂变量。它的工作原理如下: @Autowired @Qualifier(value="sessionFactory") private SessionFactory sessionFactory; @Primary @Bean public LocalSessionFactoryBean sessionFactory() { LocalSess
@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
@组件
@Autowire
:这是一种使Spring中的注入显式化的好方法。但有些情况下,Spring会对注入哪个依赖项感到困惑
这里出现了@限定符
:您消除了歧义问题:)因此,即使Spring找到了多个相同类型的bean进行注入,它也知道应该这样做
但是,如果要使用特定的实现,则需要使用@组件指定该实现,以便使用限定符名称
@Component("fooFormatter")
public class FooFormatter implements Formatter {
public String format() {
return "foo";
}
}
然后:
public class FooService {
@Autowired
@Qualifier("fooFormatter")
private Formatter formatter;
}
正如@Boug在上述回答中所说,还有另一种选择。您可以按名称@Autowire
。因此,Spring将知道它必须使用与@组件的值匹配的字段名
e、 g
我希望所有这些都有意义:)
这里您可以阅读更多内容您是否在entityManagerFactory
中添加了@组件,或者至少将其标记为@限定符(“entityManagerFactory”)
?只是问:)如果不让我知道,我可以用answer@user124我已经更新了我的答案。再次检查这个是的,我认为这也是一个选项,但他可以通过注释来管理它。
。但是是的,这被称为按名称自动布线
:)@Boug,我试过了,但同样的错误,请参阅中的更新answer@user124在你的问题中,你已经用我以前的答案更新了。不是这里的这个答案仍然无法解决。你给出的更新的答案,是我已经尝试过的,正如我在问题中提到的,与限定符注释使用的“值”不同“参数,但我尝试使用/不使用参数,但仍然不起作用。看看我怎么知道的,这是消除所有其他参数后唯一可能的解决方案:D。除了日志没有显示任何错误,因为名为spring.main.allow bean definition overriding=true
的属性允许这样做。如果你把它设为假的话,一定会有什么事发生
public class FooService {
@Autowired
private Formatter fooFormatter;
}