在阅读这篇文章之前,大家可以先参阅《理解Spring中的依赖注入和控制反转》一文,了解下依赖注入和控制反转的相关内容。
三种依赖注入的方式
属性注入,通过setter方法注入bean的属性值或依赖的对象 构造注入 工厂方法注入(很少使用)
例子
这里我们使用了spring-4.3.2,maven配置文件
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
|
< dependency > < groupid >org.springframework</ groupid > spring-core</ artifactid > < version >${org.springframework-version}</ version > < exclusions > < exclusion > < groupid >commons-logging</ groupid > commons-logging</ artifactid > </ exclusion > </ exclusions > </ dependency > < dependency > < groupid >org.springframework</ groupid > spring-beans</ artifactid > < version >${org.springframework-version}</ version > </ dependency > < dependency > < groupid >org.springframework</ groupid > spring-aop</ artifactid > < version >${org.springframework-version}</ version > </ dependency > < dependency > < groupid >org.springframework</ groupid > spring-context</ artifactid > < version >${org.springframework-version}</ version > </ dependency > < dependency > < groupid >commons-logging</ groupid > commons-logging</ artifactid > < version >1.2</ version > </ dependency > <!-- Junit --> < dependency > < groupid >junit</ groupid > junit</ artifactid > < version >3.8.1</ version > < scope >test</ scope > </ dependency > |
applicationContext.xml配置文件
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
|
<!--?xml version="1.0" encoding="UTF-8"?--> < beans xmlns = "https://www.springframework.org/schema/beans" xmlns:p = "https://www.springframework.org/schema/p" xmlns:util = "https://www.springframework.org/schema/util" xmlns:xsi = "https://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd https://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"> <!-- 配置bean id:标识容器中bean对象 class:bean的全类名,通过反射的方式在IOC容器中创建Bean,所以要求Bean类必须有无参构造器 --> < bean class = "com.spring.test.HelloWorld" id = "helloWorld" > < property name = "name" value = "crystal" ></ property > </ bean > <!-- 通过构造方法配置bean,可以指定参数的位置和类型,以区分重载的构造函数 --> < bean class = "com.spring.test.Car" id = "car" > < constructor-arg index = "0" value = "BENCHI" ></ constructor-arg > < constructor-arg index = "1" type = "double" value = "200000.0" ></ constructor-arg > </ bean > < bean class = "com.spring.test.Car" id = "car1" > <!-- 如果字面值包含特殊字符,使用<![CDATA[]]>包裹起来 属性值可以使用value子节点来配置 --> < constructor-arg type = "java.lang.String" > < value > <!--[CDATA[<shanghai--> ]]></ value > </ constructor-arg > < constructor-arg index = "1" type = "int" value = "200" ></ constructor-arg > </ bean > < bean class = "com.spring.test.Person" id = "person" > < property name = "name" value = "Crystal" ></ property > < property name = "age" value = "20" ></ property > <!-- 可以使用ref建立引用之间的关系 --> <!-- <property name="car" ref="car"></property> --> <!-- <property name="car"> <ref bean="car2"/> </property> --> <!-- <property name="car"> <bean class="com.spring.test.Car"> <constructor-arg value="changanFute"></constructor-arg> <constructor-arg value="3000000"></constructor-arg> <constructor-arg value="240"></constructor-arg> </bean> </property> --> <!-- 测试赋值null --> <!-- <property name="car"><null/></property> --> < property name = "car" ref = "car1" ></ property > <!-- 为级联属性赋值,注意:属性需要先初始化后才能为级联属性赋值,和structs2不同 --> < property name = "car.price" value = "400000" ></ property > </ bean > <!-- 测试配置集合属性 --> < bean class = "com.spring.test.collections.Person" id = "person3" > < property name = "name" value = "barry" ></ property > < property name = "age" value = "21" ></ property > < property name = "cars" > < list > < ref bean = "car" > < ref bean = "car1" > < bean class = "com.spring.test.Car" > < constructor-arg value = "changanFute" ></ constructor-arg > < constructor-arg value = "3000000" ></ constructor-arg > < constructor-arg value = "240" ></ constructor-arg > </ bean > </ ref ></ ref ></ list > </ property > </ bean > <!-- 配置Map的属性值 --> < bean class = "com.spring.test.collections.NewPerson" id = "newPerson" > < property name = "name" value = "lina" ></ property > < property name = "age" value = "22" ></ property > < property name = "cars" > <!-- 使用map节点及map的entry子节点配置Map类型的成员变量 --> < map > < entry key = "AA" value-ref = "car" ></ entry > < entry key = "BB" value-ref = "car1" ></ entry ></ map > </ property > </ bean > <!-- 配置Properties属性值 --> < bean class = "com.spring.test.collections.DataSource" id = "dataSource" > < property name = "properties" > <!-- 使用props和prop子节点来为Properties属性赋值 --> < props > < prop key = "user" >root</ prop > < prop key = "password" >1234</ prop > < prop key = "jdbcUrl" >jdbc:mysql://test</ prop > < prop key = "jdbcDriver" >com.mysql.jdbc.Driver</ prop > </ props > </ property > </ bean > <!-- 配置单例的集合bean,以供多个bean进行引用,需要导入util命名空间 --> < util:list id = "cars" > < ref bean = "car" > < ref bean = "car1" > </ ref ></ ref ></ util:list > < bean class = "com.spring.test.collections.Person" id = "person4" > < property name = "name" value = "Jackie" ></ property > < property name = "age" value = "30" ></ property > < property name = "cars" ref = "cars" ></ property > </ bean > <!-- 通过p命名空间为bean的属性赋值,需要先导入p命名空间,相对于传统配置方式更为简洁 --> < bean class = "com.spring.test.collections.Person" id = "person5" p:age = "32" p:cars-ref = "cars" p:name = "Queue" ></ bean > </ beans > |
1. 下面是简单的属性注入、构造注入的测试类
Car.java
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
|
package com.spring.test; public class Car { private String name; private int maxSpeed; private double price; public Car() { } public Car(String name, double price) { this .name = name; this .price = price; } public Car(String name, int maxSpeed) { this .name = name; this .maxSpeed = maxSpeed; } public Car(String name, double price, int maxSpeed) { this .name = name; this .price = price; this .maxSpeed = maxSpeed; } public void setPrice( double price) { this .price = price; } @Override public String toString() { return "Car [name:" + name + ", price:" + price + ", maxSpeed:" + maxSpeed + "]" ; } } |
HelloWorld.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package com.spring.test; public class HelloWorld { private String name; public HelloWorld() { System.out.println( "HelloWorld constructor..." ); } public String getName() { return name; } public void setName(String name) { System.out.println( "setName:" + name); this .name = name; } @Override public String toString() { return "hello," + name; } } |
Person.java
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
|
package com.spring.test; public class Person { private String name; private int age; private Car car; public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } public Car getCar() { return car; } public void setCar(Car car) { this .car = car; } @Override public String toString() { return "Person: [name=" + name + ", age=" + age + ", car=" + car + "]" ; } } |
Main.java
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
|
package com.spring.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { HelloWorld hello = new HelloWorld(); hello.setName( "barry" ); System.out.println( "print:" + hello + "\n" ); // 装入 Spring 配置文件 /** * 装入 Spring 配置文件 * ApplicationContext是IOC容器,它有两个主要实现类(ClassPathXmlApplicationContext和FileSystemXmlApplicationContext) * ApplicationContext在初始化上下文时就实例化所有单例的Bean */ ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext.xml" ); //HelloWorld hello1 = (HelloWorld) context.getBean("helloWorld"); // 通过id获取bean对象 HelloWorld hello1 = context.getBean(HelloWorld. class ); // 通过类型获取bean对象(要求在IOC容器里该类型的对象只能有一个) System.out.println(hello1); } @Test public void testContructor() { ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext.xml" ); Car car = (Car) context.getBean( "car" ); // 通过类型获取bean对象(要求在IOC容器里该类型的对象只能有一个) Car car1 = (Car) context.getBean( "car1" ); System.out.println(car); System.out.println(car1); Person person = (Person) context.getBean( "person" ); System.out.println(person); } } |
2. 下面是集合的测试类
NewPerson.java
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
|
package com.spring.test.collections; import java.util.Map; import com.spring.test.Car; public class NewPerson { private String name; private int age; private Map<string, car= "" > cars; public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } public Map<string, car= "" > getCars() { return cars; } public void setCars(Map<string, car= "" > cars) { this .cars = cars; } @Override public String toString() { return "Person: [name=" + name + ", age=" + age + ", cars=" + cars + "]" ; } } |
Person.java
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
|
package com.spring.test.collections; import java.util.List; import com.spring.test.Car; public class Person { private String name; private int age; private List<car> cars; public String getName() { return name; } public void setName(String name) { this .name = name; } public int getAge() { return age; } public void setAge( int age) { this .age = age; } public List<car> getCars() { return cars; } public void setCars(List<car> cars) { this .cars = cars; } @Override public String toString() { return "Person: [name=" + name + ", age=" + age + ", cars=" + cars + "]" ; } } |
DataSource.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package com.spring.test.collections; import java.util.Properties; public class DataSource { private Properties properties; public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this .properties = properties; } @Override public String toString() { return "DataSource: [properties:" + properties + "]" ; } } |
Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package com.spring.test.collections; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { @Test public void testCollections() { ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext.xml" ); Person person = (Person) context.getBean( "person3" ); System.out.println(person); NewPerson newPerson = (NewPerson) context.getBean( "newPerson" ); System.out.println(newPerson); DataSource dataSource = (DataSource) context.getBean( "dataSource" ); System.out.println(dataSource); Person person4 = (Person) context.getBean( "person4" ); System.out.println(person4); Person person5 = (Person) context.getBean( "person5" ); System.out.println(person5); } } |
总结
以上就是本文关于Spring框架依赖注入方法示例的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:https://www.2cto.com/kf/201608/539381.html