spring容器的懒加载

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

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

那么什么是懒加载?

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

例如我有如下的代码:


 
  1. package com.luch.spring.demo;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import com.luch.spring.bean.Person;
  4. public class NewPerson {
  5. @Autowired
  6. private Person person;
  7. public NewPerson(){
  8. System.out.println( "lazy loading...");
  9. }
  10. public void printMsg(){
  11. if(person != null) {
  12. System.out.println(person.getName());
  13. } else {
  14. System.out.println( "no person initialize!");
  15. }
  16. }
  17. public void setPerson(Person person) {
  18. //this.person = person;
  19. }
  20. }

在无惨构造器里输出一句话,然后我先不设置懒加载模式:我有一个beans.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. <context:annotation-config/>
  10. <bean id="person" class="com.luch.spring.bean.Person">
  11. <property name="id" value="22"> </property>
  12. <property name="name" value="Jack"> </property>
  13. </bean>
  14. <bean id="newPerson" class="com.luch.spring.demo.NewPerson">
  15. <property name="person" ref="person"> </property>
  16. </bean>
  17. </beans>

然后我用一个junit来做测试:


 
  1. package junit.test;
  2. import static org.junit.Assert.*;
  3. import org.junit.Test;
  4. import org.springframework.context.support.AbstractApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6. import com.luch.spring.demo.NewPerson;
  7. public class JunitTest {
  8. @Test
  9. public void printMsg(){
  10. AbstractApplicationContext ctx = new ClassPathXmlApplicationContext( "/beans.xml");
  11. //NewPerson test = (NewPerson) ctx.getBean("newPerson");
  12. //test.printMsg();
  13. }
  14. }

这个时候输出的结果为:

四月 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"即


 
  1. <code class="language-java"><?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></code>  

 
  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. <context:annotation-config/>
  10. <bean id= "person" class= "com.luch.spring.bean.Person">
  11. <property name= "id" value= "22"></property>
  12. <property name= "name" value= "Jack"></property>
  13. </bean>
  14. <bean id= "newPerson" lazy-init= "true" class= "com.luch.spring.demo.NewPerson">
  15. <property name= "person" ref= "person"></property>
  16. </bean>
  17. </beans>

 
  1.   

   
  1.   
 
  
 
  
 
  
 
  
 
  
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值