【问题标题】:Inject a list of classes that extends an abstract class with Spring使用 Spring 注入扩展抽象类的类列表
【发布时间】:2016-07-19 01:00:02
【问题描述】:

喂,

我有下一个代码:

public abstract class MyClass{
   protected abstract void method1();
}

扩展第一个类的类:

 @Component
 public class MyClass1 extends MyClass{
    .....
 }

@Component
public class MyClass2 extends MyClass{
  .....
}

我尝试注入扩展抽象类的类列表的类

 @Component
 public class SpringClass{

     @Autowired **//It doesnt work, nothing is inyected!**
     List<MyClass> classes

 }

我的问题是它不起作用,它没有在属性类中注入扩展 MyClass 的类列表。为什么?

谢谢

【问题讨论】:

  • 我认为它应该适用于 Spring 3.1+。请参阅stackoverflow.com/questions/1450145/spring-list-beans-by-type 注入是否适用于正常情况(例如仅注入 MyClass1)而不适用于列表?
  • 您确定您的组件已被扫描?
  • 是的,我的组件被扫描了,但是当我使用接口时,列表是 inyected,当我使用抽象类时没有;如果我尝试注入列表或单个元素都没关系,它不适用于抽象类

标签: spring list inject


【解决方案1】:

看起来它可能取决于所使用的 Spring 版本,但是,您可能还想尝试使用所有所需类都实现的接口,并注入引用该接口的列表。

换句话说,不是这个..

List&lt;AbstractOrConcreteBaseClass&gt;

使用...

List&lt;Interface&gt;

【讨论】:

    【解决方案2】:
    @Component
    public class SpringClass {
    
        @Autowired
        private Map<String, YourInterface> map;
    
    }
    

    映射中的字符串将包含所有将 YourInterface 实现为字符串的类名称。 如果您想获取所有实例 - 使用 map.values() 如果你想获取特定的实例 - 通过类名获取它。

    另外,您可以通过其他识别方式(例如 Enum)自定义密钥。 在这种情况下 - 您需要将其配置为 @Bean 如下:

    @Configuration
    public class CalculationHandlerConfig {
    
        @Bean
        public HashMap<OperatorTypeEnum, CalculatorService> CalculationHandlers(Map<String, CalculatorService> beansMap) {
            HashMap<OperatorTypeEnum, CalculatorService> map = new HashMap<>();
            for (CalculatorService bean : beansMap.values()) {
                map.put(bean.getOperatorType(), bean);
            }
            return map;
        }
    }
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
    【解决方案3】:

    您可以删除实例变量的@Autowired 注解并将其添加到setter 方法中。完成此操作后,您的春季课程将是

    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class SpringClass {
    
        List<MyClass> classes;
    
        @Autowired
        public void setClasses(List<MyClass> classes) {
            this.classes = classes;
        }
    
    
    }
    

    希望这会有所帮助。

    【讨论】:

    • 没关系(@Autowired 的位置),问题的来源对我来说很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多