首页>itarticle>spring – @autowired for list types Have Spring Autowire All Subclass Better Usage of @Autowired This tip should work well w.r.t interfaces
spring – @autowired for list types Have Spring Autowire All Subclass Better Usage of @Autowired This tip should work well w.r.t interfaces
admin11月 12, 20200
How to use Spring to autowire list types? How to autowired all subclasses of a parent class, or all implementations of an interface.
Let’s see an example - we have three pets that we’d like to register them on the public animal registry.
publicclassAnimalRegistry{ private Registry<Animal> registry; /** * This is naive because if you have more animals, * you have to specify them explicitly here */ @Autowired publicAnimalRegistry(MyDog dog, MyCat cat, MyBird bird){ registry.register(dog); registry.register(cat); registry.register(bird); } }
Have Spring Autowire All Subclass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
@Component publicclassAnimalRegistry{ private Registry<Animal> registry; /** * The problem with this approach is that * if you don't have any animals, there's no bean to be autowired here, * and Spring will report bean initialization error */ @Autowired publicAnimalRegistry(List<Animal> myAnimals){ if(myAnimals != null && !myAnimals.isEmpty()) { myAnimals.forEach(a -> registry.register(a)); } } }
Better Usage of @Autowired
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
@Component publicclassAnimalRegistry{ private Registry<Animal> registry; @Autowired(required = false) List<Animal> myAnimals; /** * This ensures that Spring can still successfully run * even when there's no bean to be autowired to 'myAnimals' */ @PostConstruct publicvoidinit(){ if(myAnimals != null && !myAnimals.isEmpty()) { myAnimals.forEach(a -> registry.register(a)); } } }
近期评论