`
mosquito2a
  • 浏览: 4228 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

bean加载lazy-init

 
阅读更多
首先是找到了hibernate的启动优化 http://www.hibernate.org/194.html  里面的主要思想是通过将xml序列花到本地的
文件里,每次读取的时候根据情况,从本地文件读取并反序列化,节省了hibernate xml的解析时间。按照这个方式测试了
一下,发现hibernate的启动时间从5秒降低到3秒,但是这个优化对于整个启动过程是杯水车薪的,毫无用处。
下面是hibernate的优化代码:


public Configuration addCachableFile(String xmlFile) throws MappingException {       
        try {
            File file = new File(xmlFile);
            File lazyfile = new File(xmlFile + ".bin");
            org.dom4j.Document doc = null;
            List errors = new ArrayList();
            if(file.exists() && lazyfile.exists() && file.lastModified()<lazyfile.lastModified()) {
                log.info("Mapping lazy file: " + lazyfile.getPath());
                ObjectInputStream oip = null;
                oip = new ObjectInputStream(new FileInputStream(lazyfile));
                doc = (org.dom4j.Document) oip.readObject();
                oip.close();
            } else {
                doc = xmlHelper.createSAXReader(xmlFile, errors, entityResolver).read( file );
                log.info("Writing lazy file to " + lazyfile);
                ObjectOutputStream oup = new ObjectOutputStream(new FileOutputStream(lazyfile));
                oup.writeObject(doc);
                oup.flush();
                oup.close();
            }
           
            if ( errors.size()!=0 ) throw new MappingException( "invalid mapping", (Throwable) errors.get(0) );
            add(doc);
            return this;
        }
        catch (Exception e) {
            log.error("Could not configure datastore from file: " + xmlFile, e);
            throw new MappingException(e);
        }
    }

没办法,又仔细查看了spring的资料,终于发现spring的容器是提供了lazy-load的,即默认的缺省设置是bean没有lazy- load,
该属性处于false状态,这样导致spring在启动过程导致在启动时候,会默认加载整个对象实例图,从初始化ACTION配置、
到 service配置到dao配置、乃至到数据库连接、事务等等。这么庞大的规模,难怪spring的启动时间要花将近1分钟。尝
试了一下,把beans的 default-lazy-init改为true就,再次启动,速度从原来的55秒,降到8秒钟!!Great!虽然是非常
小一个改动,但是影响确实非常大。一个项目组10个人,假若每个人一天平均需要在eclipse下启动测试服务器50次。那么
一天项目组需要重启500次,每次节省50秒的话,就是 25000秒,将近几个小时,差不多一个工作日,多么可观的数字!


不过在运行期间第一次点页面的时候,由于spring做了lazy-load,现在就需要启动一部分需要的beans,所以稍微慢2-3
  秒钟,但是明显比等几十秒要快很多,值得一鉴。

以上是针对开发阶段的spring容器启动优化,在部署到实际环境中,倒是没必要设置为lazy-load。毕竟部署到实际环境
中不是经常的事,每次启动1分钟倒不是大问题。

我这里要提醒的是不是说有的beans都能设置default-lazy-init成为true.对于scheduler的bean不能用lazy-init


< beans  default-lazy-init ="true" >  
     < bean  class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
         < property  name ="triggers" >
             < list >
                 < ref  bean ="buildHtmlTrigger" />
                 < ref  bean ="askTrigger" />
                 < ref  bean ="mailSenderTrigger" />
                 < ref  bean ="topicDetailBuildTrigger" />
                 < ref  bean ="forumBuildTrigger" />
                 < ref  bean ="topicBuildTrigger" />
             </ list >
         </ property >
     </ bean >
</ beans >
这样的话。所有的scheduler就都不管用了。所以请大家要注意。下面这样才是可以执行的

< beans > 
     < bean  class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
         < property  name ="triggers" >
             < list >
                 < ref  bean ="buildHtmlTrigger" />
                 < ref  bean ="askTrigger" />
                 < ref  bean ="mailSenderTrigger" />
                 < ref  bean ="topicDetailBuildTrigger" />
                 < ref  bean ="forumBuildTrigger" />
                 < ref  bean ="topicBuildTrigger" />
             </ list >
         </ property >
     </ bean >
</ beans >
分享到:
评论

相关推荐

    Spring 延迟实例化

    在上述配置中,所有的bean都将默认采用懒加载方式,除非明确指定`lazy-init="false"`。 #### 六、注意事项 虽然延迟实例化带来了诸多好处,但在实际应用中还需要注意以下几点: 1. **依赖关系**:如果一个bean...

    spring bean加载

    - 初始化回调:通过`init-method`属性指定的方法,在Bean实例化后调用。 - 销毁回调:通过`destroy-method`属性指定的方法,在Bean销毁前调用。 5. **Bean的懒加载**: - 如果在Bean定义中设置了`lazy-init=...

    spring.xls

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

    Spring動態加載Bean

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

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

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

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

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

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

    - `default-init-method`和`default-destroy-method`:用于指定默认的初始化和销毁方法,如果未在Bean定义中指定,容器会尝试调用这些方法。 4. **Spring 外部化配置元信息**:PropertySource表示从外部文件加载的...

    spring bean的生命周期

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

    HelloSpring.zip

    我的博客中“maven环境搭建及Spring入门”的项目代码。在idea中运行成功。 1。创建IOC容器 2。通过xml装配对象 【简单类型用value、复杂(引用类型)用ref、数组,集合,Map的装配】 ...default-lazy-init=true

    spring 配置文件简单说明

    1. `default-init-method`: 如果设置了这个属性,那么配置文件中所有的Bean在初始化时都会调用指定的方法。这是一个方便的机制,用来确保所有Bean在开始使用前都完成了必要的初始化工作。 2. `default-destroy-...

    Spring的Bean配置说明

    - **`init-method`属性**:指定一个初始化方法,在Bean创建后立即调用。通常用于执行资源初始化操作。 - **`destroy-method`属性**:指定一个销毁方法,在容器关闭前调用。通常用于释放资源,例如关闭数据库连接。...

    spring-core.pdf

    - **初始化回调**: 通过`InitializingBean`接口或者在Bean定义中指定`init-method`属性来定义初始化方法。 - **销毁回调**: 通过`DisposableBean`接口或者在Bean定义中指定`destroy-method`属性来定义销毁方法。 -...

    Spring IOC设计原理解析.docx

    2. `lazy-init`属性允许延迟初始化Bean,`refresh()`方法后,`finishBeanFactoryInitialization()`处理预实例化的Bean。 3. `FactoryBean`允许自定义Bean的创建逻辑,`AbstractBeanFactory`在获取Bean时会检查是否是...

    spring bean 属性总结

    - **init-method属性**:指定Bean初始化方法,通常用于资源的初始化。 - **destroy-method属性**:指定Bean销毁方法,用于清理资源。 - **factory-bean/factory-method属性**:通过工厂方法创建Bean。`factory-...

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

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

    Spring 培训.pdf

    - 可以通过`lazy-init`属性来配置Bean是否延迟加载。 - `init-method`和`destroy-method`可以用来指定初始化和销毁时调用的方法。 Spring框架的这些核心特性和功能极大地简化了Java应用程序的开发流程,使得...

    spring-beans-3.0.xsd

    例如,`&lt;bean&gt;`元素新增了`lazy-init`属性,可以指定bean是否延迟初始化,这有助于优化应用启动性能。`&lt;beans&gt;`元素添加了`default-lazy-init`属性,可以设置整个配置文件中所有bean的默认延迟初始化行为。此外,`...

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

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

    基于springioc bean 的几个属性介绍

    init-method 属性用于指定在执行该 Bean 的构造函数之后,调用该 Bean 的特定方法之前调用。这可以用于执行一些初始化操作,例如加载配置文件、连接数据库等。 4. destory-method 属性 destory-method 属性用于...

    Sprig学习笔记—适用刚接触者

    5. **初始化和销毁方法**:可以使用`init-method`和`destroy-method`指定Bean的初始化和销毁方法,这两个方法会在Bean的生命周期中特定时刻自动调用。 6. **其他属性**:如`abstract`用于定义抽象Bean,`autowire-...

Global site tag (gtag.js) - Google Analytics