一 .概述
前面我们说到IOC提供的功能就是两点.
(1)Bean的创建
(2)Bean依赖的管理
本节就讨论Bean的创建的问题.
二 .java对象到底如何创建
我们在未使用spring的时候,创建对象的方式只有一个,那就是使用构造函数.
spring也没有什么其他的神奇能力,依旧还是使用的构造函数.
我们一般将构造函数分成两类 :
(1)无参构造函数
(2)有参构造函数
为何这样区分呢?
对象如果要使用就需要创建出来,使用构造函数式唯一的途径.但是一个对象想要运转就可能需要依赖,如果我们想要保证这种强依赖关系,最好的方式就是在构造函数之中声明.
如果我们的构造函数需要参数,就说明这个对象需要强依赖某个对象(资源,泛化的资源).
那么是不是说没有无参构造函数的对象就不需要强依赖呢?不是,虽然能创建出对象来,但是对象未必是可用的,这个时候对象就需要进行初始化操作.
但是有强依赖的对象一定需要在创建的时候指明,否则根本无法获得这个对象.构造函数决定了这一点.
这样我们创建对象的方式就从这里出现了一点不同,但是我们需要知道的是Bean的创建就是在使用构造函数.
记住,创建并不等于初始化,这个概念在spring之中分的很明显,但是我们常常将创建和初始化都称为初始化.
三 .反射创建对象
没有其他的方式,spring也是使用了反射来创建对象.这里我们只先说无参的情况下,有参的情况其实就是依赖注入的内容了.
下面一个简单的例子展示一下反射创建对象:
public class MainTest { public static void main(String[] args) throws Exception { //获取类加载器 ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); //加载Date字节码 Class<?> clazz = classLoader.loadClass("java.util.Date"); //创建对象,Date用于无参构造函数 Date date = (Date) clazz.newInstance(); System.out.println(date); } }
我们给出了java字节码的位置.我们就能使用反射来创建对象.spring也是使用这个方式来创建对象的,当然其中的复杂度spring帮助我们隐藏掉了.
四 . 总结
IOC的一个主要任务就是创建对象,我们现在知道创建对象的唯一方式就是构造函数.
因此我们无论使用什么方式,都是将构造函数的信息交给spring,spring才能帮助我们创建出Bean来.