【发布时间】:2023-02-15 08:42:49
【问题描述】:
Spring Boot 的小问题,以及如何使用 @Qualifier 配置 bean。
我有一段非常简单的代码:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.1</version>
<relativePath/>
</parent>
<groupId>com.question</groupId>
<artifactId>language</artifactId>
<version>1.1</version>
<name>language</name>
<description>Spring Boot</description>
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.question;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LanguageApplication {
public static void main(String[] args) {
SpringApplication.run(LanguageApplication.class, args);
}
}
package com.question.service;
public interface LanguageService {
String process(String name);
}
package com.question.service;
import org.springframework.stereotype.Service;
@Service("french")
public class FrenchLanguageServiceImpl implements LanguageService {
@Override
public String process(String name) {
return "Bonjour " + name;
}
}
package com.question.service;
import org.springframework.stereotype.Service;
@Service("english")
public class EnglishLanguageServiceImpl implements LanguageService {
@Override
public String process(String name) {
return "Welcome " + name;
}
}
package com.question.controller;
import com.question.service.LanguageService;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
@RestController
public class LanguageController {
private final LanguageService languageService;
@Value("${configuration}")
public String configuration;
public LanguageController(@Qualifier(configuration) LanguageService languageService) {
this.languageService = languageService;
}
@GetMapping("/test")
public String test(@RequestParam String name) {
return languageService.process(name);
}
}
预期的:
我希望实现的目标同样简单明了。我想将某种配置传递给application.properties,比如configuration=french 或configuration=english。
在控制器层,使用(@Qualifier(configuration) LanguageService languageService) 并且将使用正确的具体服务。
实际的:
很遗憾,
@Qualifier(configuration) + @Value("${configuration}") public String configuration;
将产生Attribute Value must be constant。
请问有没有办法通过可配置的@Qualifier配置具体的Bean?
我知道有一种方法可以通过使用 ApplicationContext getBean 来解决这个问题。
但是有这样的构造:@Qualifier(configuration) 使代码干净且易于理解。请问如何做到这一点?
谢谢
【问题讨论】:
-
您提供的@Stultuske 链接几乎是我的问题。正如您在教程示例中看到的那样
@Qualifier("fooFormatter")该值是硬编码的,不可配置的。请问如何配置好? -
不是。你没有。您提供了两个自动装配的 bean,并基于(如果值等于英语 -> 使用 englishqualifiedBean 否则使用 Otherbean。基本上:工厂模式
-
这又是我的问题的重点,非常感谢。我有大约 100 多个具体的语言 bean。并且自动装配数百个具体的 bean,+ bean 名称上的巨大 if 语句不是最佳的。有没有一种方法可以使用可配置的@Qualifier 简单地配置在应用程序启动时使用哪个bean?
-
这可能与您问题的“要点”相悖,但至少它会起作用。您不能动态构建传递给注释的值。您可以将它们全部放在一个地图中,并将特定的(例如“英语”和“法语”)映射到它们,您可以通过这种方式获取它们。
标签: java spring spring-boot qualifiers