Spring的懶加載機制原理和配置詳解
一、什么是懶加載
Spring默認(rèn)會在容器初始化的過程中,解析xml或注解,創(chuàng)建配置為單例的bean并保存到一個map中,這樣的機制在bean比較少時問題不大,但一旦bean非常多時,spring需要在啟動的過程中花費大量的時間來創(chuàng)建bean ,花費大量的空間存儲bean,但這些bean可能很久都用不上,這種在啟動時在時間和空間上的浪費顯得非常的不值得。
所以Spring提供了懶加載機制。所謂的懶加載機制就是可以規(guī)定指定的bean不在啟動時立即創(chuàng)建,而是在后續(xù)第一次用到時才創(chuàng)建,從而減輕在啟動過程中對時間和內(nèi)存的消耗。
懶加載機制只對單例bean有作用,對于多例bean設(shè)置懶加載沒有意義,因為多例bean本來就是在使用時才創(chuàng)建的。
二、懶加載配置方式
1、xml配置
在xml文件里面,可以通過配置lazy-init="true"來啟用懶加載,。如下面的配置,設(shè)置cart啟用懶加載,這樣,在容器啟動的時候,就不會立即創(chuàng)建bean cart,直到第一次使用的時候才會創(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>
上面是單獨設(shè)置某個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è)定全局和指定bean的懶加載機制,且配置不相同,則對于該bean局部配置會覆蓋全局配置。
2、注解配置(@Lazy)
在實際開發(fā)中,我們會大量用到注解的方式來配置bean,所以除了會用xml方式啟用懶加載外,還應(yīng)該會通過注解啟用懶加載。測試代碼如下:
一個實體類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)注的時候,不會啟動懶加載,在容器創(chuàng)建的時候,就會初始化bean,如下圖所示。
加上@Lazy注解,啟動懶加載,在容器創(chuàng)建的時候,不會初始化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); }
打印結(jié)果:
可以看到,創(chuàng)建容器的時候,沒有創(chuàng)建book對像,直到第一次使用的時候才創(chuàng)建。
@Lazy 的屬性value 取值有 true 和 false 這兩個, 默認(rèn)值為 true。true 表示使用 延遲加載, false 表示不使用。
到此這篇關(guān)于Spring的懶加載機制原理和配置詳解的文章就介紹到這了,更多相關(guān)Spring懶加載原理和配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringSecurity自定義登錄接口的實現(xiàn)
本文介紹了使用Spring Security實現(xiàn)自定義登錄接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01

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

Java中的CopyOnWriteArrayList容器解析