zoukankan      html  css  js  c++  java
  • 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.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" > 
  • 相关阅读:
    JVM内存模型与类加载机制
    JS 实现动态轮播图
    Jedis & spring-data-redis
    JAVA反射机制与动态代理
    JavaScript -- 筑基
    IO流与装饰者模式
    ES&IK环境搭建
    Elasticsearch笔记
    DQL
    DDL--DML
  • 原文地址:https://www.cnblogs.com/shamo89/p/8051953.html
Copyright © 2011-2022 走看看