spring@bean name不能与@qualifier一起使用

pzfprimi  于 2021-07-15  发布在  Java
关注(0)|答案(2)|浏览(458)

我有一个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)}
du7egjpx

du7egjpx1#

我认为这里发生的是,entitymanagerfactory从spring自动注册到另一个bean。所以你没有得到你想要的。
试着把名字改一下

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

然后

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

xqk2d5yq2#

所以,让我对这一切作一个高度的概述 @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;
}

我希望这一切都有意义:)
在这里你可以阅读更多检查这里

相关问题