`
xfxlch
  • 浏览: 167595 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring容器的懒加载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" >

以上代码本人亲测,可用

csdn博客真的垃圾,真心用不下去了
分享到:
评论
1 楼 mengyue0477 2016-07-30  
最后还不忘吐槽一下 哈哈 太逗了

相关推荐

    Spring 延迟实例化

    在Spring中配置一个bean为延迟实例化非常简单,只需要在`&lt;bean&gt;`元素中添加`lazy-init`属性并设置其值为`true`即可。例如: ```xml &lt;bean id="lazyBean" class="com.example.LazyBean" lazy-init="true"&gt; &lt;!-- ...

    spring-framework-5.1.x-源碼解析详细注解

    懒加载是一种优化策略,只有当真正需要使用某个组件时,Spring容器才会去初始化它。在源码中,这个特性体现在`@Lazy`注解上,它可以在bean定义上使用,标记为懒加载。跟踪`org.springframework.beans.factory....

    spring.xls

    * lazy-init为“default/false”当启动spring容器的时候创建bean 但是如果该bean是prototype时,特殊。这种情况无效 * 在spring容器启动的时候,就会发现错误 * 有可能会造成一些数据长时间驻留在内存中 * lazy...

    spring2.0技术手册--林信良

    - **Bean 的懒加载**:通过设置 `&lt;bean lazy-init="true"&gt;`,可以让 Bean 在首次被请求时才进行初始化,提高了系统启动速度。 - **依赖查找**:除了原有的依赖注入之外,还支持依赖查找(Dependency Lookup),即在...

    Spring--2.Spring 中的 Bean 配置-2-2

    通过设置`lazy-init="true"`,我们可以让Bean在第一次请求时才初始化。 8. ** Profiles:** Spring支持多环境配置,通过`@Profile`注解可以指定Bean在特定环境下生效。 9. **AOP(面向切面编程):** Spring的...

    HelloSpring.zip

    我的博客中“maven环境搭建及Spring入门”的项目代码。在idea中运行成功。 1。创建IOC容器 2。通过xml装配对象 ...默认情况下IOC容器创建的时候就会自动创建所有对象,只支持懒加载。default-lazy-init=true

    Spring動態加載Bean

    2. **XML配置**:在传统的XML配置中,可以使用`lazy-init="true"`属性实现Bean的懒加载。如: ```xml &lt;bean id="lazyService" class="com.example.LazyService" lazy-init="true"/&gt; ``` 3. **使用`...

    第十章 Spring 配置元信息(Configuration Metadata)1

    - `default-lazy-init`:如果设置为true,所有Bean默认为懒加载,否则默认立即初始化。 - `default-autowire`:设定容器的自动装配策略,默认为"no",表示不进行自动装配。 - `default-init-method`和`default-...

    Struts Spring Hibernate性能优化

    Spring容器的启动时间较长主要是因为默认情况下,所有bean都被设置为非懒加载(lazy-init=false),这意味着在容器启动时会立即实例化所有bean。对于大规模项目,这可能导致大量的初始化操作,延长启动时间。解决这...

    spring+ajax+mybatis+springmvc笔记

    - 通过设置 `lazy-init` 属性为 `true`,可以使容器延迟创建这些 bean 实例,直到首次使用时才创建。 - **2.7 Set 方式注入** - 需要提供相应的 setter 方法,并在配置文件中使用 `&lt;property&gt;` 元素进行配置。 #...

    Spring配置使用之Bean生命周期详解

    Spring 配置使用之 Bean 生命周期详解 Spring 配置使用之 Bean 生命周期详解是指在 Spring 框架中,...通过 lazy-init、depends-on、init-method 和 destroy-method 等属性,可以灵活地控制 Bean 的生命周期和行为。

    spring bean的生命周期

    - **Singleton Beans的懒加载**:如果Bean的scope为singleton,并且在XML配置中没有设置`lazy-init="true"`,那么Spring容器在启动时就会实例化这些Bean。 - **Prototype Beans的每次请求创建**:scope为prototype...

    百知教育 — Spring系列课程 — 工厂高级特性1

    3. **懒加载(Lazy-Initialization)**: - 使用`lazy-init="true"`标志,可以使Bean延迟到第一次被请求时才初始化,而不是容器启动时立即初始化。 4. **初始化方法(Init-Methods)**: - 可以通过`init-method`...

    spring_精简教程

    - **`lazy-init`属性**:控制Bean是否延迟加载,默认情况下Bean在容器启动时就会被创建,但可以通过设置`lazy-init`属性为`true`实现按需加载。 - **`scope`属性**:用于指定Bean的生命周期范围,如`singleton`...

    spring bean加载

    - Spring容器提供了各种事件,如`ContextRefreshedEvent`(容器启动或刷新时触发)、`BeanInitializedEvent`(Bean初始化后触发)。通过实现`ApplicationListener`接口,可以监听并响应这些事件。 8. **Spring ...

    Spring 培训.pdf

    - `init-method`和`destroy-method`可以用来指定初始化和销毁时调用的方法。 Spring框架的这些核心特性和功能极大地简化了Java应用程序的开发流程,使得开发者能够更加专注于业务逻辑的实现,而不需要过多关注底层...

    spring-core.pdf

    - **1.4.4 惰性初始化Bean**: 通过设置`lazy-init`属性为`true`,可以让Spring容器延迟创建Bean,直到第一次调用时才实例化。 - **1.4.5 自动装配协作对象**: Spring支持自动装配协作对象,减少显式配置的需求。 -...

    【Java面试】介绍下Spring IoC的工作流程.doc

    - **单例Bean的实例化**:对于非懒加载(lazy-init)的单例Bean,Spring会使用反射机制创建实例并将其存储在内存中,以备后续请求使用。 - **依赖注入**:在实例化Bean的过程中,Spring会检查BeanDefinition中的依赖...

    基于springioc bean 的几个属性介绍

    如果将 lazy-init 设置为 true,則等到 Spring 容器去获取该 Bean 的对象时才会创建。这样可以避免内存的浪费,但可能会延迟 Bean 对象的创建。 2. scope 属性 scope 属性用于控制 Bean 对象的作用域。其默认值是 ...

    撸一撸Spring Framework-IoC-BeanDefinition(csdn)————程序.pdf

    如`scope`(作用域)、`abstract`(是否为抽象bean)、`lazy-init`(是否延迟初始化)、`autowire`(自动装配模式)、`depends-on`(依赖的其他bean)、`init-method`(初始化方法)和`destroy-method`(销毁方法)...

Global site tag (gtag.js) - Google Analytics