覆盖由@Component定义的bean以及在xml中定义的bean

时间:2016-02-25 13:54:43

标签: spring spring-mvc annotations override managed-bean

我有一个服务MyService。在我的控制器中,MyController我注入了这样的服务:

@Controller("myController")
@RequestMapping("/myController/dcb")
public class MyController{
...
@Autowired
private MyService myService;
...
}

以下是服务定义:

public interface MyService{
method1();
method2();
}

以下是我通常使用的服务实现。

@Service
@Component("myService")
public class MyServiceImpl implements MyService{
...
@Override
method1(){
//Implementation of method1()
}

@Override
method2(){
//Implementation of method2()
method3();
}

method3(){
//This method is blank here
}
...
}

现在根据需求,我需要使用 MyServiceImpl 的扩展,它将提供method3()(在 MyServiceImpl 中为空)的实现。此类应出现在单独的项目(比如项目2)中,而不是 MyServiceImpl (比如项目1),并且已在&#39; pom.xml&#39;中配置了依赖项。< /强>

public class RegionalMyServiceImpl extends MyServiceImpl {
method3(){
//Implementation of method3() goes here
}
...
}

每当项目2 启动时, RegionalMyServiceImpl 对象应该传递给构造函数&#39; MyController &#39; 。该类应该已经定义了方法3的实现,并且也扩展了MyServiceImpl的所有方法。

为了做到这一点,我通过&#39; myService &#39;配置了bean名称。使用 RegionalMyServiceImpl 类。根据我的理解,xml中的bean定义应该覆盖通过注释 @Component 构造的bean,每当我启动项目2时, myService 的bean实际上都是 RegionalMyServiceImpl ,而不是 MyServiceImpl

<bean id="myService" class="com.demo.RegionalMyServiceImpl"></bean>

这应该有用吗?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:0)

你可以在控制器中这样做:

@Autowired
@Qualifier("RegionalMyServiceImpl")
private MyService myService;

并编辑bean定义:

<bean name="RegionalMyServiceImpl" class="com.demo.RegionalMyServiceImpl"></bean>