【问题标题】:Overriding beans defined by @Component with beans defined in xml用 xml 中定义的 bean 覆盖 @Component 定义的 bean
【发布时间】:2016-06-08 08:15:00
【问题描述】:

我有一个服务 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),并且已经在 'pom.xml' 中配置了依赖项。

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

每当project 2启动时,RegionalMyServiceImpl对象应该被传递给构造函数'MyController'。这个类应该已经定义了方法3的实现,并扩展了MyServiceImpl的所有方法。

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    并编辑 bean 定义:

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

    【讨论】:

    • 如果这种方法确实有效(我还没有测试过),那么我将不得不在我的项目中将我的服务注入更改为 RegionalMyServiceImpl。存在大量控制器。
    • 对我来说,到处更改服务注入不是问题。查找和替换很简单(您将更改多少个文件?10 个文件,100 个文件,...?)这里的问题是我的解决方案如何提高您的代码质量。此外,如果我是你,我会先测试我的解决方案是否有效,然后再担心你花了多少精力来修复。即使是我的解决方案也不适合您,但您至少还有 1 个选择。
    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2013-10-02
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多