定义

所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。

依赖注入的几种方式

1.构造器注入

private AAAA aaaa;
private BBBB bbbb;
private CCCC cccc;
private DDDD dddd;

@Autowired
public Test(AAAA aaaa, BBBB bbbb, CCCC cccc, DDDD dddd) {
    this.aaaa = aaaa;
    this.bbbb = bbbb;
    this.cccc = cccc;
    this.dddd = dddd;
}

要点:
A.基于构造器注入依赖,会固定依赖注入的顺序;
B.这样的写法,当需要注入的依赖过多时,代码会显得冗余,可读性差;
C.在 Spring 4.3 及以后的版本中,如果这个类只有一个构造方法,那么这个构造方法上面也可以不写 @Autowired 注解。
2.setter注入

private AAAA aaaa;
private BBBB bbbb;

@Autowired
public void setAaaa(AAAA aaaa) {
    this.aaaa = aaaa;
}

@Autowired
public void setBbbb(BBBB bbbb) {
    this.bbbb = bbbb;
}

注意点:
Spring 4.3 及以后的版本中,setter 上面的 @Autowired 注解是可以不写的。
3.field注入

@Autowired
private AAAA aaaa;
@Autowired
private BBBB bbbb;

要点:
A.@Autowired按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false;
B.如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。

@Autowired与@Resource

@Resource@Autowired相同,也可以用于依赖注入。

不同点

1.提供方不同
@Resourcejavax.annotation.Resource中,由J2EE提供;
@Autowiredorg.springframework.beans.factory.annotation.Autowired中,由spring提供。

2.注入方式有所不同
@Autowired按类型装配依赖对象,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用;
@Resource默认按byName自动注入,也提供按照byType 注入,@Resource的装配顺序如下所示:
(1)如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常;
(2)如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常;
(3)如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常;
(4)如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

参考资料:
https://segmentfault.com/a/1190000021679236?utm_source=tag-newest
https://www.cnblogs.com/chansblogs/p/8343930.html
https://www.cnblogs.com/zq-ding/p/11535728.html

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

一个喜欢拔刀的萌新Coder