spring容器的懒加载lazy-init设置

2024-08-27 08:18

本文主要是介绍spring容器的懒加载lazy-init设置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

默认情况下,spring的IOC容器中lazy-init是false的,即没有打开懒加载模式。 

如果你没有看到这个lazy-init 的参数设置就说明是false啦。 

那么什么是懒加载? 

懒加载---就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中。 

例如我有如下的代码: 
Java代码   收藏代码
  1. package com.luch.spring.demo;    
  2.     
  3. import org.springframework.beans.factory.annotation.Autowired;    
  4.     
  5. import com.luch.spring.bean.Person;    
  6.     
  7. public class NewPerson {    
  8.         
  9.     @Autowired    
  10.     private Person person;    
  11.         
  12.     public NewPerson(){    
  13.         System.out.println("lazy loading...");    
  14.     }    
  15.     public void printMsg(){    
  16.         if(person !=null) {    
  17.             System.out.println(person.getName());    
  18.         } else {    
  19.             System.out.println("no person initialize!");    
  20.         }    
  21.     }    
  22.     
  23.     public void setPerson(Person person) {    
  24.         //this.person = person;    
  25.     }    
  26.         
  27.     
  28. }    

在无惨构造器里输出一句话,然后我先不设置懒加载模式:我有一个beans.xml的配置文件: 
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  4.        xmlns:context="http://www.springframework.org/schema/context"     
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans    
  6.            http://www.springframework.org/schema/beans/spring-beans.xsd    
  7.             http://www.springframework.org/schema/context      
  8.             http://www.springframework.org/schema/context/spring-context.xsd">    
  9.                
  10.            <context:annotation-config/>    
  11.            <bean id="person" class="com.luch.spring.bean.Person">    
  12.                <property name="id" value="22"></property>    
  13.                <property name="name" value="Jack"></property>    
  14.            </bean>    
  15.                
  16.            <bean id="newPerson" class="com.luch.spring.demo.NewPerson">    
  17.                <property name="person" ref="person"></property>    
  18.            </bean>    
  19.                
  20. </beans>    


然后我用一个junit来做测试: 
Java代码   收藏代码
  1. package junit.test;    
  2.     
  3. import static org.junit.Assert.*;    
  4.     
  5. import org.junit.Test;    
  6.     
  7. import org.springframework.context.support.AbstractApplicationContext;    
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;    
  9.     
  10. import com.luch.spring.demo.NewPerson;    
  11.     
  12. public class JunitTest {    
  13.     
  14.     @Test    
  15.     public void printMsg(){    
  16.         AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("/beans.xml");    
  17.         //NewPerson test = (NewPerson) ctx.getBean("newPerson");    
  18.         //test.printMsg();    
  19.     }    
  20. }    



这个时候输出的结果为: 
四月 17, 2014 9:26:41 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh 
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@762efe5d: startup date [Thu Apr 17 21:26:41 CST 2014]; root of context hierarchy 
四月 17, 2014 9:26:42 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
信息: Loading XML bean definitions from class path resource [beans.xml] 
四月 17, 2014 9:26:42 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@77caeb3e: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,person,newPerson,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy 
lazy loading..
 
即对象被实例化了,也就是被加载到spring的容器中去了。 


然后我们设置一下懒加载模式:我们beans.xml的配置文件. lazy-init="true"即 
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  4.        xmlns:context="http://www.springframework.org/schema/context"     
  5.        xsi:schemaLocation="http://www.springframework.org/schema/beans    
  6.            http://www.springframework.org/schema/beans/spring-beans.xsd    
  7.             http://www.springframework.org/schema/context      
  8.             http://www.springframework.org/schema/context/spring-context.xsd">    
  9.                
  10.            <context:annotation-config/>    
  11.            <bean id="person" class="com.luch.spring.bean.Person">    
  12.                <property name="id" value="22"></property>    
  13.                <property name="name" value="Jack"></property>    
  14.            </bean>    
  15.                
  16.            <bean id="newPerson" lazy-init="true" class="com.luch.spring.demo.NewPerson">    
  17.                <property name="person" ref="person"></property>    
  18.            </bean>    
  19.                
  20. </beans>  


再重新跑一次junit:结果为: 
四月 17, 2014 9:33:54 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@762efe5d: startup date [Thu Apr 17 21:33:54 CST 2014]; root of context hierarchy四月 17, 2014 9:33:54 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [beans.xml]四月 17, 2014 9:33:54 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@77caeb3e: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,person,newPerson,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy  
即没有了实例化的过程,这个时候只有在你需要它的时候,它才会出现。比如你执行了: 
NewPerson test = (NewPerson) ctx.getBean("newPerson"); 这个时候你的bean就实例化出来了。 
那么是不是我如果很多的bean都不想在IOC容器启动的时候就加载,而是要beans.xml的每个bean里都加上lazy-init属性呢。 
不用的,spring提供了default-lazy-init方法来实现这个业务。 
我们只要在beans的头里面加上这个就ok 了 

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

以上代码本人亲测,可用 

这篇关于spring容器的懒加载lazy-init设置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin