首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在spring boot中使用@Qualifier注解自动装配bean

在spring boot中使用@Qualifier注解自动装配bean
EN

Stack Overflow用户
提问于 2019-07-23 16:32:21
回答 2查看 4.3K关注 0票数 1

我正在学习Spring Boot中使用@Primary和@Qualifier注解的自动装配。我能够理解@Primary将带注释的类连接为依赖项,如果找到多个满足条件的类,@Qualifier可以提供帮助。

代码语言:javascript
复制
@Component
public class VehicleBean {

    @Autowired
    @Qualifier("car")
    Vehicle car;

    public void check() {
        car.details();
    }
    
    public Vehicle getCar() {
        return car;
    }
    
    public void setCar(Vehicle car) {
        this.car = car;
    }
    
}

自行车

代码语言:javascript
复制
@Component
//@Primary
@Qualifier("car")
public class Bike implements Vehicle {

    @Override
    public void details() {
        System.out.println("Bike is driving");
    }
    
}

小汽车

代码语言:javascript
复制
@Component
//@Primary
@Qualifier("bike")
public class Car implements Vehicle {
    @Override
    public void details() {
        System.out.println("Car is driving");
    }
}

但是,当我在自行车和汽车上交换@Qualifier时(例如在汽车上用- @Qualifier("bike"),反之亦然),它会拿起自行车。另外,当我将@Qualifier更改为"bike on my autowired " Car“,并在Bike上有@Qualifier("car"),反之亦然,它是在选择Car。我希望Bike会被选中。我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2019-07-23 17:36:53

此处使用限定符注释是不正确的,限定符注释用于字段、参数或方法,以便在编写时选择写入候选bean。

在自动装配时,此注释可以在字段或参数上用作候选bean的限定符。(JAVA DOC)

简单地说,您通过名称定义bean,并通过添加@Qualifier来告诉spring选择哪个名称,在您的示例中,您必须在@Component中添加bean名称。

代码语言:javascript
复制
@Component("bike")
public class Bike implements Vehicle {

    @Override
    public void details() {
        System.out.println("Bike is driving");
    }

}

@Component("car")
public class Car implements Vehicle {
    @Override
    public void details() {
        System.out.println("Car is driving");
    }
}

对于你的问题,为什么它选择Car?,因为如果没有人指定,AnnotationBeanNameGenerator会生成一个默认名称,并且构建的名称是基于类的短名称(第一个字母小写):

如果注解的值不表示bean名称,则将基于类的短名称(第一个字母小写)构建适当的名称。例如:

com.xyz.FooServiceImpl -> fooServiceImpl (JAVA DOC)

票数 2
EN

Stack Overflow用户

发布于 2019-07-23 18:05:38

@Component @Qualifier("car")@Qualifier注解在这里不起作用。它可以用在一个字段,一个参数或一个自动装配的方法上。

@Component("car")一样,您只需要使用@Component注释传递名称

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57159933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档