【问题标题】:Inject list of all beans with a certain interface注入具有特定接口的所有bean列表
【发布时间】:2019-05-03 21:11:19
【问题描述】:

我有一个看起来像这样的类 (@Component bean):

@Component
public class EntityCleaner {

    @Autowired
    private List<Cleaner> cleaners;

    public void clean(Entity entity) {
         for (Cleaner cleaner: cleaners) {
             cleaner.clean(entity);
         }
    }
}

Cleaner 是一个界面,我有一些清洁器,我希望它们都运行(不要介意顺序)。今天我做了这样的事情:

 @Configuration
 public class MyConfiguration {
     @Bean
     public List<Cleaner> businessEntityCleaner() {
         List<Cleaner> cleaners = new ArrayList<>();
         cleaners.add(new Cleaner1());
         cleaners.add(new Cleaner2());
         cleaners.add(new Cleaner3());
         // ... More cleaners here

         return cleaners;
     }
 }

有没有办法在配置中不定义特殊方法来构造这个列表?只是那个spring自动神奇地找到所有那些实现Cleaner接口的类,创建列表并将其注入EntityCleaner

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    @Autowired 的 Javadoc 说:

    在 Collection 或 Map 依赖类型的情况下,容器 自动装配与声明的值类型匹配的所有 bean。

    因此,您可以执行以下操作:

    @Component
    public class SomeComponent {
    
        interface SomeInterface {
    
        }
    
        @Component
        static class Impl1 implements SomeInterface {
    
        }
    
        @Component
        static class Impl2 implements SomeInterface {
    
        }
    
        @Autowired
        private List<SomeInterface> listOfImpls;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2011-12-05
      • 1970-01-01
      相关资源
      最近更新 更多