Spring的懶加載機(jī)制原理和配置詳解
一、什么是懶加載
Spring默認(rèn)會(huì)在容器初始化的過程中,解析xml或注解,創(chuàng)建配置為單例的bean并保存到一個(gè)map中,這樣的機(jī)制在bean比較少時(shí)問題不大,但一旦bean非常多時(shí),spring需要在啟動(dòng)的過程中花費(fèi)大量的時(shí)間來創(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)過程中對(duì)時(shí)間和內(nèi)存的消耗。
懶加載機(jī)制只對(duì)單例bean有作用,對(duì)于多例bean設(shè)置懶加載沒有意義,因?yàn)槎嗬齜ean本來就是在使用時(shí)才創(chuàng)建的。
二、懶加載配置方式
1、xml配置
在xml文件里面,可以通過配置lazy-init="true"來啟用懶加載,。如下面的配置,設(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í)際開發(fā)中,我們會(huì)大量用到注解的方式來配置bean,所以除了會(huì)用xml方式啟用懶加載外,還應(yīng)該會(huì)通過注解啟用懶加載。測(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);
}
}在沒有用@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í)候,沒有創(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同一個(gè)類中,一個(gè)無事務(wù)方法調(diào)用一個(gè)有事務(wù)方法時(shí),事務(wù)失效問題
本文詳細(xì)介紹了Spring框架中事務(wù)管理的實(shí)現(xiàn)原理,包括@Transactional注解的使用、事務(wù)的開啟、提交和回滾機(jī)制,以及代理對(duì)象的兩種實(shí)現(xiàn)方式(JDK動(dòng)態(tài)代理和CGLIB代理),文章還探討了在同一個(gè)類中調(diào)用有事務(wù)方法時(shí)事務(wù)失效的原因,并提供了解決方法2024-12-12
Java Socket實(shí)現(xiàn)聊天室附1500行源代碼
Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。本篇文章手把手帶你通過Java Socket來實(shí)現(xiàn)自己的聊天室,大家可以在過程中查缺補(bǔ)漏,溫故而知新2021-10-10
Java避免死鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在有些情況下死鎖是可以避免的。本文將展示三種用于避免死鎖的技術(shù)。對(duì)java避免死鎖的相關(guān)知識(shí)感興趣的朋友一起通過本文學(xué)習(xí)吧2017-06-06
springboot啟動(dòng)加載CommandLineRunner @PostConstruct問題
這篇文章主要介紹了springboot啟動(dòng)加載CommandLineRunner @PostConstruct問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
IntelliJ IDEA 創(chuàng)建spring boot 的Hello World 項(xiàng)目(圖解)
這篇文章主要介紹了IntelliJ IDEA 創(chuàng)建spring boot 的Hello World 項(xiàng)目的步驟詳解,需要的朋友可以參考下2018-01-01
Spring MVC的項(xiàng)目準(zhǔn)備和連接建立方法
SpringWebMVC是基于Servlet API的Web框架,屬于Spring框架的一部分,主要用于簡(jiǎn)化Web應(yīng)用程序的開發(fā),SpringMVC通過控制器接收請(qǐng)求,使用模型處理數(shù)據(jù),并通過視圖展示結(jié)果,感興趣的朋友跟隨小編一起看看吧2024-10-10
使用spring-data-redis中的Redis事務(wù)
這篇文章主要介紹了使用spring-data-redis中的Redis事務(wù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

