- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以帖子Spring @Autowired and @Qualifier为引用
我们有这个例子来解决 Autowiring 冲突:
public interface Vehicle {
public void start();
public void stop();
}
有两个 bean ,Car
和 Bike
工具 Vehicle
界面。
@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
解决了注释,但在我的例子中,我们不使用允许使用注释的应答器。
问题是:
如何仅使用应用程序上下文中的配置来解决此问题,仅此而已,不使用注释?
我搜索了很多并且I found people talking about autowire
attribute in the bean declaration <bean id="dao" class="package.IDao" autowire="byName"></bean>
我需要更多的解释。
最佳答案
How can I fix this issue just using the configuration in application context?
您可以像下面这样使用 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>
I found people talking about autowire attribute in the bean declaration and I need more explanation about it
使用注释
@Autowired
用于 bean 声明方法,通过(另一个)声明的 bean 注入(inject)定义的依赖项。现在,如果您的依赖项与您的应用程序位于相同的上下文中,则您根本不需要使用 @Autowired
注释,因为 Spring 能够自行找出它们。因此,如果您的依赖项在您的应用上下文之外,那么您可以使用它。
例如,引用下面的代码:
@Autowired
@Bean
public MyBean getMybean(Dependency1 depdency1, Dependency2 depdency2) {
return new MyBean(depdency1.getSomeStuff(), depdency2.getSomeOtherStuff());
}
在这里,@Autowired
将找到 Dependency1
和 Dependency2
的实例,并将提供它们用于创建 MyBean
的实例。
使用xml配置
从 Pro Spring 5 ... Spring 支持五种 Autowiring 模式。
byName
:当使用 byName
Autowiring 时,Spring 尝试将每个属性装配到同名的 bean。因此,如果目标 bean 具有名为 foo
的属性,并且在 foo
中定义了 ApplicationContext
bean,则将 foo
bean 分配给目标的 foo
属性。byType
:当使用 byType
Autowiring 时,Spring 尝试连接每个通过自动使用相同类型的 bean 在目标 bean 上的属性 ApplicationContext
。constructor
:这个函数就像 byType
接线一样,除了它使用构造函数而不是 setter 来执行注入(inject)。 Spring 尝试在构造函数中匹配最大数量的参数。因此,如果您的 bean 有两个构造函数,一个接受 String
,另一个接受 String
和 Integer
,并且您的 String
中同时有一个 Integer
和一个 ApplicationContext
bean,则 Spring 使用双参数构造函数。default
:Spring 将在 constructor
和 byType
模式之间进行选择自动地。如果您的 bean 具有默认(无参数)构造函数,则 Spring 使用 byType
;否则,它使用构造函数。no
: 这是默认值所以,在你的情况下你需要做这样的事情(但是,我不推荐它。为什么?,你需要将 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 配置执行此操作会很复杂,因此我建议您尽可能使用注释选项。
相关帖子:
PS:我没有测试任何发布的代码。
关于java - spring 核心中的 Autowiring 冲突与 xml 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55572845/
正如标题中所问,我有两个如下结构的 XML 文件 A.xml //here I want to include B.xml
我有一个 xml 文件。根据我的要求,我需要更新空标签,例如我需要更改 to .是否可以像那样更改标签.. 谢谢... 最佳答案 var xmlString=" "; var properStri
我有这样简单的 XML: Song Playing 09:41:18 Frederic Delius Violin Son
在我的工作中,我们有自己的 XML 类来构建 DOM,但我不确定应该如何处理连续的空格? 例如 Hello World 当它被读入 DOM 时,文本节点应该包含 Hello 和 World
我有以下 2 个 xml 文件,我必须通过比较 wd:Task_Name_ID 和 TaskID 的 XML 文件 2。 例如,Main XML File-1 wd:Task_Name_ID 具有以下
我在 Rails 应用程序中有一个 XML View ,需要从另一个文件插入 XML 以进行测试。 我想说“构建器,只需盲目地填充这个字符串,因为它已经是 xml”,但我在文档中看不到这样做的任何内容
我正在重建一些 XML 提要,因此我正在研究何时使用元素以及何时使用带有 XML 的属性。 一些网站说“数据在元素中,元数据在属性中。” 那么,两者有什么区别呢? 让我们以 W3Schools 为例:
在同一个文档中有两个 XML 声明是否是格式正确的 XML? hello 我相信不是,但是我找不到支持我的消息来源。 来自 Extensible Markup Language
我需要在包装器 XML 文档中嵌入任意(语法上有效的)XML 文档。嵌入式文档被视为纯文本,在解析包装文档时不需要可解析。 我知道“CDATA trick”,但如果内部 XML 文档本身包含 CDAT
XML 解析器和 XML 处理器是两个不同的东西吗?他们是两个不同的工作吗? 最佳答案 XML 解析器和 XML 处理器是一样的。它不适用于其他语言。 XML 是通用数据标记语言。解析 XML 文件已
我使用这个 perl 代码从一个文件中读取 XML,然后写入另一个文件(我的完整脚本有添加属性的代码): #!usr/bin/perl -w use strict; use XML::DOM; use
我正在编写一个我了解有限的历史脚本。 对象 A 的类型为 system.xml.xmlelement,我需要将其转换为类型 system.xml.xmldocument 以与对象 B 进行比较(类型
我有以下两个 XML 文件: 文件1 101 102 103 501 502 503
我有以下两个 XML 文件: 文件1 101 102 103 501 502 503
我有一个案例,其中一个 xml 作为输入,另一个 xml 作为输出:我可以选择使用 XSL 和通过 JAXB 进行 Unmarshalling 编码。性能方面,有什么真正的区别吗? 最佳答案 首先,程
我有包含 XML 的 XML,我想使用 JAXB 解析它 qwqweqwezxcasdasd eee 解析器 public static NotificationRequest parse(Strin
xml: mario de2f15d014d40b93578d255e6221fd60 Mario F 23 maria maria
尝试更新 xml 文件数组时出现以下错误。 代码片段: File dir = new File("c:\\XML"); File[] files = dir.listFiles(new Filenam
我怎样才能完成这样的事情: PS /home/nicholas/powershell> PS /home/nicholas/powershell> $date=(Get-Date | ConvertT
我在从 xml 文件中删除节点时遇到一些困难。我发现很多其他人通过各种方式在 powershell 中执行此操作的示例,下面的代码似乎与我见过的许多其他示例相同,但我没有得到所需的行为。 我的目标是将
我是一名优秀的程序员,十分优秀!