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
属性,我需要更多关于它的解释。
我如何仅仅使用应用程序上下文中的配置来修复这个问题?
您可以使用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
将找到dependency1
和dependency2
的实例,并将它们提供给创建MyBean
的实例。
从Pro Spring 5...Spring支持五种自动连接模式。
byname
:当使用byname
自动连接时,Spring尝试将每个属性连接到一个同名的bean。因此,如果目标bean具有名为foo
的属性,并且在applicationcontext
中定义了foo
bean,则foo
bean被分配给目标的foo
属性。bytype
:当使用bytype
自动连接时,Spring尝试通过在applicationcontext
中自动使用相同类型的bean来连接目标bean上的每个属性。constructor
:它的功能与bytype
连接类似,只不过它使用构造函数而不是setter来执行注入。Spring尝试在构造函数中匹配尽可能多的参数。因此,如果bean有两个构造函数,一个接受string
;另一个接受string
和integer
;并且在applicationcontext
中同时有string
和integer
bean,则Spring使用双参数构造函数。default
:Spring将自动在constructor
和bytype
模式之间进行选择。如果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选项。
相关岗位:
问题内容: 在最近我从事的一些大型项目中,选择其中一种(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