spring 的 IOC 是怎么创建对象的呢??我们来 用 xml 配置文件 的方式 来探索一下。
package top.muquanyu.pojo;
public class User {
private String name = null;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(){
System.out.println("调用了无参构造!");
}
public void show(){
System.out.println("name = " + name);
}
}
我们都知道 一个对象 能被 new 出来,完全归功于 隐藏起来的 构造函数。所以可以大胆的猜想 spring 的 IOC 是在某一个时刻 调用了 构造函数,然后 进行 创建 这个 对象的。
我们 debug 会发现,当 我们解析xml文件后,获取到 上下文对象时,就已经调用了 无参构造了。也就是说 确实它 是 利用 构造函数 去 创建的对象,而且还是 在分析 xml 文件时,直接创建的!!!
4.2 有参构造 IOC 怎么玩
如果我们 要创建的 这个对象,只有 有参构造,而没有无参构造。那么 我们的 xml 应该如何配置呢??我们 怎么 去 把 需要填写的 参数,进行一个 设置呢?
public User(String name){
this.name = name;
}
这个时候 它会提示我们,你并未 设置 有参构造函数里面的 name 参数,则 我们 不能够 成功的 给你 创建一个 对象。
- 解决方法①(强烈推荐)
下标 index 确定 每个参数 然后 进行设置。
当然我们 还会 因为 配置的顺序问题,导致 最后的 属性可能 再次被设置。比如这副图,我们 在 有参构造之后,又进行了 一次赋值。
- 解决方法②(不推荐)
根据 提供的参数类型,来找到第一个对应上的参数,进行赋值的过程。
当我们 有多个参数 同类型的时候,我们在 匹配参数的时候,就会出现 问题。所以不建议使用。
- 解决方法③(推荐)
直接输入 对应的参数名,去找参数,然后进行赋值。如果这个参数 的类型,是已经 被你 设置为 bean 的话,那么你可以 ref 赋值。否则 用 value。
spring IOC 容器:就是这个 我们通过 xml 配置文件,获取到的 context 上下文对象。所以一提到 容器的时候,千万别慌,它俩其实是一个东西。
- 一旦 初始化了 容器,xml 中 配置的所有 bean 对象 都会 被 创建,不过 只能创建 这一个!!!
下图 证明 只创建了 一个对象:
经过这几章的学习,你会 很直接的感受到 Spring IOC 容器就类似于 第三方的中介。帮你 去 托管,去配置一些东西。这个 其实 就是 IOC 思想/理论 的一种实现方式。



