1

前几天我在我的代码库中发现了以下非正统的配置,这让我感到奇怪。当我将接口名称也用作 bean 的名称时,预期的 Spring Context 行为是什么?如果我在控制器中使用 @Autowireing 会有所不同吗?以下代码段说明了此设置:

interface MyAppService {...}

class InfrastructureService implements MyAppService {...}

class AdministrationService implements MyAppService {...}

class InfrastructureController {
   // some code
   public void setMyAppService(MyAppService svc){...}
}

<bean id="myAppService" class="InfrastructureService"/>

<bean id="administrationService" class="AdministrationService"/>

<bean id="infrastructureController" class="InfrastructureController">
   <property name="myAppService" ref="myAppService"/>
</bean>

或者,如果仅将控制器定义为:

class InfrastructureController {
   @Autowired
   public void setMyAppService(MyAppService svc){...}
}
4

2 回答 2

2

为什么在这里很重要?id您在 xml 中引用 bean ,而不是按接口类型。

<property name="myAppService" ref="myAppService"/>

这意味着命名的属性将注入myAppService带有 id 的 bean 。myAppService与接口无关。

编辑:如果您使用带有注释的自动装配,并且您将同一接口的许多不同实现注册为组件,那么您必须使用qualifiers来告诉Spring您将使用哪个实现。如果您只注册了一个实现,则无需执行任何操作。

于 2012-09-27T12:01:16.490 回答
0

如果您单独放置@AutoWired,它会按类型搜索依赖项(在您的情况下是MyAppService)。如果您想缩小依赖项搜索范围,可以使用@Qualifier,如下所示:

class InfrastructureController {
@Autowired
@Qualifier("NAME_OF_BEAN")
public void setMyAppService(MyAppService svc){...}
}
于 2012-09-27T12:10:40.123 回答