一、bean的延迟加载

  bean的两种初始化方式:实时初始化和延迟加载

  实时加载:Spring容器在启动中创建好bean的就是实时初始化。Spring中默认bean为单例,创建是实时初始化,在Spring容器启动时完成初始化,已外部调用。

  bean实时初始化的有点:1、尽快发现bean的定义问题;2、bean存储在Spring容器中,查找速度快。

  延迟加载:Spring容器在启动时不去创建bean,而是在bean被使用才去创建。

  Spring bean的被使用场景:bean作为被依赖的对象时(ref属性引用,构造函数,set方式注入,自动注入(byName/byType/constructor));使用者从Spring容器中通过getBean获取实例。

  延迟加载配置,bean 元素中的lazy-init属性值设置为true,就可以实现延迟加载。

<bean lazy-init="true" />

  bean对象设置为延迟加载,若是他的依赖bean是实时加载的。Spring容器会在启动的去查找依赖bean时,创建该bean。

   二、继承简化bean.xml的文件配置

  继承的使用,在bean.xml文件中先定义一个抽象的bean实例,设置其abstract属性为true,另外定义一个bean对象,通过parent属性继承抽象bean。这样就能获取到他父类配置的元数据信息。noUniqueBean中未配置字段的信息,则以parent中设置的bean为准。

<bean id="baseService" abstract="true">
        <property name="service" ref="serviceB1"></property>
    </bean>
    <bean id="noUniqueBean" class="com.java.spring01.demo6.NoUniqueBean" parent="baseService">
        <!--<property name="service" ref="serviceB2"></property>-->
    </bean>

  获取到的bean运行信息

NoUniqueBean{service=com.java.spring01.demo6.NoUniqueBean$ServiceB@27fe3806}

  若是在noUniqueBean中配置了字段属性的值,则以noUniqueBean的配置为准。

<bean id="noUniqueBean" class="com.java.spring01.demo6.NoUniqueBean" parent="baseService">
        <property name="service" ref="serviceB2"></property>
    </bean>

  获取到的bean运行信息

NoUniqueBean{service=com.java.spring01.demo6.NoUniqueBean$ServiceA@27fe3806}
  1. bean元素的abstract属性为true的时候可以定义某个bean为一个抽象的bean,相当于定义了一个bean模板,spring容器并不会创建这个bean,从容器中查找abstract为true的bean的时候,会报错BeanIsAbstractException异常
  2. bean元素的parent属性可以指定当前bean的父bean,子bean可以继承父bean中配置信息,也可以自定义配置信息,这样可以覆盖父bean中的配置。

  三、单例中创建多例对象

  bean对象A是多例,bean对象B是单例,在B中注入对象A,则每次获取B对象的信息,A的对象信息都是同一个。Spring容器在启动时会为B对象获取A对象,B对象创建之后,B里面的属性A的值就不会再变化。

  单例中创建多例的方式有三种:

  1、ApplicationContext接口的方式,每次获取多例属性的时候通过Spring容器获取;

  2、lookup-method方式

  3、replaced-method方式