Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring@Bean Name,不使用@Qualifier_Java_Spring_Spring Boot_Annotations_Spring Bean - Fatal编程技术网

Java Spring@Bean Name,不使用@Qualifier

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

我有一个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
@组件

@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;
}