这些天我在玩 Spring,但在 HTTP 请求生命周期内尝试 Autowiring bean 时遇到了困难。
我有一个名为 Animal
的接口(interface)和两个实现,Dog
和 Cat
,如下所示:
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/