В эти дни я играю с Spring и застрял, пытаясь автоматически связывать бины при жизни HTTP-запроса.
У меня есть интерфейс с именем Animal
и две реализации, Dog
и Cat
:
Animal.java
public interface Animal {
public String sound();
}
Dog.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";}
}
Мой контроллер выглядит так:
AnimalController.jav a
@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 (Здесь я не могу автоматически подключить своих животных):
@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();
}
}
}
Также:
Configuration.java
@Configuration
public class Configuration {
@Bean
public Dog createDog() {
return new Dog();
}
@Bean
public Cat createCat() {
return new Cat();
}
}
Возможно ли иметь такое поведение, решая, какой компонент использовать в зависимости от переменных пути?Я пытался прочитать основную документацию Spring, но я не мог понять слишком много.Буду признателен за помощь.