如何指定Spring应该使用哪个子类

时间:2013-06-05 11:09:08

标签: java spring inheritance annotations

在我的基于Spring的项目中,我有一个带有类

的核心模块('核心')
@Component
public class Superclass {
    // stuff
}

在整个代码中按类型注入的实例如下:

public class AService {

    @Autowired
    private Superclass superclass;

    // service stuff
}

我还有另外两个依赖核心模块的模块,其中一个(我们称之为'module1')扩展超类

@component
public class Subclass extends Superclass {
    // overridden stuff
}

另一个模块('module2')按原样使用超类

现在我希望当我编译并运行'child1'时,子类的实例在任何地方都会使用超类的实例。所以我写了一个配置类:

@Configuration
public class Module2Configuration {

    @Bean
    public Superclass superclass(){
        return new Subclass();
    }
}

当我运行此操作时,我看到 超类 子类实例化,这肯定是不是< / strong>我想要的。如何在'module1'中指定Spring应该实例化哪个类型?

3 个答案:

答案 0 :(得分:3)

您可以使用@Qualifier(“some name”)注释。 有关于此的更多信息:http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/

答案 1 :(得分:1)

Spring急切地实例化单例bean,如文档中所述:

  

默认情况下,ApplicationContext实现会急切地创建和配置所有单例bean,作为初始化过程的一部分。

这可以解释为什么同时创建@Components

要指定哪个实现作为依赖项提供,您可能需要检查Qualifiers,以便在不同的实现之间进行选择。结合延迟加载,这应该可以解决问题。

根据您的个人喜好,您还可以使用委派代替使用独立界面继承:

public interface MyService {
    public String foobar(int baz);
}

public static class CommonBehavior {
    // whatever is used by Superclass and Subclass
}

@Component @Lazy
public class FormerSuperClass implements MyService {
   private final CommonBehavior ...;
   ...
}

@Component @Lazy
public class FormerSubClass implements MyService {
   private final CommonBehavior ...;
   ...
}
祝你好运!

答案 2 :(得分:0)

有两种方法:使用@Qualifier(“SubclassName”)或将您的子类标记为@Component并在@Autowired

时声明子类

在你的情况下:

  1. 使用@Qualifier(“SubclassName”)

    @Component
    public class Superclass {
        // stuff
    }
    
    @component
    public class Subclass extends Superclass {
        // overridden stuff
    }
    
    public class AService {
    
        @Autowired
        @Qualifier("Subclass")
        private Superclass superclass;
    
        // service stuff
    }
    
  2. 2.将您的子类标记为@Component,并在@Autowired

    时声明子类
        public class Superclass {
            // stuff
        }
    
        @component
        public class Subclass extends Superclass {
            // overridden stuff
        }
    
        public class AService {
    
            @Autowired
            private Subclass subclass;
    
            // service stuff
        }