【问题标题】:Spring @Bean Name, is not working with @QualifierSpring @Bean Name,不适用于@Qualifier
【发布时间】:2021-03-26 09:26:41
【问题描述】:

我有一个 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 Name (默认为函数名称)从 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 处添加了@Component,或者至少将其标记为@Qualifier("entityManagerFactort)?只是问:) 如果不让我知道,我可以用答案解释更多
  • @user124 我已经更新了我的答案。再检查一遍

标签: java spring spring-boot annotations spring-bean


【解决方案1】:

我认为这里发生的情况是 entityManagerFactory 是从 spring 自动为另一个 bean 注册的。因此你得不到你想要的。

试着改一下名字

@Bean(name="customEntityManagerFactory")
  public LocalSessionFactoryBean sessionFactory() {

然后

@Autowired
  @Qualifier("customEntityManagerFactory")
  private SessionFactory sessionFactory;

【讨论】:

  • 是的,我认为这也是一个选项,但他可以通过注释来管理它。 @Qualifier@Component。但是是的,这被称为Autowiring by name :)
  • @Boug ,我试过但同样的错误,请查看答案中的更新
  • @user124 在您的问题中,您已使用我之前的答案进行了更新。这里不是这个
  • 仍然无法解决。您给出的更新答案是我已经尝试过的,有问题提到了 Qualifier 注释使用“值”参数的区别,但我尝试了带/不带参数,但它仍然没有用。
  • 看我怎么知道,这是消除所有其他人之后唯一可能的解决方案:D。除此之外,由于名为spring.main.allow-bean-definition-overriding=true 的属性允许这样做,日志不会显示任何错误。如果你把它变成假的,那么日志一定会出现
【解决方案2】:

所以让我对这一切进行一个高度概述@Autowire@Qualifier@Component...

@Autowire: 这是在 Spring 中进行显式注入的好方法。但是在某些情况下,Spring 对注入哪个依赖项感到困惑。

@Qualifier 出现了:您消除了歧义问题 :) 因此,即使 Spring 找到要注入相同类型的多个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-15
    • 2015-07-07
    • 2018-07-11
    • 2015-11-03
    • 1970-01-01
    • 2019-05-22
    • 2020-03-21
    • 2018-08-14
    相关资源
    最近更新 更多