Spring属性注入、构造方法注入、工厂注入以及注入参数(转)
Spring 是一个开源框架.
Spring 为简化企业级应用开发而生(对比EJB2.0来说). 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。
Spring 是一个 IOC(DI) 和 AOP 容器框架。
具体描述 Spring:
轻量级:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
控制反转(依赖注入) (IOC----inverse of control 、DI --- dependency injection)
面向切面编程(AOP --- aspect oriented programming)
容器: Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
框架: Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 和 Java 注解组合这些对象
一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)
所需jar包
1
2
3
4
5
6
7
8
9
|
<? 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 name="dog" class="com.zhiqi.entity.Dog"></ bean > </ beans > |
装配一个Bean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.zhiqi.entity; public class Dog { private String name; public String getName() { return name; } public void setName(String name) { this .name = name; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package com.zhiqi.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.zhiqi.entity.Dog; public class T { public static void main(String[] args) { ApplicationContext ac= new ClassPathXmlApplicationContext( "beans.xml" ); Dog dog=(Dog)ac.getBean( "dog" ); System.out.println(dog.getName()); } } |
此时装配了Dog这个类,但是为null
需要进行依赖注入(属性注入、构造方法注入,工厂注入)
1、属性注入:
装配一个员工类
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
|
package com.zhiqi.entity; public class Employee { private int id; private String name; private String sex; public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } public String getSex() { return sex; } public void setSex(String sex) { this .sex = sex; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package com.zhiqi.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.zhiqi.entity.Dog; import com.zhiqi.entity.Employee; public class T { public static void main(String[] args) { ApplicationContext ac= new ClassPathXmlApplicationContext( "beans.xml" ); Employee employee=(Employee)ac.getBean( "employee" ); System.out.println(employee.getName()); } } |
属性注入如下:<property name="" value=""></property>
1
2
3
4
5
|
< bean name="employee" class="com.zhiqi.entity.Employee"> < property name="id" value="10050"></ property > < property name="name" value="小鲜肉"></ property > < property name="sex" value="男"></ property > </ bean > |
构造方法注入一(通过类型):<constructor-arg type="" value=""></constructor-arg>
1
2
3
4
5
|
< bean name="employee" class="com.zhiqi.entity.Employee"> < constructor-arg type="int" value="10010"></ constructor-arg > < constructor-arg type="String" value="小萝莉"></ constructor-arg > < constructor-arg type="String" value="女"></ constructor-arg > </ bean > |
此时需要写构造函数否则会报错:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class Employee { private int id; private String name; private String sex; public Employee() { super (); // TODO Auto-generated constructor stub } public Employee( int id, String name, String sex) { super (); this .id = id; this .name = name; this .sex = sex; } } |
构造方法注入二(通过索引):<constructor-arg index="" value=""></constructor-arg> 索引从0开始
1
2
3
4
5
|
< bean name="employee" class="com.zhiqi.entity.Employee"> < constructor-arg index="0" value="10010"></ constructor-arg > < constructor-arg index="1" value="小萝莉"></ constructor-arg > < constructor-arg index="2" value="女"></ constructor-arg > </ bean > |
可以混合使用 类型+索引
1
2
3
4
5
|
< bean name="employee" class="com.zhiqi.entity.Employee"> < constructor-arg type="int" index="0" value="10010"></ constructor-arg > < constructor-arg type="String" index="1" value="小萝莉"></ constructor-arg > < constructor-arg type="String" index="2" value="女"></ constructor-arg > </ bean > |
通过工厂注入:<bean name="employee" factory-bean="" factory-method=""></bean>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package com.zhiqi.factory; import com.zhiqi.entity.Employee; public class EmployeeFactory { public Employee createEmployee(){ Employee employee= new Employee(); employee.setId( 10080 ); employee.setName( "小霸王" ); employee.setSex( "男" ); return employee; } } |
1
2
3
4
5
6
7
8
9
10
11
12
|
<? 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 name="dog" class="com.zhiqi.entity.Dog"></ bean > < bean name="employeeFactory" class="com.zhiqi.factory.EmployeeFactory"></ bean > < bean name="employee" factory-bean="employeeFactory" factory-method="createEmployee"></ bean > </ beans > |
通过静态工厂注入:
注入参数:
1、基本类型值
2、注入bean
3、内部bean
4、null值
5、级联属性
6、集合注入(List、Set、Map)
员工有一辆车
1
2
3
4
5
6
7
8
9
|
< bean id="employee" class="com.zhiqi.entity.Employee"> < property name="id" value="10060"></ property > < property name="name" value="脑残粉"></ property > < property name="sex" value="女"></ property > < property name="car" ref="car"></ property > </ bean > < bean id="car" class="com.zhiqi.entity.Car"> < property name="name" value="别克"></ property > </ bean > |
一辆车只属于某员工,内部bean
1
2
3
4
5
6
7
8
9
10
|
< bean id="employee" class="com.zhiqi.entity.Employee"> < property name="id" value="10060"></ property > < property name="name" value="脑残粉"></ property > < property name="sex" value="女"></ property > < property name="car"> < bean class="com.zhiqi.entity.Car"> < property name="name" value="雪佛兰"></ property > </ bean > </ property > </ bean > |
有一个员工没有车
1
2
3
4
5
6
7
8
|
< bean id="employee" class="com.zhiqi.entity.Employee"> < property name="id" value="10060"></ property > < property name="name" value="脑残粉"></ property > < property name="sex" value="女"></ property > < property name="car"> < null ></ null > </ property > </ bean > |
级联
1
2
3
4
5
6
|
< bean id="employee" class="com.zhiqi.entity.Employee"> < property name="id" value="10060"></ property > < property name="name" value="脑残粉"></ property > < property name="sex" value="女"></ property > < property name="car.name" value="好车"></ property > </ bean > |
此时在Car中new一个
一个员工有多个girlFriend
1
2
3
4
5
|
private int id; private String name; private String sex; private Car car; private List<String> girlFriend= new ArrayList<String>(); |
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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> < bean id="employee" class="com.zhiqi.entity.Employee"> < property name="id" value="10060"></ property > < property name="name" value="脑残粉"></ property > < property name="sex" value="女"></ property > < property name="car" value="宾利"></ property > < property name="girlFriend"> < list > < value >琪琪</ value > < value >丽丽</ value > < value >小莫</ value > </ list > </ property > </ bean > </ beans > |
一个员工有多套房子
private Set<String> house=new HashSet<String>();
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
|
<?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= "employee" class = "com.zhiqi.entity.Employee" > <property name= "id" value= "10060" ></property> <property name= "name" value= "脑残粉" ></property> <property name= "sex" value= "女" ></property> <property name= "car" value= "宾利" ></property> <property name= "girlFriend" > <list> <value>琪琪</value> <value>丽丽</value> <value>小莫</value> </list> </property> <property name= "house" > <set> <value>房子 1 </value> <value>别墅 2 </value> </set> </property> </bean> </beans> |
一个员工的工作
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
|
<? 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="employee" class="com.zhiqi.entity.Employee"> < property name="id" value="10060"></ property > < property name="name" value="脑残粉"></ property > < property name="sex" value="女"></ property > < property name="car" value="宾利"></ property > < property name="girlFriend"> < list > < value >琪琪</ value > < value >丽丽</ value > < value >小莫</ value > </ list > </ property > < property name="house"> < set > < value >房子1</ value > < value >别墅2</ value > </ set > </ property > < property name="works"> < map > < entry > < key >< value >上午</ value ></ key > < value >撸代码</ value > </ entry > < entry > < key >< value >下午</ value ></ key > < value >找BUG</ value > </ entry > </ map > </ property > </ bean > </ beans > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package com.zhiqi.test; import java.util.Iterator; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.zhiqi.entity.Employee; public class T { public static void main(String[] args) { ApplicationContext ac= new ClassPathXmlApplicationContext( "beans.xml" ); Employee employee=(Employee)ac.getBean( "employee" ); for (String str:employee.getHouse()){ System.out.println(str); } //entrySet()将map转为set,然后迭代器遍历 Iterator it=employee.getWorks().entrySet().iterator(); while (it.hasNext()){ System.out.println(it.next()); } } } |