当前位置: 首页 > 知识库问答 >
问题:

spring core与xml配置中的自动冲突

苏墨竹
2023-03-14
public interface Vehicle {
     public void start();
     public void stop();
}
@Component(value="car")
public class Car implements Vehicle {

     @Override
     public void start() {
           System.out.println("Car started");
     }

     @Override
     public void stop() {
           System.out.println("Car stopped");
     }
 }

@Component(value="bike")
public class Bike implements Vehicle {

     @Override
     public void start() {
          System.out.println("Bike started");
     }

     @Override
     public void stop() {
          System.out.println("Bike stopped");
     }
}

@Component
public class VehicleService {

    @Autowired
    @Qualifier("bike")
    private Vehicle vehicle;

    public void service() {
         vehicle.start();
         vehicle.stop();
    }
}

这是一个很好的例子来解决这个问题。

但是当我在应用程序上下文中遇到相同的问题但没有这些应答器时:

<context:component-scan></context:component-scan>
<context:annotation-config></context:annotation-config>

使用@qualifier注释解决了所有问题,但在我的示例中,我们没有使用允许使用注释的应答器。

我搜索了很多,发现有人在bean声明 中谈论autowire属性,我需要更多关于它的解释。

共有1个答案

许嘉福
2023-03-14

我如何仅仅使用应用程序上下文中的配置来修复这个问题?

您可以使用qualifier标记,如下所示(请参阅https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers)

<context:annotation-config/>
  <beans>
    <bean class="your_pkg_route.Vehicle">
      <qualifier value="bike"/>
    </bean>
  </beans>
</context:annotation-config>

我发现人们在bean声明中谈论autowire属性,我需要更多关于它的解释

在bean声明方法上使用的@autowired通过(另一个)声明的bean注入定义的依赖项。现在,如果您的依赖项在应用程序的相同上下文中,则根本不需要使用@autowired注释,因为Spring能够自己解决它们。因此,如果您的依赖关系在您的applicatoin上下文之外,那么您可以使用它。

例如,以下代码作为参考:

@Autowired
@Bean
public MyBean getMybean(Dependency1 depdency1, Dependency2 depdency2) {
    return new MyBean(depdency1.getSomeStuff(), depdency2.getSomeOtherStuff());
}

在这里,@autowired将找到dependency1dependency2的实例,并将它们提供给创建MyBean的实例。

从Pro Spring 5...Spring支持五种自动连接模式。

  • byname:当使用byname自动连接时,Spring尝试将每个属性连接到一个同名的bean。因此,如果目标bean具有名为foo的属性,并且在applicationcontext中定义了foobean,则foobean被分配给目标的foo属性。
  • bytype:当使用bytype自动连接时,Spring尝试通过在applicationcontext中自动使用相同类型的bean来连接目标bean上的每个属性。
  • constructor:它的功能与bytype连接类似,只不过它使用构造函数而不是setter来执行注入。Spring尝试在构造函数中匹配尽可能多的参数。因此,如果bean有两个构造函数,一个接受string;另一个接受stringinteger;并且在applicationcontext中同时有stringintegerbean,则Spring使用双参数构造函数。
  • default:Spring将自动在constructorbytype模式之间进行选择。如果bean有一个缺省(无参数)构造函数,那么Spring使用bytype;否则,它将使用构造函数。
  • :这是默认值

因此,在您的情况下,您需要这样做(但是,我不推荐这样做。为什么?您需要将vehicle类声明为一个bean和一个组件,这是不正确的,请参见spring:@component versus@bean。另一方面,我不确定您是否可以将其声明为一个bean):

// xml config
<context:annotation-config/>
  <beans>

    // use the primary tag here too! in order to say this the primary bean
    // this only works when there are only two implementations of the same interface
    <bean id="bike" primary="true" class="your_pkg_route.Bike"/>
    <bean id="car" class="your_pkg_route.Car"/>         

    <bean autowire="byName" class="your_pkg_route.VehicleService"/>

  <beans>
</context:annotation-config>

// VehicleService
@Component
public class VehicleService {

    private Vehicle bike;   // call attribute 'bike' so it is autowired by its name

    public void service() {
         //...
    }
}

正如您所看到的,尝试使用xml config来完成此操作有很多复杂的地方,因此我建议您在可能的情况下使用annotation选项。

相关岗位:

  • 为什么在Spring配置类中的@bean方法上不需要@autowired?
  • @bean与@autowired之间的区别
 类似资料:
  • 问题内容: 在最近我从事的一些大型项目中,选择其中一种(XML或注释)似乎变得越来越重要。随着项目的发展,一致性对于可维护性非常重要。 我的问题是:与基于注释的配置相比,基于XML的配置有哪些优势?与基于XML的配置相比,基于注释的配置有哪些优势? 问题答案: 注释有其用途,但它们不是杀死XML配置的灵丹妙药。我建议将两者混合! 例如,如果使用Spring,则将XML用于应用程序的依赖注入部分是完

  • 问题内容: 随着Java 9的临近,我认为将一些项目移植到Java 9是一个很好的学习练习。在我的一个项目中,我对rxjava和rxjavafx有依赖性 我想将此项目创建为命名模块。要做到这一点,我需要创建一个文件,我需要为指定的要求,并在这里。但是,这些库还没有任何模块信息。 为了解决这个问题,我读到我需要创建自动模块。据我了解,我需要将 重命名为一个简单的名称,然后在h参数中列出jars 。然

  • 随着Java9的临近,我认为将我的一些项目移植到Java9将是一个很好的学习练习。在我的一个项目中,我对rxjava和rxjavafx有依赖关系 我想创建这个项目作为一个命名模块。为此,我需要创建一个文件,我需要在这里指定和的要求。但是,这些库还没有任何模块信息。 为了解决这个问题,我读到我需要创建自动模块。据我所知,我需要重命名和jar,使其具有一个简单的名称,然后在参数中列出jar。然后在我的

  • 我有一个Spring Boot Web应用程序,它尝试使用Hibernate访问我的数据库。我还有一个不同的、没有spring boot应用程序,它尝试访问相同的数据库。 我正在使用一个带注释的类配置无Spring Boot应用程序。 由于某些原因,Spring Boots自动配置的作用与注释类配置不同。 如果第一次连接到数据库并使用hibernate ddl创建模式,然后使用另一种配置方式重新连

  • 我的项目中有一堆测试,它们都用@SpringBootTest注释,因此加载了一个SpringBoot上下文。 最近,我重构了一个测试,在这个测试中,我想要一个更小的范围(它是关于camunda的进程复盖率)到@RunWith(SpringJunit4ClassRunner.class)。因为这意味着没有上下文是自动加载的,所以我用静态内部类配置“手动”创建了一些bean。整个测试如下所示: 我不能

  • 基本上,我想问的是:将Spring Boot自动配置的bean自动导入XML配置文件的等价物是什么? 下面是我的主要Spring Boot入口点,它只是所有文档中列出的标准类: 我主要在一个Spring集成应用程序中使用它,在这个应用程序中Java配置还没有得到很好的支持,框架的核心是基于XML配置的,但是我希望在一些集成元素中使用Spring Boot自动配置的和bean。 https://gi