一、spring的控制反转
1.什么叫spring的控制反转(Spring_IOC)?
简单通俗一点的说,就是把对象的创建,初始化,销毁等一系列工作交给spring去做,由spring控制对象的生命周期
二、Spring的依赖注入
1.什么叫spring的依赖注入(Spring_DI)?
给属性赋值的过程就叫做依赖注入,个人认为这一句话就可以把这个问题解释的很通透
2.spring依赖注入的方式
2.1设值注入
要给类里面的属性进行设值注入的一个前提就是,在类里面的属性必须要有setter方法,所谓的设值注入也就是通过setter方法进行注入
先看一个例子
public class Person {
private String name;
private Student student;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
在spring的配置文件中的配置
<bean id = "student" class = "cn.ccx.student">
<bean id = "person" class = "cn.ccx.person">
<property name = "name" value = "张三"></property>
<property name = "student" ref= "student"></property>
</bean>
在这个例子里面,property 描述的是属性,name描述的是属性的名称,如果是基本类型(此处包括String),value就表示给属性赋值,如果是引用类型,就用ref进行赋值,这是最基本的给属性设值注入的过程
在这里提供一些其他的特殊的装配,也就是注入
装配list
`<property name="lists">
<list>
<value>list1</value>
<value>list2</value>
<ref bean="student"/><!--ref表示的是引用-->
</list>
</property>`
装配set
<property name="sets">
<set>
<value>set1</value>
<value>set2</value>
<ref bean="student"/><!--ref表示的是引用-->
</set>
</property>
装配map
<property name="maps">
<map>
<entry key="01"><!--map里面的key必须是string类型-->
<value>map01</value>
</entry>
<entry key="02">
<value>map02</value>
</entry>
</map>
</property>
装配properties
<property name="props">
<props>
<prop key="01">prop1</prop>
<prop key="02">prop2</prop>
</props>
</property>
2.2.构造方法注入
public class Person {
private String name;
private Student student;
public Person(String name, Student student) {
this.name = name;
this.student = student;
}
}
spring的配置文件里面中
<bean id="student" class="cn.ccx.practice.Student"></bean>
<bean id="person" class="cn.ccx.practice.Person">
<constructor-arg index="0" value="张三" type="java.lang.String"></constructor-arg>
<constructor-arg index="1" ref="student" type="cn.ccx.practice.Student"></constructor-arg>
</bean>
在这个例子里面,constructor-arg中的index表示的是构造方法里面的第几个参数,value表示的把基本类型的属性进行赋值,ref表示的是把引用类型进行赋值
当然,如果不存在constructor-arg的话,创建bean的实例对象就是调用的默认的无参的构造函数,如果存在,就相当于往构造参数里面传值,这时调用的就是其他的构造参数,type表示的是参数的类型
两种方法都各有优缺点,看个人习惯进行选择