大多数的依赖注入文章是上都是三种方式,但是官网上是只有两种的:构造函数注入和set函数注入
其实我感觉就是在xml上配置参数的值,然后通过构造函数或者set函数把值注入了对象中,这只是我个人看到表面上的一个意思,有没更深层的意义我暂时不懂那么多 -_- …
首先DI(Dependency Injection)依赖注入 。
相对于IoC而言,依赖注入(DI)更加准确地描述了IoC的设计理念。所谓依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。
1.Set函数注入:
1).普通属性赋值
2).对象属性赋值
1)普通属性赋值
先建一个要被注入的对象
package cn.tedu.spring;
public class User {
private String name;
private Integer age;
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;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
然后配置类applicationContext.xml
2)对象属性赋值
创建一个对象UserInfo.java
package cn.tedu.spring;
public class UserInfo {
//TODO加一个普通属性 tall
//TODO加一个对象属性UserExtra
}
这个对象我没写属性,因为有属性那也是一摸一样的操作,重复一遍而已
如果UserInfo中有属性则在id为userinfo的bean中写入
分别测试
package cn.tedu.test;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.tedu.spring.User;
//测试DI依赖注入
public class TestDI {
@Test
public void di(){
//加载核心配置文件
ClassPathXmlApplicationContext ac =
new ClassPathXmlApplicationContext(
"applicationContext.xml");
//获取bean对象
User user = (User) ac.getBean("user");
//可以把关联对象的信息也都输出就成功了
System.out.println(user);
}
}
构造函数注入
package cn.tedu.spring;
//测试构造方法给属性赋值
public class Dept {
private Integer id;
private String name;
//构造方法赋值new Dept(1,"lisi");
public Dept(Integer id,
String name){
this.id=id;
this.name=name;
}
//getters and setters
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;
}
//toString
@Override
public String toString() {
return "Dept [id=" + id + ", name=" + name + "]";
}
}
配置文件
如果只有一个的话,下标index不用写
测试
@Test
public void di2(){
//加载核心配置文件
ClassPathXmlApplicationContext ac =
new ClassPathXmlApplicationContext(
"applicationContext.xml");
//获取bean对象
Dept d = (Dept) ac.getBean("dept");
//可以把关联对象的信息也都输出就成功了
System.out.println(d);
}
注意:值使用value属性,对象使用ref属性。ref和value不能同时存在