Spring IOC介绍

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

创建过程

  1. 创建完工程,导入相关的jar包,创建Spring的配置文件,通常使用application.xml来命名,这个文件放置在类加载的目录下(src目录),方便后续使用。

  2. 创建bean类,在spring中进行配置交由spring来管理
    Spring IOC介绍_第1张图片

  3. 在程序中通过spring容器获取对象并使用
    Spring IOC介绍_第2张图片
    通过context.getBean()方法获取bean时 ,通过两种方式获取:
    传入id值
    传入class类型
    通过class方式获取bean时,如果同一个类配置过多个bean,则在获取时因为无法确定是哪个bean会抛出异常,而id是唯一的,所以,建议使用id获取bean。
    Spring IOC介绍_第3张图片

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

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

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

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

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

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

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

    所以spring提供了懒加载机制,所谓的懒加载机制就是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗。
    懒加载机制只对单例bean有作用,对于多例bean设置懒加载没有意义。

懒加载的配置方式:
为指定的bean配置懒加载:
Spring IOC介绍_第6张图片

为全局配置懒加载:
Spring IOC介绍_第7张图片
**如果同时设定全局和指定bean的懒加载机制,且配置不相同,则对于该bean局部配置覆盖全局配置。

你可能感兴趣的:(1)