Spring依赖注入控制反转

依赖注入与控制反转基本概念

依赖注入:对于spring而言,将自己置身于spring的立场上去看,当调用方需要某一个类的时候我就为你提供这个类的实例,就是说spring负责将被依赖的这个对象赋值给调用方,那么就相当于我为调用方注入了这样的一个实例。从这方面来看是依赖注入。

控制反转:对于调用方来说,通常情况下是我主动的去创建的,也就是对于这个对象而言我是控制方,我有他产生与否的权力,但是,现在变了,现在变为spring来创建对象的实例,而我被动的接受,从这一点上看,是控制反转。

避免使用方,NEW 调用对象

注入方式

1.field注入

2.构造器注入
(1).IOC容器启动会严格检查,构造函数为空的参数会报错,脱离IOC使用会无法注入属性。
(2).避免构造方法中使用属性,NPE异常
Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired

3.setter注入

springboot 注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@ConstructorBinding
@ConfigurationProperties(prefix = "tom")
public class TomProperties {

private String name;
private String sex;
private int age;
private String country;
private Date entryTime;

public TomProperties(String name,
String sex,
int age,
@DefaultValue("China") String country,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date entryTime) {
this.name = name;
this.sex = sex;
this.age = age;
this.country = country;
this.entryTime = entryTime;
}

public String getName() {
return name;
}

public String getSex() {
return sex;
}

public int getAge() {
return age;
}

public String getCountry() {
return country;
}

public Date getEntryTime() {
return entryTime;
}

@Override
public String toString() {
return "TomProperties{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", country='" + country + '\'' +
", entryTime=" + entryTime +
'}';
}

}
1
2
3
4
5
tom:
name: Tom
sex: man
age: 18
entry-time: 2012-12-12 12:00:00

@ConstructorBinding 这个注解,就标识这个类的参数优先通过带参数的构造器注入,如果没有带参数的构造器则再通过 setters 注入
不支持 @Component、@Bean、@Import 等方式创建 bean 的构造器参数绑定