二、XML配置文件实现DI
1、di:依赖注入,表示创建对象,给属性赋值
2、di实现有两种方式:
- 在spring配置文件中,使用标签和属性完成,叫做基于XML的di实现
- 使用注解,叫做基于注解的di实现
3、di的语法分类
- set注入(设置注入):spring调用类的set方法赋值[实际使用超80%]
- 构造注入:spring调用类的有参构造完成赋值
4、实现步骤
- 创建maven项目
- 加入maven依赖
- spring的依赖,版本5.2.5
- junit依赖
- 创建类(接口及其实现类)
- 和没有使用框架一样,就是一个普通类
- 创建spring需要使用的配置文件
- 声明类的信息,这些类由spring创建管理
- 通过spring语法完成属性赋值
- 测试spring创建的对象
5、项目结构
注:pom.xml同一.2.1
1、Set注入
ba01.Student.java
package hom.wang.ba01;
/* setter/getter省略*/
public class Student {
private String name;
private int age;
}
ba01.applicationContext.xml
<?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">
<!--
声明student对象
di给属性赋值
1、set注入
-->
<bean id="student" class="hom.wang.Student">
<property name="name" value="丽丽" />
<property name="age" value="24" />
<!--set注入只关心set,不关心属性-->
<property name="email" value="lili@xx.com" />
</bean>
<bean id="date" class="java.util.Date">
<property name="time" value="1553710877411" />
</bean>
</beans>
MyTest.java
package hom.wang;
import hom.wang.ba01.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Date;
public class MyTest {
@Test
public void test_01(){
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("ba01/applicationContext.xml");
Student student = (Student) applicationContext.getBean("student");
System.out.println(student);
Date date = (Date) applicationContext.getBean("date");
System.out.println(date);
}
}
2、构造注入
ba02.applicationContext.xml
<?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">
<!--
声明student对象
2、构造注入
<constructor-arg> 标签属性:
name:形参名
index:参数位置,从左往右为0/1/2/3...
value:值
ref:引用
-->
<!--使用name属性实现构造注入-->
<bean id="cnstudent" class="hom.wang.ba01.Student">
<constructor-arg name="name" value="梅梅"/>
<constructor-arg name="age" value="25" />
</bean>
<!--使用index属性实现构造注入-->
<bean id="cistudent" class="hom.wang.ba01.Student">
<constructor-arg index="0" value="梅梅"/>
<constructor-arg index="1" value="25" />
</bean>
<bean id="file" class="java.io.File">
<constructor-arg name="parent"
value="E:\CodeBox\Spring\st-02-di-xml\target\classes"/>
<constructor-arg name="child" value="readme.txt" />
</bean>
</beans>
3、自动注入
ba03.School.java
package hom.wang.ba03;
public class School {
private String name;
private int level;
}
ba03.Student.java
package hom.wang.ba03;
public class Student {
private String name;
private int age;
private School school;
}
ba03.applicationContext.xml
<?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">
<!--
自动注入 [引用类型的自动注入:spring框架根据其相应规则可以给引用类型注入]
规则:byName和byType
1、byName:按名称注入,java类中引用类型的属性名和spring配置文件<bean>的id名称一样且数据类型是一致的,spring容器就可赋值给引用类型
语法: <bean id="xxx" class="xxx.xxx" autowire="byName">
2、byType:按类型注入,java类中引用类型的数据类型和和spring配置文件<bean>的class属性是同源关系的,spring容器就可赋值给引用类型
同源(没错就是你想的那样!!!):
1、类型一致
2、继承关系
3、实现关系
语法: <bean id="xxx" class="xxx.xxx" autowire="byType">
-->
<!--byName-->
<bean id="zbnstudent" class="hom.wang.ba03.Student" autowire="byName">
<property name="name" value="梅梅" />
<property name="age" value="25" />
</bean>
<bean id="school" class="hom.wang.ba03.School">
<constructor-arg name="name" value="XXX小学" />
<constructor-arg name="level" value="2" />
</bean>
<!--byType-->
<bean id="zbtstudent" class="hom.wang.ba03.Student" autowire="byType">
<property name="name" value="呱呱" />
<property name="age" value="22" />
</bean>
<!--<bean id="file" class="java.io.File">
<constructor-arg name="parent" value="E:\CodeBox\Spring\st-02-di-xml\target\classes"/>
<constructor-arg name="child" value="readme.txt" />
</bean>-->
</beans>
4、多配置文件的整合
ba04.spring-school.xml
<?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="school" class="hom.wang.ba04.School">
<constructor-arg name="name" value="XXX小学" />
<constructor-arg name="level" value="2" />
</bean>
</beans>
ba04.spring-student.xml
<?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="zbtstudent" class="hom.wang.ba04.Student" autowire="byType">
<property name="name" value="梅梅" />
<property name="age" value="25" />
</bean>
</beans>
ba04.springTotal.xml
<?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,只做配置的整合
语法:
<import resource="其他配置文件路径" />
关键字:
classpath:表示类路径(class文件所在路径)
-->
<!--加载文件列表-->
<!--<import resource="classpath:ba04/spring-student.xml" />
<import resource="classpath:ba04/spring-school.xml" />-->
<!--除了单独引入还可以使用通配符:*-->
<import resource="classpath:ba04/spring-*.xml" />
</beans>