spring中的懒加载详细解读

 更新时间:2023年10月12日 10:12:49   作者:RayBreslin  
这篇文章主要介绍了spring中的懒加载详细解读,如果某个Bean再程序运行周期中都可能不会被适用,那么可以设定该Bean为懒加载,优势是尽量节省了服务器的资源,缺点是可能会导致某个相应的时间增加,需要的朋友可以参考下

一、懒加载介绍

1.概念

Spring容器会在创建容器时提前初始化Singleton作用域的bean,即在创建环境ApplicationContext的时候,单例作用域的Bean就会被实例化。注意:如果是prototype作用域的bean,则其是在调用该bean的时候创建的(已经验证)

但是如果Bean被标注了lazy-init="true",则该Bean只有在其被需要的时候才会被初始化。

2.作用

如果某个Bean再程序运行周期中都可能不会被适用,那么可以设定该Bean为懒加载。优势是尽量节省了服务器的资源,缺点是可能会导致某个相应的时间增加。

二、环境

1.pom.xml文件

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.7.RELEASE</version>
</dependency>
<!--单元测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

2.Spring.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"
       default-autowire="byName"
       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-4.2.xsd">
</beans>

三、代码实现

1.创建bean

package com.spring.ioc;
/**
 * Created by Administrator on 2019/10/26.
 */
public class Bean1 {
    public Bean1() {
        System.out.println("Bean1 has been created ");
    }
}

2.交给spring管理:对于单例模式,非懒加载

<?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:c="http://www.springframework.org/schema/c"
       xmlns:p ="http://www.springframework.org/schema/p"
       default-autowire="byName"
       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-4.2.xsd">
    <bean class="com.spring.ioc.Bean1" id="bean1" />
</beans>

-》测试

package com.spring.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Created by Administrator on 2019/10/26.
 */
public class testcode {
    @Test
    public void test(){
        ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
        System.out.println("context已经被创建");
        Bean1 bean1=context.getBean("bean1",Bean1.class);
        System.out.println("bean1 = " + bean1);
    }
}

结果,Bean在加载spring环境的时候就已经被加载了

Bean1 has been created 
context已经被创建
bean1 = com.spring.ioc.Bean1@7d0587f1

3.交给spring管理:对于单例模式,懒加载

<?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:c="http://www.springframework.org/schema/c"
       xmlns:p ="http://www.springframework.org/schema/p"
       default-autowire="byName"
       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-4.2.xsd">
    <!--<bean class="com.spring.ioc.Bean1" id="bean1" />-->
    <bean class="com.spring.ioc.Bean1" id="bean1" lazy-init="true"/>
</beans>

-》测试

package com.spring.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Created by Administrator on 2019/10/26.
 */
public class testcode {
    @Test
    public void test(){
        ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
        System.out.println("context已经被创建");
        Bean1 bean1=context.getBean("bean1",Bean1.class);
        System.out.println("bean1 = " + bean1);
    }
}

结果,Bean是在调用的时候,再加载创建的。

context已经被创建
Bean1 has been created 

4.将spring.xml下所有bean统一都设置为懒加载

<?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:c="http://www.springframework.org/schema/c"
       xmlns:p ="http://www.springframework.org/schema/p"
       default-autowire="byName"
       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-4.2.xsd"
       default-lazy-init="true"
>
    <!--<bean class="com.spring.ioc.Bean1" id="bean1" />-->
    <bean class="com.spring.ioc.Bean1" id="bean1" lazy-init="true"/>
</beans>

总结

Spring 懒加载是一种优化应用程序性能和资源利用率的机制。通过延迟加载对象的创建和初始化,可以减少应用程序启动时的负载和内存占用。

懒加载可以通过使用@Lazy注解、配置文件中的lazy-init属性或编程方式来实现。在处理大量对象或对象初始化较为耗时的情况下,懒加载可以显著提高应用程序的响应速度和效率。

然而,需要注意的是,懒加载可能会导致一些副作用,如延迟了对象的初始化和依赖注入,可能会在运行时出现错误。

因此,在使用懒加载时,需要仔细考虑对象的依赖关系和初始化顺序,以确保应用程序的正确性和稳定性。

到此这篇关于spring中的懒加载详细解读的文章就介绍到这了,更多相关spring懒加载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中的双数据源配置过程

    SpringBoot中的双数据源配置过程

    文章介绍了如何配置Oracle和PostgreSQL数据源,并使用JdbcTemplate进行数据库操作,重点包括数据源配置、JdbcTemplate配置以及不同数据源的包路径设置
    2026-01-01
  • java8 stream自定义分组求和并排序的实现

    java8 stream自定义分组求和并排序的实现

    这篇文章主要介绍了java8 stream自定义分组求和并排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Spring Kafka中@KafkaListener注解的参数与使用小结

    Spring Kafka中@KafkaListener注解的参数与使用小结

    @KafkaListener注解为开发者提供了一种声明式的方式来定义消息监听器,本文主要介绍了Spring Kafka中@KafkaListener注解的参数与使用小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Mybatis(ParameterType)传递多个不同类型的参数方式

    Mybatis(ParameterType)传递多个不同类型的参数方式

    这篇文章主要介绍了Mybatis(ParameterType)传递多个不同类型的参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Java项目命名规范参考

    Java项目命名规范参考

    在实际项目开发中,命名规范的遵守可以提高代码的可读性和可维护性,本文就来介绍一下Java项目命名规范参考,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • SpringBoot实现第一次启动时自动初始化数据库的方法

    SpringBoot实现第一次启动时自动初始化数据库的方法

    本文主要介绍了SpringBoot实现第一次启动时自动初始化数据库的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 你必须得会的SpringBoot全局统一处理异常详解

    你必须得会的SpringBoot全局统一处理异常详解

    程序在运行的过程中,不可避免会产生各种各样的错误,这个时候就需要进行异常处理,本文主要为大家介绍了SpringBoot实现全局统一处理异常的方法,需要的可以参考一下
    2023-06-06
  • java中Timer定时器的使用和启动方式

    java中Timer定时器的使用和启动方式

    这篇文章主要介绍了java中Timer定时器的使用和启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • IDEA 2021配置JavaWeb项目超详细教程

    IDEA 2021配置JavaWeb项目超详细教程

    本文通过图文并茂的形式给大家介绍IDEA 2021配置JavaWeb项目的过程,内容简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • Java的Shiro框架认证流程详解

    Java的Shiro框架认证流程详解

    这篇文章主要介绍了Java的Shiro框架认证流程详解,Shiro 是一个功能强大和易于使用的安全框架,为开发人员提供一个直观而全面的解决方案的认证,授权,加密,会话管理四大功能,需要的朋友可以参考下
    2024-01-01

最新评论