spring容器的懒加载lazy-init设置 博客分类: spring spring
程序员文章站
2024-03-13 13:36:39
...
默认情况下,spring的IOC容器中lazy-init是false的,即没有打开懒加载模式。
如果你没有看到这个lazy-init 的参数设置就说明是false啦。
那么什么是懒加载?
懒加载---就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中。
例如我有如下的代码:
在无惨构造器里输出一句话,然后我先不设置懒加载模式:我有一个beans.xml的配置文件:
然后我用一个junit来做测试:
这个时候输出的结果为:
四月 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"即
再重新跑一次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" >
以上代码本人亲测,可用
csdn博客真的垃圾,真心用不下去了
如果你没有看到这个lazy-init 的参数设置就说明是false啦。
那么什么是懒加载?
懒加载---就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中。
例如我有如下的代码:
package com.luch.spring.demo; import org.springframework.beans.factory.annotation.Autowired; import com.luch.spring.bean.Person; public class NewPerson { @Autowired private Person person; public NewPerson(){ System.out.println("lazy loading..."); } public void printMsg(){ if(person !=null) { System.out.println(person.getName()); } else { System.out.println("no person initialize!"); } } public void setPerson(Person person) { //this.person = person; } }
在无惨构造器里输出一句话,然后我先不设置懒加载模式:我有一个beans.xml的配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="person" class="com.luch.spring.bean.Person"> <property name="id" value="22"></property> <property name="name" value="Jack"></property> </bean> <bean id="newPerson" class="com.luch.spring.demo.NewPerson"> <property name="person" ref="person"></property> </bean> </beans>
然后我用一个junit来做测试:
package junit.test; import static org.junit.Assert.*; import org.junit.Test; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.luch.spring.demo.NewPerson; public class JunitTest { @Test public void printMsg(){ AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("/beans.xml"); //NewPerson test = (NewPerson) ctx.getBean("newPerson"); //test.printMsg(); } }
这个时候输出的结果为:
四月 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 version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> <bean id="person" class="com.luch.spring.bean.Person"> <property name="id" value="22"></property> <property name="name" value="Jack"></property> </bean> <bean id="newPerson" lazy-init="true" class="com.luch.spring.demo.NewPerson"> <property name="person" ref="person"></property> </bean> </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" >
以上代码本人亲测,可用
csdn博客真的垃圾,真心用不下去了
上一篇: 互联网金融定义 博客分类: 金融
下一篇: 又一波Java专业人士必备书籍来袭
推荐阅读
-
spring容器的懒加载lazy-init设置 博客分类: spring spring
-
加载spring配置文件的常用三种方法 博客分类: Spring SpringWebXMLStrutsJava
-
Spring配置文件location的几种设置方法 博客分类: SpringFramework SpringFramework
-
JSP获取spring 的容器ApplicationContext 博客分类: Java WebJava spring容器JSP获取beanJSP获取容器WebApplicationContextUtils
-
springboot2.4.1跨域设置的变化 博客分类: spring boot 实践笔记 springboot2.4.1跨域
-
spring同时集成redis和mongodb时遇到多个资源文件加载的问题 博客分类: java
-
Spring的IoC容器实现原理(一)#loadBeanDefinition 博客分类: Spring SpringIoC
-
Spring基本用法5——容器中Bean的生命周期 博客分类: Spring Spring容器Bean生命周期Spring基本用法
-
Spring基本用法3——Spring容器中Bean的相关属性 博客分类: Spring SpringBean属性集合注入