将IOC创建的对象,交于Spring管理,在创建对象的过程中Spring可以依据配置对对象的属性进行设置,这个过程称之为依赖注入,也即DI。
set方法注入:
通常的javabean属性都会私有化。而对外暴露setXxx()getXxx()方法,此时spring可以通过这样的setXxx()方法将属性进行注入对象。
a.Spring内置的可直接注入类型的注入:
以每个类型的注入方式举例:
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 |
public class Hero { private int id; private String name; private List<String> jobs; private Set<String> set; private Map<String,String> map; private Properties prop;
public void setId(int id) { this.id = id; }
public void setName(String name) { this.name = name; }
public void setJobs(List<String> jobs) { this.jobs = jobs; }
public void setSet(Set<String> set) { this.set = set; }
public void setMap(Map<String, String> map) { this.map = map; }
public void setProp(Properties prop) { this.prop = prop; }
@Override public String toString() { return "Hero [id=" + id + ", name=" + name + ", jobs=" + jobs + ", set=" + set + ", map=" + map + ", prop=" + prop + "]"; } } |
<bean id="hero" class="cn.tedu.beans.Hero">
<property name="id" value="123"></property>
<property name="name" value="亚瑟 "></property>
<property name="jobs">
<list>
<value>上单</value>
<value>打野</value>
<value>辅助</value>
<value>中单</value>
</list>
</property>
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
<value>aaa</value>
</set>
</property>
<property name="map">
<map>
<entry key="addr" value="王者荣耀"></entry>
<entry key="addr" value="英雄联盟"></entry>
<entry key="skill" value="风火轮"></entry>
<entry key="age" value="19"></entry>
</map>
</property>
<property name="prop">
<props>
<prop key="k1">v1</prop>
<prop key="k2">v2</prop>
<prop key="k3">v3</prop>
<prop key="k4">v4</prop>
</props>
</property>
</bean>
也可以通过ref关键字进行外配置bean外设置好的bean。
基于构造方法的注入:
对象属性设置的另一种方式是在对象创建的过程中通过构造方法的传入并设置对象的属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package cn.tedu.beans;
public class Student { private int id; private String name; private Dog dog;
public Student(int id, String name, Dog dog) { this.id = id; this.name = name; this.dog = dog; }
@Override public String toString() { return "Student [id=" + id + ", name=" + name + ", dog=" + dog + "]"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<bean id="student" class="cn.tedu.beans.Student"> <!-- index:为构造方法的第几个参数 进行配置 name:为构造方法的哪个名字的参数进行配置 **index 和 name 可以配置任何一个或同时配置 但要求一旦配置必须正确 **推荐优先使用index方式配置 防止没有源码造成name无法匹配到对应参数 type:该构造方法参数的类型 value:该构造方法参数的值 ,用来指定基本值 ref:该构造方法参数的值,用来指定引用其他bean的值 --> <constructor-arg index="0" name="id" value="999"/> <constructor-arg index="1" type="java.lang.String" value="张无忌"/> <constructor-arg name="dog" ref="dog"/> </bean>
<bean id="dog" class="cn.tedu.beans.Dog"></bean>
</beans> |
自动装配:
在Spring的set方式实现注入的过程中,支持自动装配机制,所谓自动装配机制,会根据要设置的javabean属性的名字 或 类型到spring中自动寻找对应的id或类型的<bean>进行设置,从而省去依次配置的过程,简化了配置。
自动装配关键字:
autowire:
属性:
byName:根据javabean中需要注入的属性的名字,在Spring容器中找对应的id的<bean>将该<bean>的对象赋值给当前属性
byType:根据javaBean中需要注入的属性的类型,在Spring容器中找到对应class类型的<bean>将该<bean>赋值给当前属性。
**注:byType是根据class进行匹配,可能匹配到多个bean,抛出异常,建议使用byName
<bean id="teacher" class="cn.tedu.beans.Teacher" autowire="byName"></bean>
<bean id="dog" class="cn.tedu.beans.Dog"></bean>
<bean id="cat" class="cn.tedu.beans.Cat"></bean>
开启全局自动装配:
default-autowire="byName"