Spring @Autowire
bean:byName还是byType?如果不可能,是否使用其他模式进行了第二次试验?
答案 0 :(得分:27)
如果使用@Autowired
注释,它将注入具有匹配类型的bean(如果有多个类型,将抛出异常)。要指定名称,请使用@Qualifier
注释。
答案 1 :(得分:3)
弹簧@Autowire
按类型连接。按名称连接,您也可以使用
@Resource(name = "id")
答案 2 :(得分:1)
@Autowired
的默认模式为byType
。
答案 3 :(得分:1)
Autowired
注释等效于xml属性autowire="byType"
XML属性autowire
自称为no
"no":
The traditional Spring default. No automagical wiring. Bean references
must be defined in the XML file via the <ref/> element (or "ref"
attribute). We recommend this in most cases as it makes documentation
more explicit.
答案 4 :(得分:0)
这些不是,byName,byType,构造函数和自动检测。默认模式为否,即默认情况下,在基于XML的传统配置中自动布线功能处于关闭状态。
使用@Autowired注释-
1)@自动连接属性:
在属性上使用@Autowired时,等效于在配置文件中按byType自动布线。
2)@自动设置属性设置器:
在设置器上使用@Autowired时,它也等效于在配置文件中按byType自动布线。
3)@Autowired在构造函数上:
在bean的构造函数上使用@Autowired时,它也等效于构造函数在配置文件中自动布线。
使用@Qualifier解决依赖关系解析中的冲突
我们了解到,如果我们在byType模式下使用自动装配,则会在属性类类型中查找依赖项。如果找不到这样的类型,则会引发错误。但是,如果有两个或多个相同类类型的bean,该怎么办?
在这种情况下,spring将无法选择正确的bean来注入属性,因此您需要使用限定符来帮助容器。
要使用限定符解析特定的bean,我们需要将@Qualifier注释与@Autowired注释一起使用,并将bean名称传递到注释参数中。
答案 5 :(得分:0)
我刚刚签出了spring-beans-5.2.7.RELEASE.jar的源代码。它包含带有方法的类DefaultListableBeanFactory
@Nullable
protected String determineAutowireCandidate(Map<String, Object> candidates, DependencyDescriptor descriptor) {
Class<?> requiredType = descriptor.getDependencyType();
String primaryCandidate = determinePrimaryCandidate(candidates, requiredType);
if (primaryCandidate != null) {
return primaryCandidate;
}
String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType);
if (priorityCandidate != null) {
return priorityCandidate;
}
// Fallback
for (Map.Entry<String, Object> entry : candidates.entrySet()) {
String candidateName = entry.getKey();
Object beanInstance = entry.getValue();
if ((beanInstance != null && this.resolvableDependencies.containsValue(beanInstance)) ||
matchesBeanName(candidateName, descriptor.getDependencyName())) {
return candidateName;
}
}
return null;
}
我们可以看到它尝试按类型自动接线。如果没有成功,它将尝试在此行中按名称自动接线
matchesBeanName(candidateName, descriptor.getDependencyName()))