Spring: 为什么我们自动连接接口而不是实现的类?

例子

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
  • 为什么我们自动连接接口而不是实现的类?
222815 次浏览

Spring 如何知道使用哪种多态类型。

只要接口只有一个实现,并且该实现使用启用 Spring 组件扫描的 @Component进行注释,Spring 框架就可以找到(接口,实现)对。如果未启用组件扫描,则必须在 application-config.xml (或等效的 Spring 配置文件)中显式定义 bean。

我需要“限定词”还是“资源”?

一旦您有了多个实现,那么您需要对每个实现进行限定,并且在自动连接期间,您将需要使用 @Qualifier注释来注入正确的实现,以及 @Autowired注释。如果使用@Resource (J2EE 语义) ,那么应该使用此注释的 name属性指定 bean 名称。

为什么我们自动连接接口而不是实现的类?

首先,通常对接口进行编码总是一个很好的实践。其次,对于 Spring,您可以在运行时注入任何实现。一个典型的用例是在测试阶段注入模拟实现。

interface IA
{
public void someFunction();
}




class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}




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();
}

Bean 配置应该如下所示:

<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />

或者,如果在包上启用了组件扫描,那么应该使用 @Component对每个类进行如下限定:

interface IA
{
public void someFunction();
}


@Component(value="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}




@Component(value="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}


@Component
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;


....
worker.someFunction();
}

然后 MyRunner中的 worker将被注入一个类型为 B的实例。

此外,它可能会导致日志中的一些警告,如 无法代理方法。还有许多其他的原因在这里描述 为什么总是在服务和道层中有单一的实现接口?

只有在我在.XML 配置文件中声明以下 bean 时,它才对我有效,因为 @ Autowired后期处理程序

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"></bean>