java - Get a List of Beans for a certain type -
i have type of class can provide data , registry different data providers registered. looking elegant way implement in spring boot. current implementation looks (code shortened brevity):
public interface dataprovider{ data getsomedata(); } public class registry{ public register(dataprovider provider){ //add internal list }; public list<dataprovider> getproviders(){ //return providers } public data someaggregatedoperation(){ ... } } public class provider1 implements dataprovider { ... } public class provider2 implements dataprovider { ... } now wiring part, , part want change more elegant:
@configuration public class myappconfiguration{ @bean public registry providerregistry(){ registry reg = new registry(); reg.register(new provider1()); reg.register(new provider2()); return reg; } } then can inject registry other classes need operate on services.
i know di providing different implementation single type 1 @ time. di not right tool, question more spring if there's way don't know achieve this. example annotate them qualifier , resolve beans qualifier in registry.
the way not want take using custom annotation , resolving classes via reflection, instantiate them , put them in registry. @ moment it's way can see don't have modify config , handwire services.
if want of them autowired, can autowire list of interface implementations.
@bean public class provider1 implements dataprovider { ... } @bean public class provider2 implements dataprovider { ... } @bean public class registry{ @autowired private list<dataprovider> providers; public list<dataprovider> getproviders(){ //return providers } public data someaggregatedoperation(){ ... } } in case want keep using configuration class like:
@bean public class provider1 implements dataprovider { ... } @bean public class provider2 implements dataprovider { ... } public class registry{ private list<dataprovider> providers; public registry(final list<dataprovider> providers) { this.providers = providers; } public list<dataprovider> getproviders(){ //return providers } public data someaggregatedoperation(){ ... } } @configuration public class myappconfiguration{ @bean @autowired public registry providerregistry(final list<dataprovider> providers){ return new registry(providers); } }
Comments
Post a Comment