ioc与bean管理

IOC称之为控制反转,简单来说就是将对象的创建的权利和对象的声明周期的管理过程交给Spring框架来处理,在这个开发过程中不再需要关注对象的创建和生命周期的管理,而是在需要的时由Spring框架提供,这个由Spring框架管理对象创建和生命周期的机制称之为控制反转。
其中,在创建对象的过程中spring可以根据配置对象的属性进行设置,这个过程称为依赖注入(DI).

IOC的实现原理
在初始化一个spring容器时,spring会去解析指定的xml文件,当解析到其中的标签时,会根据该标签中的class属性指定的类的全路径名,荣国反射创建该类的对象,并将该对象存入内置的Map中管理。其中键就是该标签的id,值就是该对象,然后,当通过getBean方法来从容器中获取对象时,其实就是根据传入的条件在内置的Map中寻找是否有匹配的键值,如果有,就将该键值对中保存的对象返回,如果没有匹配到则抛出异常。
由此可以推测而知:
默认情况下,多次获取同一个id的bean,得到的将是同一个对象。

通过累的无参构造方法创建对象
上面案例就是这种方法,当用最普通方式配置一个时,默认就是采用累的额无参构造创建对象,在Spring容器初始化时,通过上配置的class属性反射得到字节码对象,通过newInstance()创建对象。
Class c=Class.forName(“类的全路径名称”);
Object obj=c.newInstance();
这种方式下spring创建对象,要求类必须有无参的构造,否则无法通过反射创建对象,会抛出异常。

Spring的单利和多例
Spring容器管理的bean在默认情况下是单例的,也即,一个bean只会创建一个对象,存在内置 map中,之后无论获取多少次该bean,都返回同一个对象。

Spring默认采用单例方式,减少了对象的创建,从而减少了内存的消耗。
但是在实际开发中是存在多例的需求的,Spring也提供了选项可以将bean设置为多例模式。

bean在单利模式下的声明周期:
bean在单利模式下,spring容器启动时解析xml发现该bean标签后,直接创建该bean的对象存入内部map中保存,此后无论调用多少次getBean()获取该bean都是从map中获取该对象返回,一直是一个对象。此对象一直被spring容器持有,直到容器退出,随着容器的退出对象被销毁

bean在多利模式下的声明周期:
bean在多例模式下,spring容器启动时解析xml发现该bean标签后,只是将该bean进行管理,并不会创建对象,此后每次使用getBean()获取该bean时,spring都会重新创建该对象返回,每次都是一个新的对象。这个对象spring容器并不会持有,什么时候销毁取决于使用该对象的用户自己什么时候销毁该对象。

扫描二维码关注公众号,回复: 7819797 查看本文章

懒加载机制
spring默认会在容器初始化的过程中,解析xml,并将单利的bean创建并保存到map中,这样的机制在bean比较少时问题不大,但一旦bean非常多时,spring需要在启动的过程中花费大量的时间来创建bean,花费大量的空间存储bean,但这些bean可能很久都用不上,这样启动时在时间和空间上的造成浪费。

所以spring提供了懒加载机制,所谓的懒加载机制就是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗。
懒加载机制只对单例bean有作用,对于多例bean设置懒加载没有意义。
————————————————
版权声明:本文为CSDN博主「haló」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43635271/article/details/86613083

猜你喜欢

转载自www.cnblogs.com/feng9exe/p/11835049.html
今日推荐