java - 是否可以根据 @Autowire 的路径变量来决定使用哪个 bean?

标签 java spring spring-boot

这些天我在玩 Spring,但在 HTTP 请求生命周期内尝试 Autowiring bean 时遇到了困难。

我有一个名为 Animal 的接口(interface)和两个实现,DogCat,如下所示:

Animal.java

public interface Animal {
  public String sound();
}

狗.java

public class Dog implements Animal {
  @Override
  public String sound() {return "Woof!";}
}

Cat.java

public class Cat implements Animal {
  @Override
  public String sound() {return "Meow... :3";}
}

我的 Controller 看起来像这样:

AnimalController.jav

@RestController
@RequestMapping(value="/animal")
public class AnimalController {
  private final AnimalService animalService;

  @Autowired
  public AnimalController(AnimalService service) {
    animalService = service;
  }

  @GetMapping(value = "/{animal}/sound")
  public String animalSound(@PathVariable String animal) {
    return animalService.doSound();
  }
}

AnimalService.java(在这里我不能 Autowiring 我的动物):

@Service
public class AnimalService {

/* 
 My IDE prompts:  
 'Could not autowire. There is more than one bean of `Animal` type.'
*/
  @Autowired
  private Animal animal; 

  public String doSound() {
    return animal.sound();
  }
}    
}

还有:

配置.java

@Configuration
public class Configuration {
  @Bean
  public Dog createDog() {
    return new Dog();
  }

  @Bean
  public Cat createCat() {
    return new Cat();
  }
}

是否可以根据路径变量决定使用哪个 bean?我试着阅读了 Spring 的核心文档,但我无法理解太多。我将不胜感激。

最佳答案

您可以将所有 Animal 类型的 beans 实例化为一个列表。 例如:

@Autowired
List<Animal> animals;

这将 Autowiring 所有动物,您可以遍历它们并以编程方式决定您需要哪一个。

虽然,我可能是错的,但对于您的用例,我相信工厂设计模式更适合。您可以制作一个抽象的 AnimalFactory 并 Autowiring 列表中的所有工厂,然后应用某种策略模式以编程方式决定您将使用哪个工厂并返回该类型的新对象。

关于java - 是否可以根据 @Autowire 的路径变量来决定使用哪个 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56183363/

相关文章:

java - 为什么我的 jsp 文件在 Tomcat 部署到 war 文件时不显示?

java - Spring @Transactional DAO 调用返回相同的对象

java - 如何将模拟注入(inject)到具有 1 个带参数的构造函数的类中?

java - 如何停止使用 spring 任务安排的作业

java - Keycloak无法获取访问 token

java - SpringApplication.run 主方法

java - com.mysql.jdbc.PacketTooBigException 刚连接数据库时

JavaFX 在 CSS 中更改禁用文本字段的文本颜色

java - AlertDialog.Builder 错误

java - 返回枚举名称和字符串值作为 api 响应