> 依賴註入就是對類的屬性進行賦值 ## 4.1、環境搭建 > 創建名為spring_ioc_xml的新module,過程參考[3.1節](https://www.cnblogs.com/Javaer1995/p/17570068.html "3.1節") ### 4.1.1、創建spring配置文 ...
依賴註入就是對類的屬性進行賦值
4.1、環境搭建
創建名為spring_ioc_xml的新module,過程參考3.1節
4.1.1、創建spring配置文件
<?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">
</beans>
4.1.2、創建學生類Student
package org.rain.spring.pojo;
/**
* @author liaojy
* @date 2023/7/27 - 22:33
*/
public class Student {
private Integer id;
private String name;
private Integer age;
private String sex;
public Student() {
}
public Student(Integer id, String name, Integer age, String sex) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
4.2、setter註入(常用)
4.2.1、配置bean
<!--
property標簽:通過組件類的setXxx()方法給組件對象設置屬性
name屬性:指定屬性名
value屬性:設置屬性值
-->
<bean id="student" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
</bean>
4.2.2、測試
package org.rain.spring.test;
import org.junit.Test;
import org.rain.spring.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author liaojy
* @date 2023/7/27 - 22:43
*/
public class IOCByXmlTest {
@Test
public void testDISetter(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("student", Student.class);
System.out.println(student);
}
}
4.3、構造器註入
4.3.1、配置bean
註意:constructor-arg標簽的數量,必須和某一個構造器方法的參數數量一致
<!--
constructor標簽:通過組件類的有參構造方法給組件對象設置屬性
name屬性:指定有參構造方法參數名
value屬性:設置有參構造方法參數值
-->
<bean id="studentTwo" class="org.rain.spring.pojo.Student">
<constructor-arg name="id" value="1002"></constructor-arg>
<constructor-arg name="name" value="李四"></constructor-arg>
<constructor-arg name="age" value="24"></constructor-arg>
<constructor-arg name="sex" value="女"></constructor-arg>
</bean>
4.3.2、測試
@Test
public void testDIConstructor(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentTwo", Student.class);
System.out.println(student);
}
4.4、特殊值處理
4.4.1、null值
4.4.1.1、配置bean
註意:該<property name="sex" value="null">寫法,實際為sex所賦的值是字元串null
<bean id="studentThree" class="org.rain.spring.pojo.Student">
<property name="id" value="1003"></property>
<property name="name" value="張三"></property>
<property name="sex" >
<null></null>
</property>
</bean>
4.4.1.2、測試
由控制台日誌可知,此時sex的值為null
@Test
public void testDIspecial(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentThree", Student.class);
System.out.println(student.getSex().toString());
}
+++++++++++++++++++++++++++++++++++分割線+++++++++++++++++++++++++++++++++++
由控制台日誌可知,此時age的值也為null;所以不配置屬性也能實現同樣的效果
4.4.2、xml字元值
4.4.2.1、方式一:實體
<bean id="studentThree" class="org.rain.spring.pojo.Student">
<property name="id" value="1003"></property>
<!--用實體來代替xml字元-->
<property name="name" value="<張三>"></property>
<property name="sex" >
<null></null>
</property>
</bean>
4.4.2.2、方式二:CDATA節
<bean id="studentThree" class="org.rain.spring.pojo.Student">
<property name="id" value="1003"></property>
<!-- CDATA中的C代表Character,是文本、字元的含義,CDATA就表示純文本數據 -->
<!-- XML解析器看到CDATA節就知道這裡是純文本,就不會當作XML標簽或屬性來解析 -->
<!-- 所以CDATA節中寫什麼符號都隨意 -->
<property name="name">
<value><![CDATA[<張三>]]></value>
</property>
<property name="sex" >
<null></null>
</property>
</bean>
4.4.2.3、測試
4.5、為類類型的屬性賦值
4.5.1、方式一:外部bean(常用)
4.5.1.1、創建班級類Clazz
package org.rain.spring.pojo;
/**
* @author liaojy
* @date 2023/7/28 - 7:54
*/
public class Clazz {
private Integer cid;
private String cname;
public Clazz() {
}
public Clazz(Integer cid, String cname) {
this.cid = cid;
this.cname = cname;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
@Override
public String toString() {
return "Clazz{" +
"cid=" + cid +
", cname='" + cname + '\'' +
'}';
}
}
4.5.1.2、修改Student類
package org.rain.spring.pojo;
/**
* @author liaojy
* @date 2023/7/27 - 22:33
*/
public class Student {
private Integer id;
private String name;
private Integer age;
private String sex;
private Clazz clazz;
public Student() {
}
public Student(Integer id, String name, Integer age, String sex, Clazz clazz) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.clazz = clazz;
}
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", clazz=" + clazz +
'}';
}
}
4.5.1.3、配置外部bean
<bean id="clazz" class="org.rain.spring.pojo.Clazz">
<property name="cid" value="1111"></property>
<property name="cname" value="三年E班"></property>
</bean>
4.5.1.4、引用外部bean
<bean id="studentfour" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
<!-- ref屬性:引用IOC容器中某個bean的id,將所對應的bean為屬性賦值 -->
<property name="clazz" ref="clazz"></property>
</bean>
4.5.1.5、測試
@Test
public void testDIOuterBean(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentfour", Student.class);
System.out.println(student);
}
4.5.2、方式二、級聯
4.5.2.1、配置bean
<bean id="clazz" class="org.rain.spring.pojo.Clazz">
<property name="cid" value="1111"></property>
<property name="cname" value="三年E班"></property>
</bean>
<bean id="studentFive" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
<!-- 一定先引用某個bean為屬性賦值,才可以使用級聯方式更新屬性 -->
<property name="clazz" ref="clazz"></property>
<property name="clazz.cid" value="2222"></property>
<property name="clazz.cname" value="五年A班"></property>
</bean>
4.5.2.2、測試
@Test
public void testDICascade(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentFive", Student.class);
System.out.println(student);
}
4.5.3、內部bean(常用)
4.5.3.1、配置bean
<bean id="studentSix" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
<property name="clazz">
<!-- 內部bean只能用於給屬性賦值,不能在外部通過IOC容器獲取,因此可以省略id屬性 -->
<bean class="org.rain.spring.pojo.Clazz">
<property name="cid" value="1111"></property>
<property name="cname" value="三年E班"></property>
</bean>
</property>
</bean>
4.5.3.2、測試
@Test
public void testDIInnerBean(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentSix", Student.class);
System.out.println(student);
}
4.6、為數組類型的屬性賦值
4.6.1、修改Student類
在Student類中添加或修改以下代碼:
private String hobby[];
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", clazz=" + clazz +
", hobby=" + Arrays.toString(hobby) +
'}';
}
4.6.2、配置bean
<bean id="studentSeven" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
<property name="clazz">
<bean class="org.rain.spring.pojo.Clazz">
<property name="cid" value="1111"></property>
<property name="cname" value="三年E班"></property>
</bean>
</property>
<property name="hobby">
<array>
<!--如果數組類型是基本類型和string類型,就用value標簽-->
<!--如果數組類型是類類型,就用ref標簽-->
<value>游泳</value>
<value>跑步</value>
<value>騎車</value>
</array>
</property>
</bean>
4.6.3、測試
@Test
public void testDIArray(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentSeven", Student.class);
System.out.println(student);
}
4.7、為List集合類型的屬性賦值
4.7.1、修改Clazz類
在Clazzt類中添加或修改以下代碼:
private List<Student> students;
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Clazz{" +
"cid=" + cid +
", cname='" + cname + '\'' +
", students=" + students +
'}';
}
4.7.2、配置bean
<bean id="student" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
</bean>
<bean id="studentThree" class="org.rain.spring.pojo.Student">
<property name="id" value="1003"></property>
<property name="name">
<value><![CDATA[<張三>]]></value>
</property>
<property name="sex" >
<null></null>
</property>
</bean>
<bean id="clazz" class="org.rain.spring.pojo.Clazz">
<property name="cid" value="1111"></property>
<property name="cname" value="三年E班"></property>
</bean>
<bean id="studentfour" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
<property name="clazz" ref="clazz"></property>
</bean>
<bean id="clazzTwo" class="org.rain.spring.pojo.Clazz">
<property name="cid" value="1111"></property>
<property name="cname" value="三年E班"></property>
<property name="students">
<list>
<!--如果list集合元素是基本類型和string類型,就用value標簽-->
<!--如果list集合元素是類類型,就用ref標簽-->
<ref bean="student"></ref>
<ref bean="studentThree"></ref>
<ref bean="studentfour"></ref>
</list>
</property>
</bean>
4.7.3、測試
@Test
public void testDIList(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Clazz clazz = applicationContext.getBean("clazzTwo", Clazz.class);
System.out.println(clazz);
}
4.8、為Map集合類型的屬性賦值
4.8.1、創建教師類Teacher
package org.rain.spring.pojo;
/**
* @author liaojy
* @date 2023/7/30 - 12:10
*/
public class Teacher {
private Integer tid;
private String tname;
public Teacher() {
}
public Teacher(Integer tid, String tname) {
this.tid = tid;
this.tname = tname;
}
public Integer getTid() {
return tid;
}
public void setTid(Integer tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
@Override
public String toString() {
return "Teacher{" +
"tid=" + tid +
", tname='" + tname + '\'' +
'}';
}
}
4.8.2、修改Student類
在Student類中添加或修改以下代碼:
private Map<String,Teacher> teacherMap;
public Map<String, Teacher> getTeacherMap() {
return teacherMap;
}
public void setTeacherMap(Map<String, Teacher> teacherMap) {
this.teacherMap = teacherMap;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", clazz=" + clazz +
", hobby=" + Arrays.toString(hobby) +
", teacherMap=" + teacherMap +
'}';
}
4.8.3、配置bean
<bean id="teacherOne" class="org.rain.spring.pojo.Teacher">
<property name="tid" value="10010"></property>
<property name="tname" value="張老師"></property>
</bean>
<bean id="teacherTwo" class="org.rain.spring.pojo.Teacher">
<property name="tid" value="10086"></property>
<property name="tname" value="李老師"></property>
</bean>
<bean id="studentEight" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
<property name="clazz">
<bean class="org.rain.spring.pojo.Clazz">
<property name="cid" value="1111"></property>
<property name="cname" value="三年E班"></property>
</bean>
</property>
<property name="hobby">
<array>
<value>游泳</value>
<value>跑步</value>
<value>騎車</value>
</array>
</property>
<property name="teacherMap">
<map>
<!--如果鍵是字面量,就用key屬性,否則用key-ref屬性 -->
<!--如果值是字面量,就用value屬性,否則用value-ref屬性 -->
<entry key="10010" value-ref="teacherOne"></entry>
<entry key="10086" value-ref="teacherTwo"></entry>
</map>
</property>
</bean>
4.8.4、測試
@Test
public void testDIMap(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentEight", Student.class);
System.out.println(student);
}
4.9、為集合類型的屬性賦值(解耦引用方式)
4.9.1、配置bean
註意:使用util:list、util:map標簽必須引入相應的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" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!--list集合類型的bean-->
<util:list id="students">
<ref bean="student"></ref>
<ref bean="studentThree"></ref>
<ref bean="studentfour"></ref>
</util:list>
<!--map集合類型的bean-->
<util:map id="teacherMap">
<entry key="10010" value-ref="teacherOne"></entry>
<entry key="10086" value-ref="teacherTwo"></entry>
</util:map>
<bean id="studentNine" class="org.rain.spring.pojo.Student">
<property name="id" value="0011"></property>
<property name="name" value="張三"></property>
<property name="age" value="23"></property>
<property name="sex" value="男"></property>
<property name="clazz">
<bean class="org.rain.spring.pojo.Clazz">
<property name="cid" value="1111"></property>
<property name="cname" value="三年E班"></property>
</bean>
</property>
<property name="hobby">
<array>
<value>游泳</value>
<value>跑步</value>
<value>騎車</value>
</array>
</property>
<property name="teacherMap" ref="teacherMap"> </property>
</bean>
</beans>
4.9.2、測試
@Test
public void testDIUtil(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentNine", Student.class);
System.out.println(student);
}
4.10、p命名空間(瞭解)
4.10.1、配置bean
註意:p命名空間的依賴註入,本質上是屬性方式(setter方法)的依賴註入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!--map集合類型的bean-->
<util:map id="teacherMap">
<entry key="10010" value-ref="teacherOne"></entry>
<entry key="10086" value-ref="teacherTwo"></entry>
</util:map>
<bean id="studentTen" class="org.rain.spring.pojo.Student"
p:id="1001" p:name="張三" p:teacherMap-ref="teacherMap"></bean>
</beans>
4.10.2、測試
@Test
public void testDIP(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-ioc.xml");
Student student = applicationContext.getBean("studentTen", Student.class);
System.out.println(student);
}
4.11、引入外部屬性文件
4.11.1、引入資料庫相關依賴
<!-- MySQL驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!-- 數據源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
4.11.2、創建外部屬性文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
4.11.3、配置bean
註意:使用context:property-placeholder標簽必須引入相應的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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--引入外部屬性文件-->
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<!--通過${key}的方式訪問外部屬性文件的value-->
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
</beans>
4.11.4、測試
@Test
public void testDIOuterFile() throws SQLException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-datasource");
DruidDataSource datasource = applicationContext.getBean("datasource", DruidDataSource.class);
System.out.println(datasource.getConnection());
}