1. IOC概念
IOC称为**控制反转**,所谓控制反转就是将对象的创建权利及生命周期交由Spring框架来处理,这个由Spring框架管理对象创建和生命周期的机制称为控制反转
2. IOC的初始化原理
在初始化Spring容器时Spring会去找指定的xml文件,当解析到其中的bean标签会根据该标签中的class属性指定的类的全路径名,通过反射创建该类对象,并将对象存入内置的Map中管理,其中键就是该标签的id值,值就是这个对象
之后通过getBean方法从容器中获取对象,就是根据传入的条件在内置的Map中寻找,是否由匹配的键值,如果有则将该键值对中保存的对象返回,如果没有匹配到则抛出异常
由此可以推测而知
默认情况下多次获取同一个id的bean得到的是同一个对象
**不可以有多个相同id的bean**
可以有多个id不同但class相同的bean
3. IOC获取对象的方式
使用getBean方法,其中参数可以为id值或者类型
根据id值查找:
找到唯一一个创建对象
找不到抛出异常
**不可能找到多个(多个会在容器初始化时就报错)**
根据类型查找
找到唯一一个创建对象
找不到抛出异常
找到多个抛出异常
4. Spring创建对象的方式
- 无参构造
默认情况下利用类的无参构造创建对象 - 通过工厂创建对象
a. 静态工厂创建对象
创建一个类,构造方法私有化,对外提供公共的静态方法
在配置文件中配置
其中class为创建的那个类的全路径,在bean的属性上添加了属性factory-method值为getInstance()
b. 实例工厂创建对象
实例工厂提供的方法不是静态的,实例工厂在配置文件中的配置有两个bean标签,要先创建出实例工厂的对象,再调用实例工厂上的对象指定的普通方法来创建对象
第一个bean标签class为自己创建的一个工厂类
第二个bean标签class为第一个bean标签的id值,添加factory-method属性值为getInstance()
c. Spring工厂创建对象
由Spring提供的工厂,编写一个类,实现FactoryBean<类>
并重写里面三个方法,这三个方法分别代表生产bean对象的方法,获取bean类型的方法,告知当前bean是否使用单例模型的方法
5. Spring的单例和多例
Spring在默认情况下创建的对象是单例的,也就是说一个bean只会创建一个对象,存在内置map中之后无论获取多少次bean都会返回同一个对象
单例减少了对象的创建从而减少了内存的消耗,但是在实际开发过程中是由多例的需求的,bean标签的scope属性可以设置单例或者多例(prototype)
多例模式下的Spring
Spring容器启动时,解析xml发现该bean标签后,并不会创建对象,只是将该bean进行管理,此后每次使用getBean获取对象时,Spring都会重新创建该对象并返回,每次都是一个新的对象,创建的对象并不会存入map中,什么时候销毁由使用者自己决定
6. 懒加载机制
Spring默认会在容器初始化时解析xml,并将单例的bean创建并保存到map中,这样的机制在bean比较少时问题不大,但bean非常多时,spring在启动的过程中会花费大量的时间来创建bean花费大量的空间来存储bean,非常耗费性能,所以Spring提供了懒加载机制
所谓的懒加载机制,可以规定指定的bean,不在启动时立即创建,而在第一次使用时才创建,从而减轻在启动过程中对内存和时间的消耗
懒加载机制只对单例bean有作用,对于多例bean设置懒加载没有任何意义,懒加载只是延后了对象创建的时间,对象仍然是单例的
配置懒加载使用的属性lazy-init,值为true表示懒加载
可以为全局配置懒加载在beans标签添加属性default-lazy-init为true