Bean的自动装配

Bean的自动装配

bean自动装配的特点:

  • 自动装配是spring满足bean依赖的一种方式
  • Spring会在上下文中自动寻找并自动给bean装配属性

在Spring中有三种装配的方式

  • 在xml中显示的装配
  • 在java中显示的装配
  • 隐式的自动装配

其中在xml中显示的装配是我们之前就开始学的。

我们搭建一个环境:一个人有两只宠物来以此为案例讲解隐式的自动装配

第一只宠物Dog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.dwx.pojo;

public class Dog {
//对于一个宠物 我们只要求它会叫
public void shoot(){
System.out.println("汪汪队立大功");
}

@Override
public String toString() {
return "Dog{}";
}
}

第二只宠物Cat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.dwx.pojo;

public class Cat {
//对于一个宠物 我们只要求它会叫
public void shoot(){
System.out.println("喵喵队闯大祸");
}

@Override
public String toString() {
return "Cat{}";
}
}

主人

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
55
56
57
58
59
60
61
62
package com.dwx.pojo;

public class Person {
//对于一个人 他有自己的基本属性以及一只猫一只狗
private String name;
private int id;
private Dog dog;
private Cat cat;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public Dog getDog() {
return dog;
}

public void setDog(Dog dog) {
this.dog = dog;
}

public Cat getCat() {
return cat;
}

public void setCat(Cat cat) {
this.cat = cat;
}

public Person(String name, int id, Dog dog, Cat cat) {
this.name = name;
this.id = id;
this.dog = dog;
this.cat = cat;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", id=" + id +
", dog=" + dog +
", cat=" + cat +
'}';
}

public Person() {
}
}

当时用手动装配

当时用手动装配 我们的xml就会是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--首先装配我们的引用类型-->
<bean id="cat" class="com.dwx.pojo.Cat"/>
<bean id="dog" class="com.dwx.pojo.Dog"/>
<!--装配我们的操作对象-->
<bean id="person" class="com.dwx.pojo.Person">
<property name="name" value="dwx"/>
<property name="id" value="123456"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>


</beans>

当使用自动装配

所谓的自动装配就是不用再去自己写property等的参数了,只需要在<bean/>中加上autowire=""这个参数即可

自动装配也不止一种,而且各有各的局限性

当使用ByName自动装配

1
2
3
4
<bean id="person" class="com.dwx.pojo.Person" autowire="byName">
<property name="name" value="dwx"/>
<property name="id" value="123456"/>
</bean>

赋值还是需要用<property>,但是对于引用类型的匹配已经不用我们自己去匹配了

但是byName的局限性就是,我们在Person中的参数名字必须和我们引用类型注册的id一致,否则将找不到。

当使用ByType自动装配

1
2
3
4
<bean id="person" class="com.dwx.pojo.Person" autowire="byType">
<property name="name" value="dwx"/>
<property name="id" value="123456"/>
</bean>

局限性在于,如果两个参数的类型是相同的,就不能用这种装配方式

当使用注解装配

使用注解装配有两种注解@Autowired@Resource

两者的区别:

  • @Autowired是先执行byType查找,如果出现两种以上的类型采用byName
  • @Resource是先执行byName查找,当找不到时才是用byType查找

两者使用时的共同特点:

  • 要现在xml中进行装配
  • 要使用时在xml体中使用<context:annotation-config/>

修改后的xml

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">


</beans>

xml的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
>

<context:annotation-config/>
<!--首先装配我们的引用类型-->
<bean id="cat" class="com.dwx.pojo.Cat"/>
<bean id="dog" class="com.dwx.pojo.Dog"/>
<bean id="person" class="com.dwx.pojo.Person">
<property name="name" value="dwx"/>
<property name="id" value="123456"/>
</bean>


</beans>

注解添加的位置

两种注解添加的位置都一样,要不是在需要进行注解的元素上,要不在set方法上

如果在元素上加上注解,这个元素就不用写其对应的set方法了

使用注解的例子:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package com.dwx.pojo;

import org.springframework.beans.factory.annotation.Autowired;

public class Person {
//对于一个人 他有自己的基本属性以及一只猫一只狗
private String name;
private int id;
@Autowired
private Dog dog;
@Autowired
private Cat cat;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public Dog getDog() {
return dog;
}

public void setDog(Dog dog) {
this.dog = dog;
}

public Cat getCat() {
return cat;
}

public void setCat(Cat cat) {
this.cat = cat;
}

public Person(String name, int id, Dog dog, Cat cat) {
this.name = name;
this.id = id;
this.dog = dog;
this.cat = cat;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", id=" + id +
", dog=" + dog +
", cat=" + cat +
'}';
}

public Person() {
}
}
package com.dwx.pojo;

import org.springframework.beans.factory.annotation.Autowired;

public class Person {
//对于一个人 他有自己的基本属性以及一只猫一只狗
private String name;
private int id;
@Autowired
private Dog dog;
@Autowired
private Cat cat;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public Dog getDog() {
return dog;
}

public void setDog(Dog dog) {
this.dog = dog;
}

public Cat getCat() {
return cat;
}

public void setCat(Cat cat) {
this.cat = cat;
}

public Person(String name, int id, Dog dog, Cat cat) {
this.name = name;
this.id = id;
this.dog = dog;
this.cat = cat;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", id=" + id +
", dog=" + dog +
", cat=" + cat +
'}';
}

public Person() {
}
}

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信