spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy-load,该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初始化ACTION配置、到service配置到dao配置、乃至到数据库连接、事务等等。

这么庞大的规模,难怪spring的启动时间要花将近1分钟。尝试了一下,把beansdefault-lazy-init改为true就,再次启动,速度从原来的55秒,降到8秒钟!!Great!虽然是非常小一个改动,但是影响确实非常大。

Springdefault-lazy-init lazy-init

在同一个文件中<bean />里面设置的优先级大于<beans />里设置的优先级:

 

 

view plaincopy to clipboardprint?

1.<beans />                <bean />            immediately 

2.<beans />                <beanlazy-init="true" />  lazy      

3.<beans />                <beanlazy-init="false"/>  immediately           

4.<beansdefault-lazy-init="true"/> <bean />          lazy  

5.<beansdefault-lazy-init="true"/> <bean lazy-init="true" />     lazy  

6.<beansdefault-lazy-init="true"/> <bean lazy-init="false" />    immediately  

7.<beansdefault-lazy-init="false"/> <bean />            immediately  

8.<beans default-lazy-init="false"/>  <bean lazy-init="true"/>    lazy  

9.<beansdefault-lazy-init="false"/> <bean lazy-init="false" />   immediately  

如果在一个spring配置文件中引入另外的配置文件,如:<import resource="classpath:beanss.xml"/>

 

则以被引入文件(beanss.xml)中设置的<beans />里的设置为准,与引入文件中的设置无关。

 

 

view plaincopy to clipboardprint?

1.<bean id="testInit"lazy-init="true" init-method="init"class="com.test.Test"> 

2.</bean>  

如果在一个spring配置文件中引入另外的配置文件,如:<import resource="classpath:beanss.xml"/>

 

则以被引入文件(beanss.xml)中设置的<beans />里的设置为准,与引入文件中的设置无关。

 

 

 

1.<bean id="testInit"lazy-init="true" init-method="init"class="com.test.Test"> 

2.   </bean>  

springdefault-lazy-init参数

 

spring在启动的时候,会默认加载会默认加载整个对象实例图,从初始化ACTION配置、到 service配置到dao配置、乃至到数据库连接、事务等等。这样可以减少web服务器在运行时的负担,但是对于开发者来说无疑是效率极低的一个设置了。

 

    还好,spring提供了default-lazy-init属性,其配置形式如下,applicationContext.xml中:

 

< beans default-lazy-init ="true" >  

     < bean  class="org.xxxx.bean" >  

 

     。。。。。。

 

</beans>

 

   spring配置默认default-lazy-initfalse,当配置为truesping不会再去加载整个对象实例图,大大减少了初始化的时间,减少了spring的启动速度。

 

    这样做只是为了在开发过程中节约启动时间,在部署到实际环境中,倒是没必要设置default-lazy-inittrue。毕竟部署到实际环境中不是经常的事,每次启动1分钟倒不是大问题,而且可以提高服务器效率。

 

    当然,也不是所有的beans都能设置default-lazy-init成为true.对于schedulerbean不能用lazy-init  

 

< beans default-lazy-init ="true" >  

     < bean  class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  

         < property   name="triggers" >  

              < list >  

                  < ref   bean ="buildHtmlTrigger"/>  

                  < ref   bean ="askTrigger" />  

                  < ref   bean ="mailSenderTrigger"/>  

                  < ref   bean ="topicDetailBuildTrigger"/>  

                  < ref   bean ="forumBuildTrigger"/>  

                  < ref   bean ="topicBuildTrigger"/>  

              </ list >  

         </ property >  

     </ bean >  

</ beans >  

    这样的话。所有的scheduler就都不管用了。所以请大家要注意。  

 

 

 

Spring lazy-init abstract 属性

1.lazy-init

<beans>

     <bean id="service1" type="bean路径"lazy-init="true"/>

     <bean id="service2" type="bean路径"lazy-init="false">

            <property name="service1" ref="service1"/>

     </bean>

</beans>

以上两个bean,一个lazy-init属性为true,一个为false,由什么区别呢

IoC容器启动时,service2会实例化,而service1则不会;但是但容器实例化service2时,service1也被实例化了,为什么呢,因为service2需要它。也就是说lazy-init="true"beanIoC容器启动时不会实例化该bean,只有当容器需要用到时才实例化它。lazy-init有利于容器效率,对于不需要的bean可以先不管。

2.abstract

<bean id="baseTxService"

         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

      abstract="true">

           ……

</bean>

bean abstract="true"时,该bean不会被实例化,上面的bean是个模板