@Autowire默认模式

时间:2011-04-14 15:00:20

标签: spring autowired

Spring @Autowire bean:byName还是byType?如果不可能,是否使用其他模式进行了第二次试验?

6 个答案:

答案 0 :(得分:27)

如果使用@Autowired注释,它将注入具有匹配类型的bean(如果有多个类型,将抛出异常)。要指定名称,请使用@Qualifier注释。

答案 1 :(得分:3)

弹簧@Autowire按类型连接。按名称连接,您也可以使用

@Resource(name = "id")

答案 2 :(得分:1)

@Autowired的默认模式为byType

答案 3 :(得分:1)

变量或setters方法的

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()))