2.3基于XML(配置文件)的DI
di的实现有两种:
1.在spring的配置文件中,使用标签和属性完成,叫基于xml的di实现
di的语法分类:
1.set注入(设值注入):spring调用类的set方法,在set方法可以实现属性的赋值。
- 简单类型的set注入
一个property 标签只能给一个属性赋值
需要set方法,没有set方法会报错
<bean id="yy" class="yy">
<property name="属性名字" value="此属性的值">
</bean>
如
<bean id="myStudent" class="com.bjpowernode.ba01.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
对于已经创建好的对象××,只要有set××()。那么就可以用set注入,如:
执行流程:
测试文件中指定spring配置文件的名称
//指定spring配置文件的名称
String config = "ba01/applicationContext.xml";
->创建对象ac用的类是ClassPathXmlApplicationContext ,
ClassPathXmlApplicationContext 读config(指向beans.xml文件)
//创建表示spring容器的对象
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
-> 在配置文件中遇到bean标签,调用类(java.util.Date)的构造方法创建对象(mydate)
<bean id="mydate" class="java.util.Date">
<property name="time" value="65465315"/>
</bean>
->property 标签调用类(java.util.Date)中(time)对应的set方法并进行赋值
public void setTime(long time) {
fastTime = time;
cdate = null;
}
-
引用类型的设值注入
1.先在Student类中引用School类并定义其set方法
引用类型注入1.png
2.定义School类中的对象和set方法
引用类型注入2.png
3.在配置文件中声明School对象,并在Student对象的bean标签中调用
<bean id="xxx" class="yyy">
<property name="属性名称" ref="bean的id(对象的名称)">
</bean>
-
构造注入:spring调用类有参数构造方法,在创建对象的同时,在构造方法中给属性赋值。
构造注入1.png
使用构造注入创建文件对象
注入:就是赋值的意思
简单类型:spring中规定Java的基本数据类型和string都是简单类型。
di:依赖注入,表示创建对象,给属性赋值。
引用类型的自动注入
自动注入:即简化对象的赋值
引用类型的自动注入:spring框架根据某些规则可以给引用类型赋值
常用的使用规则是byName,baType。
1.byName(按名称注入):
Java类中引用类型的属性名和spring容器中(配置文件)<bean>的id名称一样且数据类型是一致的,这样的容器中的bean,spring能够赋值给引用类型。
语法:
<bean id="xx" ,class="yy" autowire="buName">
简单类型属性赋值
</bean>
执行流程
1)创建容器时,读配置文件
2)在配置文件中,遇到<bean>标签调用无参构造创建对象,并给简单类型赋值。遇到<autotwire = "buName">标签时给指定类中所有引用类型,按照byName规则,让spring赋值。
Java类中引用类型的属性名和spring容器中(配置文件)<bean>的id名称一样且数据类型是一致的
当引用类型的属性名和spring容器中(配置文件)<bean>的id名称一样,且数据类型是一致时。
复杂类型的注入
<!--复杂类型的注入--> <bean id="user" class="org.example.entity.User"> <property name="id" value="001"/> <property name="name" value="zhangsan"/> </bean> <bean id="class" class="org.example.entity.Class"> <property name="className" value="软工3班"/> <property name="major" value="软件工程"/> <property name="student"> <list> <ref bean="user"/> </list> </property> </bean>
public class Class { private String className; private String major; private List<User> student; //此处省略setter、getter和toString方法 }
public class User { private int id; private String name; //此处省略setter、getter和toString方法 }
2.byType(按类型注入):
Java类中引用类型的数据类型和spring容器中(配置文件)<bean>的class属性是同源关系的 ,这样bean能够赋值给引用类型。
同源(一类的意思):
1.Java类中引用类型的数据类型和<bean>标签的class属性值一样
2.Java类中引用类型的数据类型(父类)和<bean>标签的class属性值(子类)是父子类关系
3.Java类中引用类型的数据类型(接口)和<bean>标签的class属性值(实现类)是接口和实现类的关系
注意:在byType中,在xml配置文件中只能有一个符合条件对象,无唯一<bean>会报错。
语法:
<bean id="xx" ,class="yy" autowire="buType">
简单类型属性赋值
</bean>
执行流程
1)创建容器时,读配置文件
2)在配置文件中,遇到<bean>标签调用无参构造创建对象,给简单类型赋值。遇到<autotwire = "byType">标签时给指定类中所有引用类型,按照byType规则,让spring赋值。
Java类中引用类型的数据类型和spring容器中(配置文件)<bean>的class属性是同源关系
总结:
set注入可以实现引用对象按名称自动注入(byName)
set注入的引用对象按类型自动注入(byType)有两种情况:
1.在配置文件中只声明一个对象
2.在配置文件中声明了多个对象
构造注入无法实现引用对象自动注入
多配置文件的使用
1.包含关系的配置文件
主配置文件:包含其他的配置文件,不定义对象。
语法:<import resource="其他配置文件的路径"/>
关键字:“classpath”表示类路径(class文件所在的目录)
在spring的配置文件中要指定其他文件的位置,
需要使用classpath,告诉spring到哪去加载读取文件。