1.新建模块ch02-di-xml
2.新建类Student和配置applicationContext.xml
package com.bjpowernode.ba01;
public class Student {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
<?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对象-->
<bean id="myStudent" class="com.bjpowernode.ba01.Student"/>
</beans>
3.编写测试类来测试一下
package com.bjpowernode;
import com.bjpowernode.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 test01(){
System.out.println("=====test01========");
String config="ba01/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
//从容器中获取Student对象
Student myStudent = (Student) ac.getBean("myStudent");
System.out.println("student对象="+myStudent);
}
}
4.输出结果
5.用set注入
(1)简单类型(spring中规定java的基本数据类型和String都是简单类型)的set注入,在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对象
注入:就是赋值的意思
简单类型: spring中规定java的基本数据类型和String都是简单类型。
di:给属性赋值
1. set注入(设值注入) :spring调用类的set方法, 你可以在set方法中完成属性赋值
1)简单类型的set注入
<bean id="xx" class="yyy">
<property name="属性名字" value="此属性的值"/>
一个property只能给一个属性赋值
<property....>
</bean>
-->
<bean id="myStudent" class="com.bjpowernode.ba01.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
</beans>
这说明设值注入只是使用set方法,并不关心属性是否存在
(2)引用类型
新建school和student类型
package com.bjpowernode.ba02;
public class School {
private String name;
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
package com.bjpowernode.ba02;
public class Student {
private String name;
private int age;
//声明一个引用类型
private School school;
public Student() {
System.out.println("spring会调用类的无参数构造方法创建对象");
}
// 包名.类名.方法名称
// com.bjpowernode.ba02.Student.setName()
public void setName(String name) {
System.out.println("setName:"+name);
this.name = name;
}
public void setAge(int age) {
System.out.println("setAge:"+age);
this.age = age;
}
public void setSchool(School school) {
System.out.println("setSchool:"+school);
this.school = school;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}
<?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对象
注入:就是赋值的意思
简单类型: spring中规定java的基本数据类型和String都是简单类型。
di:给属性赋值
1. set注入(设值注入) :spring调用类的set方法, 你可以在set方法中完成属性赋值
1)简单类型的set注入
<bean id="xx" class="yyy">
<property name="属性名字" value="此属性的值"/>
一个property只能给一个属性赋值
<property....>
</bean>
2) 引用类型的set注入 : spring调用类的set方法
<bean id="xxx" class="yyy">
<property name="属性名称" ref="bean的id(对象的名称)" />
</bean>
-->
<bean id="myStudent" class="com.bjpowernode.ba02.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
<!--引用类型-->
<property name="school" ref="mySchool"/><!--setSchool(mySchool)-->
</bean>
<!--声明school对象-->
<bean id="mySchool" class="com.bjpowernode.ba02.School">
<property name="name" value="动力节点"/>
<property name="address" value="北京"/>
</bean>
</beans>
6.构造注入
school类和student类
package com.bjpowernode.ba03;
public class School {
private String name;
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
package com.bjpowernode.ba03;
public class Student {
private String name;
private int age;
//声明一个引用类型
private School school;
public Student() {
System.out.println("spring会调用类的无参数构造方法创建对象");
}
/**
* 创建有参数构造方法
*/
public Student(String myname,int myage, School mySchool){
System.out.println("=====Student有参数构造方法======");
//属性赋值
this.name = myname;
this.age = myage;
this.school = mySchool;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setSchool(School school) {
this.school = school;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}
(1)使用name属性实现构造注入
<?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对象
注入:就是赋值的意思
简单类型: spring中规定java的基本数据类型和String都是简单类型。
di:给属性赋值
1. set注入(设值注入) :spring调用类的set方法, 你可以在set方法中完成属性赋值
1)简单类型的set注入
<bean id="xx" class="yyy">
<property name="属性名字" value="此属性的值"/>
一个property只能给一个属性赋值
<property....>
</bean>
2) 引用类型的set注入 : spring调用类的set方法
<bean id="xxx" class="yyy">
<property name="属性名称" ref="bean的id(对象的名称)" />
</bean>
2.构造注入:spring调用类有参数构造方法,在创建对象的同时,在构造方法中给属性赋值。
构造注入使用 <constructor-arg> 标签
<constructor-arg> 标签:一个<constructor-arg>表示构造方法一个参数。
<constructor-arg> 标签属性:
name:表示构造方法的形参名
index:表示构造方法的参数的位置,参数从左往右位置是 0 , 1 ,2的顺序
value:构造方法的形参类型是简单类型的,使用value
ref:构造方法的形参类型是引用类型的,使用ref
-->
<!--使用name属性实现构造注入-->
<bean id="myStudent" class="com.bjpowernode.ba03.Student" >
<constructor-arg name="myname" value="张三"/>
<constructor-arg name="myage" value="20"/>
<constructor-arg name="mySchool" ref="myXueXiao"/><!--注意引用对象是ref!!!!!!-->
</bean>
<!--声明school对象-->
<bean id="myXueXiao" class="com.bjpowernode.ba03.School" >
<property name="name" value="北京大学"/>
<property name="address" value="北京的海淀区"/>
</bean>
</beans>
(2)使用index属性
<!--使用index属性-->
<bean id="myStudent2" class="com.bjpowernode.ba03.Student">
<constructor-arg index="0" value="张三"/>
<constructor-arg index="1" value="20"/>
<constructor-arg index="2" ref="myXueXiao"/>
</bean>
<!--省略index属性,但是必须严格按照形参的位置-->
<bean id="myStudent3" class="com.bjpowernode.ba03.Student">
<constructor-arg value="张三"/>
<constructor-arg value="20"/>
<constructor-arg ref="myXueXiao"/>
</bean>
(3)使用构造注入创建一个系统类的File对象
<!--创建File,使用构造注入-->
<bean id="myFile" class="java.io.File">
<constructor-arg name="parent" value="D:\work\Project\SpringStudy"/>
<constructor-arg name="child" value="junit.png"/>
</bean>
7.ioc的作业:主要是通过接口的实现来体会到解耦合的作用