当前位置: 首页 > 知识库问答 >
问题:

用@Qualifier注释在spring boot中实现bean的自动化

酆奇文
2023-03-14

我正在Spring Boot中使用@primary和@qualifier注释学习autowiring。我能够理解@primary将带注释的类连接为依赖项,如果发现了多个令人满意的类,@qualifier可以提供帮助。

@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;
    }
    
}
@Component
//@Primary
@Qualifier("car")
public class Bike implements Vehicle {

    @Override
    public void details() {
        System.out.println("Bike is driving");
    }
    
}
@Component
//@Primary
@Qualifier("bike")
public class Car implements Vehicle {
    @Override
    public void details() {
        System.out.println("Car is driving");
    }
}

当我在名为“Bike”的autowired依赖项上添加@qualifier(“Car”)并在Car上添加@qualifier(“Car”)和在Bike上添加@qualifier(“Bike”)时,它将提取Car。但是,当我在自行车和汽车上交换@qualifier时(例如,在汽车上-@qualifier("Bike“),反之亦然),它会捡起自行车。另外,当我将@qualifier更改为“Bike on我的autowired依赖项命名为”car“,并在Bike上使用@qualifier(”car“)时,它正在挑选car。我期待Bike会被挑选。我遗漏了什么?

共有1个答案

董俊晖
2023-03-14

这里使用限定符注释是不正确的,限定符注释用于字段、参数或方法,以便在自创建时选择写候选bean,

此注释可用于字段或参数中,作为Autowiring时候选bean的限定符。(JAVA文档)

在简单的word中,您通过名称定义bean,并通过添加@qualifier告诉spring选择什么名称,在您的示例中,您必须在@component中添加bean名称。

@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");
    }
}
 类似资料:
  • 我在玩和 这是我的应用程序上下文文件 以下是我的Java类 HelloWorld1。JAVA 住址JAVA 这里是我尝试运行东西的地方-应用程序。JAVA 我一直在得到这个异常-理想情况下我不应该,因为我已经定义了id为'address1'的@Qualifier注释-所以它不应该抛出异常 警告:上下文初始化过程中遇到的异常-取消刷新尝试:org.springframework.beans.fact

  • 我收到了错误 尝试启动Spring应用程序时。 这是由我创建的两个类(StorageService)引起的,它们分别是我创建的实现和接口。我在类级别本身命名了两个服务类,即服务(service1)和服务(service2),我正在尝试自动连接控制器构造函数中的每个类,并通过在构造函数中的每个参数上直接使用限定符注释来指定所需的服务,但我仍然收到NonuiquebeandeFinitionExcep

  • 我仍然是Spring的新手,我正在尝试正确设置ehcache Spring注解。我使用的是Spring 3.2.3 ehCache 2.4和ehcache-spring-注解-1.2。 当我尝试访问对cacheManager的引用时,它总是空的。所有jar都在构建路径ehcache上。xml在类路径中,没有xml错误。我还尝试在组件扫描中包含类,并使用@Resource而不是自动连接。我卡住了!

  • 希望你一切都好。我就直奔主题: 我在一个Spring Boot应用程序中工作,使用Spring AOP处理日志记录问题。它工作正常,但是今天我发现我需要从@ConfigurationProperties-注释的bean中记录一些属性(至少是为了调试目的)。 我尝试使用切入点来捕获类构造函数及其setters(Spring使用它用反射填充字段)。它不起作用,我相信这是由于反射使用。 我使用以下代码解

  • 在Java中,我可以“实现”注释。 示例 Java 注释: 示例 Java“实现”: 尝试将其移植到 Kotlin 不起作用,因为它说注释是最终的,因此不能被继承,即以下内容将不起作用: 如何以Kotlin的方式“实现/扩展”注释?找不到Kotlin与Java在这方面存在差异的任何原因。欢迎任何关于如何解决这个问题的提示或任何说明为什么会这样的消息来源。 以下问题包含此星座的用例:使用带有成员的限

  • 我已经用自定义注释注释了Spring bean,但似乎Spring在创建bean后删除了我的自定义注释。 第二步不行,我的自定义注释丢失了。(可能是到期的代理文件) 我的豆子 我的一个自定义注释的示例 findAndDoStuffWithAnnotatedThings Bean中出错的内容被传递到一个类,在该类中,我的自定义注释得到验证,但我的验证程序找不到任何注释。(Util使用isAnnota