Spring框架学习之IOC原理问题

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创建对象的方式

  1. 无参构造
    默认情况下利用类的无参构造创建对象
  2. 通过工厂创建对象
    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值