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