欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring的懶加載機(jī)制原理和配置詳解

 更新時(shí)間:2023年10月20日 08:46:15   作者:架構(gòu)帥  
這篇文章主要介紹了Spring的懶加載機(jī)制原理和配置詳解,Spring提供了懶加載機(jī)制,所謂的懶加載機(jī)制就是可以規(guī)定指定的bean不在啟動(dòng)時(shí)立即創(chuàng)建,而是在后續(xù)第一次用到時(shí)才創(chuàng)建,從而減輕在啟動(dòng)過(guò)程中對(duì)時(shí)間和內(nèi)存的消耗,需要的朋友可以參考下

一、什么是懶加載

Spring默認(rèn)會(huì)在容器初始化的過(guò)程中,解析xml或注解,創(chuàng)建配置為單例的bean并保存到一個(gè)map中,這樣的機(jī)制在bean比較少時(shí)問(wèn)題不大,但一旦bean非常多時(shí),spring需要在啟動(dòng)的過(guò)程中花費(fèi)大量的時(shí)間來(lái)創(chuàng)建bean ,花費(fèi)大量的空間存儲(chǔ)bean,但這些bean可能很久都用不上,這種在啟動(dòng)時(shí)在時(shí)間和空間上的浪費(fèi)顯得非常的不值得。

所以Spring提供了懶加載機(jī)制。所謂的懶加載機(jī)制就是可以規(guī)定指定的bean不在啟動(dòng)時(shí)立即創(chuàng)建,而是在后續(xù)第一次用到時(shí)才創(chuàng)建,從而減輕在啟動(dòng)過(guò)程中對(duì)時(shí)間和內(nèi)存的消耗。

懶加載機(jī)制只對(duì)單例bean有作用,對(duì)于多例bean設(shè)置懶加載沒(méi)有意義,因?yàn)槎嗬齜ean本來(lái)就是在使用時(shí)才創(chuàng)建的。

二、懶加載配置方式

1、xml配置

在xml文件里面,可以通過(guò)配置lazy-init="true"來(lái)啟用懶加載,。如下面的配置,設(shè)置cart啟用懶加載,這樣,在容器啟動(dòng)的時(shí)候,就不會(huì)立即創(chuàng)建bean cart,直到第一次使用的時(shí)候才會(huì)創(chuàng)建。

<?xmlversion="1.0"encoding="UTF-8"?> 
<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://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>

上面是單獨(dú)設(shè)置某個(gè)bean的懶加載,我們還可以為全局配置懶加載,如下面的代碼所示。

<?xmlversion="1.0"encoding="UTF-8"?> 
<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://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>

注意,如果同時(shí)設(shè)定全局和指定bean的懶加載機(jī)制,且配置不相同,則對(duì)于該bean局部配置會(huì)覆蓋全局配置。

2、注解配置(@Lazy)

在實(shí)際開(kāi)發(fā)中,我們會(huì)大量用到注解的方式來(lái)配置bean,所以除了會(huì)用xml方式啟用懶加載外,還應(yīng)該會(huì)通過(guò)注解啟用懶加載。測(cè)試代碼如下:

一個(gè)實(shí)體類Book:

package ztt.lazy;
 
/**
 * @Description:
 * @Auther: tt
 * @Date: 2020/3/1 14:31
 */
public class Book {
    private String bookName;
 
    public Book() {
        System.out.println("調(diào)用構(gòu)造方法,創(chuàng)建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("《數(shù)據(jù)結(jié)構(gòu)》");
        return book;
    }
 
    @Test
    public void test(){
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
    }
}

在沒(méi)有用@Lazy注解標(biāo)注的時(shí)候,不會(huì)啟動(dòng)懶加載,在容器創(chuàng)建的時(shí)候,就會(huì)初始化bean,如下圖所示。

加上@Lazy注解,啟動(dòng)懶加載,在容器創(chuàng)建的時(shí)候,不會(huì)初始化bean,如下圖所示。

然后,我們獲取這個(gè)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);
    }

打印結(jié)果:

可以看到,創(chuàng)建容器的時(shí)候,沒(méi)有創(chuàng)建book對(duì)像,直到第一次使用的時(shí)候才創(chuàng)建。

@Lazy 的屬性value 取值有 true 和 false 這兩個(gè), 默認(rèn)值為 true。true 表示使用 延遲加載, false 表示不使用。

到此這篇關(guān)于Spring的懶加載機(jī)制原理和配置詳解的文章就介紹到這了,更多相關(guān)Spring懶加載原理和配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Java的Struts框架下進(jìn)行web編程的入門教程

    在Java的Struts框架下進(jìn)行web編程的入門教程

    這篇文章主要介紹了在Java的Struts框架下進(jìn)行web編程的入門教程,需要的朋友可以參考下
    2015-11-11
  • 解決springboot的aop切面不起作用問(wèn)題(失效的排查)

    解決springboot的aop切面不起作用問(wèn)題(失效的排查)

    這篇文章主要介紹了解決springboot的aop切面不起作用問(wèn)題(失效的排查),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。 一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決

    Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決

    這篇文章主要介紹了Java語(yǔ)法中Lambda表達(dá)式無(wú)法拋出異常的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java包裝類之自動(dòng)裝箱與拆箱

    Java包裝類之自動(dòng)裝箱與拆箱

    這篇文章主要介紹了Java包裝類之自動(dòng)裝箱與拆箱,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java中的CopyOnWriteArrayList容器解析

    Java中的CopyOnWriteArrayList容器解析

    這篇文章主要介紹了Java中的CopyOnWriteArrayList容器解析,CopyOnWriteArrayList容器允許并發(fā)讀,讀操作是無(wú)鎖的,性能較高。至于寫(xiě)操作,比如向容器中添加一個(gè)元素,則首先將當(dāng)前容器復(fù)制一份,然后在新副本上執(zhí)行寫(xiě)操作,需要的朋友可以參考下
    2023-12-12
  • Java8新特性Stream的完全使用指南

    Java8新特性Stream的完全使用指南

    這篇文章主要給大家介紹了關(guān)于Java8新特性Stream的完全使用指南,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 最新評(píng)論