Spring的懒加载机制原理和配置详解

 更新时间:2023年10月20日 08:46:15   作者:架构帅  
这篇文章主要介绍了Spring的懒加载机制原理和配置详解,Spring提供了懒加载机制,所谓的懒加载机制就是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗,需要的朋友可以参考下

一、什么是懒加载

Spring默认会在容器初始化的过程中,解析xml或注解,创建配置为单例的bean并保存到一个map中,这样的机制在bean比较少时问题不大,但一旦bean非常多时,spring需要在启动的过程中花费大量的时间来创建bean ,花费大量的空间存储bean,但这些bean可能很久都用不上,这种在启动时在时间和空间上的浪费显得非常的不值得。

所以Spring提供了懒加载机制。所谓的懒加载机制就是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗。

懒加载机制只对单例bean有作用,对于多例bean设置懒加载没有意义,因为多例bean本来就是在使用时才创建的。

二、懒加载配置方式

1、xml配置

在xml文件里面,可以通过配置lazy-init="true"来启用懒加载,。如下面的配置,设置cart启用懒加载,这样,在容器启动的时候,就不会立即创建bean cart,直到第一次使用的时候才会创建。

<?xmlversion="1.0"encoding="UTF-8"?> 
<beansxmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 
<beanid="cart"class="cn.tedu.beans.Cart"lazy-init="true">
</bean>
</beans>

上面是单独设置某个bean的懒加载,我们还可以为全局配置懒加载,如下面的代码所示。

<?xmlversion="1.0"encoding="UTF-8"?> 
<beansxmlns="//www.springframework.org/schema/beans" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans-3.2.xsd" default-lazy-init="true"> 
<beanid="cart"class="cn.tedu.beans.Cart">
    
</bean> 
</beans>

注意,如果同时设定全局和指定bean的懒加载机制,且配置不相同,则对于该bean局部配置会覆盖全局配置。

2、注解配置(@Lazy)

在实际开发中,我们会大量用到注解的方式来配置bean,所以除了会用xml方式启用懒加载外,还应该会通过注解启用懒加载。测试代码如下:

一个实体类Book:

package ztt.lazy;
 
/**
 * @Description:
 * @Auther: tt
 * @Date: 2020/3/1 14:31
 */
public class Book {
    private String bookName;
 
    public Book() {
        System.out.println("调用构造方法,创建book...");
    }
 
    public String getBookName() {
        return bookName;
    }
 
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
 
    @Override
    public String toString() {
        return "Book{" +
                "bookName='" + bookName + '\'' +
                '}';
    }
}

配置类Config:

package ztt.lazy;
 
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
 
/**
 * @Description:
 * @Auther: tt
 * @Date: 2020/3/1 14:32
 */
public class Config {
 
    @Bean(value = "book")
    public Book getBook(){
        Book book = new Book();
        book.setBookName("《数据结构》");
        return book;
    }
 
    @Test
    public void test(){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
    }
}

在没有用@Lazy注解标注的时候,不会启动懒加载,在容器创建的时候,就会初始化bean,如下图所示。

加上@Lazy注解,启动懒加载,在容器创建的时候,不会初始化bean,如下图所示。

然后,我们获取这个bean,修改代码如下:

    @Test
    public void test(){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
        System.out.println("初始化容器成功!");
        System.out.println("获取bean");
        Book book = (Book) applicationContext.getBean("book");
        System.out.println("从容器中取出book:");
        System.out.println(book);
    }

打印结果:

可以看到,创建容器的时候,没有创建book对像,直到第一次使用的时候才创建。

@Lazy 的属性value 取值有 true 和 false 这两个, 默认值为 true。true 表示使用 延迟加载, false 表示不使用。

到此这篇关于Spring的懒加载机制原理和配置详解的文章就介绍到这了,更多相关Spring懒加载原理和配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java同一个类中,一个无事务方法调用一个有事务方法时,事务失效问题

    java同一个类中,一个无事务方法调用一个有事务方法时,事务失效问题

    本文详细介绍了Spring框架中事务管理的实现原理,包括@Transactional注解的使用、事务的开启、提交和回滚机制,以及代理对象的两种实现方式(JDK动态代理和CGLIB代理),文章还探讨了在同一个类中调用有事务方法时事务失效的原因,并提供了解决方法
    2024-12-12
  • Java Socket实现聊天室附1500行源代码

    Java Socket实现聊天室附1500行源代码

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。本篇文章手把手带你通过Java Socket来实现自己的聊天室,大家可以在过程中查缺补漏,温故而知新
    2021-10-10
  • Java避免死锁_动力节点Java学院整理

    Java避免死锁_动力节点Java学院整理

    在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术。对java避免死锁的相关知识感兴趣的朋友一起通过本文学习吧
    2017-06-06
  • springboot启动加载CommandLineRunner @PostConstruct问题

    springboot启动加载CommandLineRunner @PostConstruct问题

    这篇文章主要介绍了springboot启动加载CommandLineRunner @PostConstruct问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • IntelliJ IDEA 创建spring boot 的Hello World 项目(图解)

    IntelliJ IDEA 创建spring boot 的Hello World 项目(图解)

    这篇文章主要介绍了IntelliJ IDEA 创建spring boot 的Hello World 项目的步骤详解,需要的朋友可以参考下
    2018-01-01
  • Spring MVC的项目准备和连接建立方法

    Spring MVC的项目准备和连接建立方法

    SpringWebMVC是基于Servlet API的Web框架,属于Spring框架的一部分,主要用于简化Web应用程序的开发,SpringMVC通过控制器接收请求,使用模型处理数据,并通过视图展示结果,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • hibernate多表操作实例代码

    hibernate多表操作实例代码

    这篇文章主要介绍了hibernate多表操作实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • java基于反射得到对象属性值的方法

    java基于反射得到对象属性值的方法

    这篇文章主要介绍了java基于反射得到对象属性值的方法,结合实例形式分析了java基于反射获取对象属性值的相关实现方法与操作技巧,需要的朋友可以参考下
    2017-03-03
  • 使用spring-data-redis中的Redis事务

    使用spring-data-redis中的Redis事务

    这篇文章主要介绍了使用spring-data-redis中的Redis事务,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring Boot中使用RSocket的示例代码

    Spring Boot中使用RSocket的示例代码

    这篇文章主要介绍了Spring Boot中使用RSocket的示例代码,特别是spring boot 如何帮助抽象出更低级别的RSocket API,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06

最新评论