Spring DI依赖注入
- setter设置注入(保证类中有提供setter方法)
- 构造器注入
- 命名空间注入
1、项目结构

1.1 pom.xml
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
1.2 Teahcer
public class Teacher {
private String name ;
private int age;
//省略getter setter方法
}
1.3 Course
public class Course {
private String courseName;
private int courseHours;
private Teacher teacher;
//省略getter setter方法
}
2、setter方法注入
2.1 bean.xml
<bean id="teacher" class="com.springdi.Teacher">
<property name="age" value="22"></property>
<property name="name" value="HeloWxl"></property>
</bean>
<bean id="course" class="com.springdi.Course">
<property name="courseHours" value="100"></property>
<property name="teacher" ref="teacher"></property>
<property name="courseName" value="Java"></property>
</bean>
- Value:表示的是给name所表示的简单类型的属性赋值(如String,int)
- Ref:表示的是“自定义类型”的对象属性赋值(如这里的Teacher),ref值的另一个bean的id值,从而实现多个bean之间的相互引用,相互依赖的关系
2.2 测试类
@Test
public void testDi(){
//从spring容器获得 //1 获得容器
String xmlPath="bean.xml";
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//2获得内容 --不需要自己new,都是从spring容器获得
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
System.out.println(teacher.toString());
Course course = (Course) applicationContext.getBean("course");
course.showInfo();
}
2.3 测试结果

3、构造器注入
3.1 Course里面进行添加有参构造函数
public Course(){
}
public Course(String courseName, int courseHours, Teacher teacher) {
this.courseName = courseName;
this.courseHours = courseHours;
this.teacher = teacher;
}
3.2 Teacher里面进行添加有参构造函数
public Teacher(){}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
3.3 bean.xml
<bean id="course" class="com.springdi.Course">
<constructor-arg value="Python"></constructor-arg>
<constructor-arg value="12"></constructor-arg>
<constructor-arg ref="teacher"></constructor-arg>
</bean>
<bean id="teacher" class="com.springdi.Teacher">
<constructor-arg value="HeloWxl"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
</bean>
- 在bean中,<constructor-arg>的顺序要和构造方法中参数的顺序一样,即可保证第一个< constructor-arg>的value值赋值给了构造方法的第一个参数,第二个<constructor-arg>的value值赋值给了第二个参数。
如果不能保证<constructor-arg>的顺序和构造方法中参数的顺序一致,则可以使用index或者name属性指定
<!-- Index指定-->
<bean id="course" class="com.springdi.Course">
<constructor-arg value="java" index="0"></constructor-arg>
<constructor-arg value="100" index="1"></constructor-arg>
<constructor-arg ref="teacher" index="2"></constructor-arg>
</bean>
<!-- Name指定-->
<bean id="teacher" class="com.springdi.Teacher">
<constructor-arg value="HeloWxl" name="name"></constructor-arg>
<constructor-arg value="20" name="age"></constructor-arg>
</bean>
3.4 测试方法同上
3.5 测试结果

4、命名空间方法注入
4.1bean.xml
需要在bean.xml头部引入
xmlns:p="http://www.springframework.org/schema/p"
<bean id="course" class="com.springdi.Course"
p:courseHours="200"
p:courseName=".NET"
p:teacher-ref="teacher"
/>
<bean id="teacher" class="com.springdi.Teacher"
p:age="20" p:name="老王"
/>
4.2 测试方法同上
4.3 测试结果

网友评论