Sring容器的懒加载lazy-init设置详解编程语言

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

如果你没有看到这个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.ClassPathXmlApplicationContex[email protected]: 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.DefaultListableBeanFact[email protected]: 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.ClassPathXmlApplicationContex[email protected]: 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.DefaultListableBeanFact[email protected]: 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" > 

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15731.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论