依赖注入分为三种方式:
1.1构造器注入
构造器通过构造方法实现,构造方法有无参数都可以。在大部分情况下我们都是通过类的构造器来创建对象,Spring也可以采用反射机制通过构造器完成注入,这就是构造器注入的原理。
代码清单:构造器注入
1 package com.spring.chapter3; 2 3 public class Role { 4 5 private long id; 6 private String roleName; 7 8 public Role(long id,String roleName){ 9 this.id=id; 10 this.roleName=roleName; 11 12 } 13 public void getCount(){ 14 System.out.println("Role已被调用"+"\n"+"id:"+id+"\n"+"roleName:"+roleName); 15 16 } 17 18 }
代码清单:构造器配置
1 <bean id="Role" class="com.spring.chapter3.Role"> 2 <constructor-arg index="0" value="007"></constructor-arg> 3 <constructor-arg index="1" value="zhangqiang"></constructor-arg> 4 </bean>
元素名 |
作用 |
优缺点 |
constructor-arg
|
元素用于定义类构造方法的参数
|
注入简单,不宜参数过多
|
index
|
用于定义对应类构造方法的参数位置
|
|
value
|
设置值
|
1.2使用setter注入
setter注入是Spring中最主流的注入方法(常用),好处就不用多说了。原理也是通过反射注入,直接上代码。(注意对应的实体类属性必须实现set,get方法。如果实体类没有属性也会被注入)。
1 package com.spring.chapter3; 2 3 public class Role { 4 5 public long getId() { 6 return id; 7 } 8 public void setId(long id) { 9 this.id = id; 10 } 11 public String getRoleName() { 12 return roleName; 13 } 14 public void setRoleName(String roleName) { 15 this.roleName = roleName; 16 } 17 private long id; 18 private String roleName; 19 20 }
Bean配置xml
1 <bean id="Role" class="com.spring.chapter3.Role"> 2 </bean>
2.1 注入内部Bean
注入内部Bean跟setter注入是差不多的,不用多说直接看代码。
代码清单:内部Bean注入
1 package com.spring.chapter3; 2 3 public class Role { 4 5 public int getId() { 6 return id; 7 } 8 9 public void setId(int id) { 10 this.id = id; 11 } 12 13 public String getRoleName() { 14 return RoleName; 15 } 16 17 public void setRoleName(String roleName) { 18 RoleName = roleName; 19 } 20 21 public DomePojo getDomePojo() { 22 return domePojo; 23 } 24 25 public void setDomePojo(DomePojo domePojo) { 26 this.domePojo = domePojo; 27 } 28 29 private DomePojo domePojo; //注意这里是类变量 30 private int id; 31 private String RoleName; 32 public void getCount(){ 33 System.out.println("我是Role类的方法"); 34 } 35 }
代码清单:内部 bean 为基于 setter 注入进行配置的配置文件 Spring.xml 文件:
1 <bean id="DomePojo" class="com.spring.chapter3.DomePojo"> 2 3 </bean> 4 <bean id="Role" class="com.spring.chapter3.Role"> 5 <property name="id" value="007"></property> 6 <property name="RoleName" value="zhangqiang"></property> 7 <property name="DomePojo" ref="DomePojo"></property> 8 </bean>
property name对应pojo中的属性(类变量),ref关联到对应Bean的id (注意:ref关联的Bean一定要在Spring Ioc容器中定义,否则会报错)
2.2 注入集合
如果想传递多个值,如 Java Collection 类型 List、Set、Map 和 Properties,应该怎么做呢。为了处理这种情况,Spring 提供了四种类型的集合的配置元素,如下所示:
元素 | 描述 |
---|---|
<list> | 它有助于连线,如注入一列值,允许重复。 |
<set> | 它有助于连线一组值,但不能重复。 |
<map> | 它可以用来注入名称-值对的集合,其中名称和值可以是任何类型。 |
<props> | 它可以用来注入名称-值对的集合,其中名称和值都是字符串类型。 |
代码清单:Pojo实体类(注意必须setter方法)
1 package com.spring.chapter4; 2 3 import java.util.List; 4 import java.util.Set; 5 6 public class Collection { 7 public Set getAddSet() { 8 return addSet; 9 } 10 11 public void setAddSet(Set addSet) { 12 this.addSet = addSet; 13 } 14 15 public List getAddList() { 16 return addList; 17 } 18 19 public void setAddList(List addList) { 20 this.addList = addList; 21 } 22 23 private Set addSet; 24 private List addList; 25 26 public void getCount(){ 27 System.out.println("我是Role类的方法"); 28 } 29 }
代码清单:Bean配置
1 <bean id="Collection" class="com.spring.chapter4.Collection"> 2 <property name="addList"> 3 <list> 4 <value>1</value> 5 <value>2</value> 6 <value>3</value> 7 <value>4</value> 8 </list> 9 </property> 10 <property name="addSet"> 11 <set> 12 <value>6</value> 13 <value>7</value> 14 <value>8</value> 15 <value>9</value> 16 </set> 17 </property> 18 </bean> 19
测试结果:
元素 | 描述 |
---|---|
<list> | 它有助于连线,如注入一列值,允许重复。 |
<set> | 它有助于连线一组值,但不能重复。 |
<map> | 它可以用来注入名称-值对的集合,其中名称和值可以是任何类型。 |
<props> | 它可以用来注入名称-值对的集合,其中名称和值都是字符串类型。 |