如何使用注释按名称覆盖Spring服务bean

鉴于我将Spring bean配置为
@Service("myService")
public class DefaultService extends MyService {
}
和一个使用这个bean的类
public class Consumer {
    @Autowired
    @Qualifier("myService")
    private MyService service;
    ...
}
我现在希望我的项目(包括前面的类)能够注入另一个
MyService
的实现。因此我想覆盖豆
myService
@Service("myService")
public class SpecializedService implements MyService {
}
导致
Consumer
现在携带
SpecializedService
而不是
DefaultService
的实例。根据定义,我不能在Spring容器中有两个具有相同名称的bean。我怎么能告诉spring,新服务的定义是否会覆盖旧服务?我不想修改
Consumer
类。     
已邀请:
要么显式定义服务bean
<bean id="myService" class="x.y.z.SpecializedService" />
或组件扫描它。 在任何一种情况下,在您的应用程序上下文中,避免显式定义DefaultService并避免对其进行组件扫描。     
使用过滤器将其从组件扫描中排除
<component-scan base-package="your-package">
    <exclude-filter type="regex" expression="DefaultService" />
</component-scan>
不确定是否有办法只使用注释(除了从DefaultService中删除@Service注释)。     
基于注释的布线在基于XML的配置之前发生,这意味着在XML中定义的bean将会 覆盖Annotations完成的那些布线。 因此,像威利所说的那样,在XML中明确地定义它将会完成这项工作
<bean id="myService" class="x.y.z.SpecializedService" />
Spring建议将XML用于服务和存储库bean以及MVC bean的注释。它还建议@Autowired没有组件扫描。但是注释通常受到鼓励,尽管它将代码和配置合并在一起(针对关注点的分离)。 第二件事是使用@Qualifiers(“声明bean的id”)传递它。     
我知道,它迟到了。仍在发布。 对于MyService的不同实现,您应该具有不同的名称。 例如
@Service("mySpecializedService")
public class SpecializedService implements MyService {
}

@Service("myService")
public class DefaultService extends MyService {
 }
在自动装配它们时(例如在Controller中),您可以使用@Qualifier注入所需的实现,如下所述。 获得默认实现
@Autowired
@Qualifier("myService")
MyService myService;   
获得专门的实施
@Autowired
@Qualifier("mySpecializedService")
MyService myService;
    

要回复问题请先登录注册