在我的基于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应该实例化哪个类型?
答案 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
时声明子类在你的情况下:
使用@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.将您的子类标记为@Component,并在@Autowired
时声明子类 public class Superclass {
// stuff
}
@component
public class Subclass extends Superclass {
// overridden stuff
}
public class AService {
@Autowired
private Subclass subclass;
// service stuff
}