3 回答

TA貢獻1820條經驗 獲得超2個贊
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();
}
}
}
添加回答
舉報