spring容器的懒加载
来源:互联网 发布:java转apk 编辑:程序博客网 时间:2024/05/20 16:32
默认情况下,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" >
以上代码本人亲测,可用
如果你没有看到这个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" >
以上代码本人亲测,可用
0 0
- spring容器的懒加载
- spring容器的懒加载lazy-init设置
- spring容器的懒加载lazy-init设置
- spring容器创建对象的时间和懒加载
- 如何手动控制spring容器的加载
- spring 容器加载
- Mian加载spring容器
- spring(4)---加载spring容器的3种方式
- Spring 源码分析:Spring容器的加载过程
- Spring MVC 容器加载原理
- Web容器启动时加载Spring的配置
- spring MVC 容器加载bean的一些实践
- 如何在Spring容器中加载自定义的配置文件
- 如何在Spring容器中加载自定义的配置文件
- 【Spring】Junit加载Spring容器作单元测试
- 【Spring】Junit加载Spring容器作单元测试
- Spring 容器--如何创建和加载一个 Spring 容器?
- Web容器启动时加载Spring
- matlab图像处理实验
- 设置过mysql远程连接后仍然无法进行远程连接 (mysql mysql报错2003 can't connect)
- css选择器优先级深入理解
- 小何讲进程:Linux中的exec函数族讲解
- Nginx:一致性哈希(第三方模块ngx_http_consistent_hash)
- spring容器的懒加载
- SET FOREIGN_KEY_CHECKS=0;在Mysql中取消外键约束。
- spring mvc 搭建二 ,返回json格式
- Spring MVC之@RequestBody, @ResponseBody 详解
- 视频处理
- 在不知道数组数量的时候你可以用List
- ssh 免密码登录
- 好文章:jq定义插件
- WebApi接口传参不再困惑:传参详解