我有一个服务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 中为空)的实现。此类应存在于与 MyServiceImpl(例如项目 1)不同的项目(例如项目 2)中,并且具有已在"pom.xml"中配置的依赖项。
public class RegionalMyServiceImpl extends MyServiceImpl {
method3(){
//Implementation of method3() goes here
}
...
}
每当启动项目 2 时,都应将 RegionalMyServiceImpl 对象传递给构造函数 'MyController'。这个类应该已经定义了方法3的实现,并且也扩展了MyServiceImpl的所有方法。
为了做到这一点,我用类RegionalMyServiceImpl配置了"myService"的bean名称。根据我的理解,xml中的bean定义应该覆盖通过注释@Component构造的bean,每当我启动项目2时,myService的bean实际上是RegionalMyServiceImpl而不是MyServiceImpl。
<bean id="myService" class="com.demo.RegionalMyServiceImpl"></bean>
这应该有效吗?有没有更好的方法?
您可以在控制器中执行此操作:
@Autowired
@Qualifier("RegionalMyServiceImpl")
private MyService myService;
并编辑 Bean 定义:
<bean name="RegionalMyServiceImpl" class="com.demo.RegionalMyServiceImpl"></bean>