3 回答
TA贡献1820条经验 获得超3个赞
Animal您可以通过将它们设为列表来实例化所有类型的 bean 。前任:
@Autowired List<Animal> animals;
这将自动装配所有动物,您可以遍历它们并以编程方式决定您需要哪一个。
虽然,我可能是错的,但对于您的用例,我相信工厂设计模式更适合。您可以对AnimalFactory列表中的所有工厂进行抽象和自动装配,然后应用某种策略模式以编程方式决定您将使用哪个工厂并返回该类型的新对象。
TA贡献1860条经验 获得超8个赞
通过 beanName 从 Container 中获取动物 bean;
@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(animal);
}
}
AnimalService.java
public class AnimalService implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public String doSound(String animalName) {
Animal animal = applicationContext.getBean(animalName);
return animal.sound();
}
}
TA贡献1936条经验 获得超7个赞
您可以使用 spring.profiles.active 来做到这一点。一个配置文件加载狗,另一个配置文件加载猫。
@Configuration
public class Configuration {
@Profile("dog")
@Bean
public Dog createDog() {
return new Dog();
}
@Profile("cat")
@Bean
public Cat createCat() {
return new Cat();
}
}
您可以像 java -jar myapp.jar --spring.profiles.active=dog 一样启动您的应用程序。
您可以尝试的另一个选项是限定 beans 并使用带有属性变量的限定符,spring 可能会解决它。
@Service
public class AnimalService {
@Qualifier("${choosen.animal}")
@Autowired
private Animal animal;
public String doSound() {
return animal.sound();
}
}
}
添加回答
举报
