Spring中能否注入某个Bean的所有实现类的Map集合并按需调用?
在Spring中能否注入某一Bean所有实现类的Map集合?
当然可以!这其实是Spring框架原生支持的特性,完美匹配你的需求。
原理说明
当Spring容器里存在多个实现同一接口的Bean时,框架会自动收集这些Bean,并且支持通过Map<String, 接口类型>的形式注入:
- Map的key就是Bean的名称:也就是你在
@Service注解里指定的value(比如BUCKET_PROCESSOR);如果没指定名称,Spring会默认用类名首字母小写作为key(比如BucketProcessor会变成bucketProcessor) - Map的value就是对应实现类的实例对象
结合你的代码验证
看你给出的代码结构:
public interface Processor { Map<String, String> execute(); } @Service("BUCKET_PROCESSOR") public class BucketProcessor implements Processor { /* 实现逻辑 */ } @Service("QUERY_PROCESSOR") public class QueryProcessor implements Processor { /* 实现逻辑 */ } @Service("SQL_PROCESSOR") public class SQLProcessor implements Processor { /* 实现逻辑 */ }
这三个Processor实现类都会被Spring扫描并纳入容器管理,然后在你的MyAsyncClient中:
@Service public class MyAysncClient { @Autowired private Map<String, Processor> processorMap; public void execute(List<String> processors) { List<Future> tasks = new ArrayList<>(); for (String p : processors) { final Processor processor = this.processorMap.get(p); processor.execute(); // 如果需要异步执行,记得给Processor的execute方法加@Async注解并返回Future类型 } } }
processorMap会被Spring自动注入,里面会包含三个键值对:
"BUCKET_PROCESSOR"->BucketProcessor实例"QUERY_PROCESSOR"->QueryProcessor实例"SQL_PROCESSOR"->SQLProcessor实例
你完全可以通过输入的实现类名称列表,遍历从Map中取出对应Processor并调用方法,这个写法是完全可行的。
额外小提示
从类名MyAsyncClient和Future变量来看,你可能需要异步执行逻辑:记得给Processor的execute方法加上@Async注解,并且让方法返回Future<Map<String, String>>,这样才能正确收集异步任务的结果。
内容的提问来源于stack exchange,提问作者user2696466
相关产品推荐
相关产品推荐

