Spring 配置中的 default-lazy-init=true

2024-05-03 02:32

本文主要是介绍Spring 配置中的 default-lazy-init=true,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy-load,该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初始化ACTION配置、到service配置到dao配置、乃至到数据库连接、事务等等。 
这么庞大的规模,难怪spring的启动时间要花将近1分钟。尝试了一下,把beans的default-lazy-init改为true就,再次启动,速度从原来的55秒,降到8秒钟!!Great!虽然是非常小一个改动,但是影响确实非常大。 
Spring的default-lazy-init 与 lazy-init 
在同一个文件中<bean />里面设置的优先级大于<beans />里设置的优先级: 

view plaincopy to clipboardprint? 
1.<beans />                <bean />            immediately  
2.<beans />                <bean lazy-init="true" />   lazy       
3.<beans />                <bean lazy-init="false"/>   immediately            
4.<beans default-lazy-init="true"/>  <bean />          lazy   
5.<beans default-lazy-init="true"/>  <bean lazy-init="true" />     lazy   
6.<beans default-lazy-init="true"/>  <bean lazy-init="false" />    immediately   
7.<beans default-lazy-init="false"/>  <bean />             immediately   
8.<beans default-lazy-init="false"/>  <bean lazy-init="true" />    lazy   
9.<beans default-lazy-init="false"/>  <bean lazy-init="false" />   immediately   
如果在一个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>   
如果在一个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>   
spring的default-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-init为false,当配置为true时sping不会再去加载整个对象实例图,大大减少了初始化的时间,减少了spring的启动速度。 

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

    当然,也不是所有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用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"的bean,IoC容器启动时不会实例化该bean,只有当容器需要用到时才实例化它。lazy-init有利于容器效率,对于不需要的bean可以先不管。 
2.abstract 
<bean id="baseTxService" 
          class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
       abstract="true"> 
            …… 
</bean> 
bean abstract="true"时,该bean不会被实例化,上面的bean是个模板 

转自:http://javatea.iteye.com/blog/1337706

关于abstract更多可见:https://blog.csdn.net/u010002184/article/details/80628657

这篇关于Spring 配置中的 default-lazy-init=true的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955645

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏