为什么@Qulifier注解对final成员变量不起作用

问题描述 投票:0回答:1

我注意到

@Qualifier
注释不适用于
final
成员变量。 在下面的代码中,

  • Vehicle
    Person
    成员变量声明为
    final
    ,则抛出异常;
  • 否则,不会抛出异常(但
    vehicle
    为空)。

谁能解释一下为什么?

// 2 Vehicle beans are annotated by @Qualifier;
@Configuration
public class Config 
{
  @Bean
  @Qualifier("vehicle1")
  Vehicle vehicle1() {
    var veh = new Vehicle();
    veh.setName("Benz");
    return veh;
  }

  @Bean
  @Qualifier("vehicle2")
  Vehicle vehicle2() {
    var veh = new Vehicle();
    veh.setName("BMW");
    return veh;
  }
}

// Person has a final member variable Vehicle
@Component
@Data
public class Person 
{
  private String name="Mike";

  @Qualifier("vehicle2")
  private final Vehicle vehicle;
}

Springboot 抱怨 NoUniqueBeanDefinitionException:

  • 没有可用的“project1.Vehicle”类型的合格 bean:预期 单个匹配 bean 但找到 2:vehicle1,vehicle2
java spring lombok final spring-annotations
1个回答
0
投票

问题与lombok密切相关,比较普遍

对于此类问题,我的建议是查看已处理的类

如果您使用的是 IntelliJ,请转到项目构建目录以打开类文件。

1。如果Person的Vechicle成员变量声明为final,则抛出异常;

处理后的类为:

@Component
public class Person {
    private String name = "Mike";
    @Qualifier("vehicle2")
    private final Vehicle vehicle;

    public Person(final Vehicle vehicle) {
        this.vehicle = vehicle;
    }
    ...
}

我们看到本例中是通过构造函数注入的,

@Qualifier
被忽略了。因此,我们将看到
NoUniqueBeanDefinitionException
,因为我们没有指定要使用哪个bean。

2。否则,不会抛出异常(但车辆为空)。

这次处理的类是:

@Component
public class Person {
    private String name = "Mike";
    @Qualifier("vehicle2")
    private Vehicle vehicle;

    public Person() {
    }
    ...
}

vehicle
这次没有出现在构造函数中,`vehicle没有
@Autowired
,所以没有执行注入,它是空的。

如何让它发挥作用?

首先,

@Data
与Spring bean一起使用并不常见,
@Data
通常被DTO使用。为了支持构造函数注入,我将像下面这样修改
Person

@Component
public class Person {
    private String name = "Mike";
    private final Vehicle vehicle;
    public Person(@Qualifier("vehicle2") Vehicle vehicle) {
        this.vehicle = vehicle;
    }
    // ... getter setter omitted
}
© www.soinside.com 2019 - 2024. All rights reserved.