例子
interface IA
{
public void someFunction();
}
@Resource(name="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Resource(name="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
worker.someFunction();
}
谁可以给我解释一下这个。
- spring 如何知道要使用哪种多态类型。
- 我需要
@Qualifier
还是@Resource
? - 为什么我们自动装配接口而不是实现的类?
原文由 stackoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议
只要接口只有一个实现,并且该实现被注释为
@Component
并启用 Spring 的组件扫描,Spring 框架就可以找到(接口,实现)对。如果未启用组件扫描,则必须在 application-config.xml(或等效的 spring 配置文件)中明确定义 bean。一旦你有多个实现,那么你需要对它们中的每一个进行限定,并且在自动装配期间,你需要使用
@Qualifier
注释来注入正确的实现,以及@Autowired
注释。如果您使用@Resource(J2EE 语义),那么您应该使用此注释的name
属性指定 bean 名称。首先,通常对接口进行编码始终是一个好习惯。其次,对于 spring,您可以在运行时注入任何实现。一个典型的用例是在测试阶段注入模拟实现。
您的 bean 配置应如下所示:
或者,如果您在存在这些组件的包上启用了组件扫描,那么您应该使用
@Component
来限定每个类,如下所示:然后
worker
中的MyRunner
将被注入B
类型的实例。