<dl id="r7hd5"><delect id="r7hd5"></delect></dl>
<dl id="r7hd5"><i id="r7hd5"><font id="r7hd5"></font></i></dl><dl id="r7hd5"><i id="r7hd5"><meter id="r7hd5"></meter></i></dl>
<video id="r7hd5"></video><dl id="r7hd5"><delect id="r7hd5"></delect></dl>
<dl id="r7hd5"><delect id="r7hd5"></delect></dl><dl id="r7hd5"></dl>
<video id="r7hd5"></video> <video id="r7hd5"></video><dl id="r7hd5"></dl><dl id="r7hd5"><i id="r7hd5"><meter id="r7hd5"></meter></i></dl>
<dl id="r7hd5"><i id="r7hd5"></i></dl>
<dl id="r7hd5"></dl><dl id="r7hd5"></dl>
<video id="r7hd5"><i id="r7hd5"></i></video><dl id="r7hd5"></dl><dl id="r7hd5"></dl>
<video id="r7hd5"><i id="r7hd5"><delect id="r7hd5"></delect></i></video>
<i id="r7hd5"></i>
<video id="r7hd5"></video>
<dl id="r7hd5"><delect id="r7hd5"></delect></dl>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring延遲初始化會遇到什么問題

發布時間:2023-07-17 13:52:53 來源:億速云 閱讀:118 作者:栢白 欄目:開發技術

本篇文章和大家了解一下Spring延遲初始化會遇到什么問題。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有所幫助。

List<坑> 坑列表 = new ArrayList<>(2);

首先,讓我們回顧一下 Spring 延遲初始化的概念。在 Spring 中,延遲初始化指的是將 Bean 的實例化推遲到第一次被使用時,而不是在應用程序啟動時就立即創建所有的 Bean。這種延遲加載的機制可以提高應用程序的性能和資源利用率。

坑 1. 延遲加載失效,被非延遲初始化的 Bean 注入了。

代碼演示:

@Lazy
@Component
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

}

1、 使用構造函數注入

@Service
public class MyService {

    private MyBean myBean;

    public MyService(MyBean myBean) {
        this.myBean = myBean;
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

2、 @Resource 注入

@Service
public class MyService {

    @Resource
    private MyBean myBean;

    public void exec() {
        System.out.println("exec suc");
    }

}

3、 @Autowired 注入

@Service
public class MyService {

    private MyBean myBean;

    @Autowired
    public void setMyBean(MyBean myBean) {
        this.myBean = myBean;
    }

    public void exec() {
        myBean.exec();
    }

}

測試結果

Spring延遲初始化會遇到什么問題

失效原因

這個非常好理解,myService 并沒有配置@Lazy,所以在啟動的時候會被初始化。由于 myService 依賴 myBean,myBean 就會被注入。所以這意味著 myBean 要能正常被注入,就得被初始化,如果不初始化就會啟動失敗。這也就是造成 myBean 延遲初始化失效的原因。

解決方法

解決方法很簡單,在依賴到的地方都配置上@Lazy,避免出現被非延遲初始化的 Bean 注入了。

坑 2. 延遲加載失效:Bean 的作用域錯誤配置

@Lazy 注解只對單例(Singleton)作用域的 Bean 有效。默認情況下,Spring 的 Bean 作用域是單例,如果將 Bean 的作用域設置為其他作用域(如原型、請求、會話等)的是不起作用的。

代碼演示:

  • 默認不做任何配置。

@Component
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

啟動結果:

Spring延遲初始化會遇到什么問題

通過觀察啟動結果,可以看到 myBean 在啟動的時候被初始化了。

  • 加上@Lazy

@Lazy
@Component
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

啟動結果:

Spring延遲初始化會遇到什么問題

通過觀察啟動結果,可以看到 myBean 并沒有初始化,說明@Lazy生效了。

  • 設置 scope

@Lazy
@Component
@Scope("prototype")
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

啟動結果:

Spring延遲初始化會遇到什么問題

這個時候你會發現,貌似這個結果不對呀。上面提到,@Lazy 注解只對單例(Singleton)作用域的 Bean 有效。但是我已經將 Scope 改為 prototype。 按理來應該是這樣:

Spring延遲初始化會遇到什么問題

控制臺會輸出My bean init success.,然而事實就是沒有。那么這是為什么呢?

原因分析

由于是增加了@Scope("prototype"),發現結果不符合預期,那我們就從它入手。我們先回顧一下 Spring Bean 的作用域相關的知識。當 Spring Bean 作用域為 prototype時,每次獲取 Bean 時都會重新創建一個實例。

換句話說,也就意味著,當的 Bean 作用域為 prototype 時,Bean 在被使用的才會被初始化,并且每個 Bean 都是全新的。

誒,在使用的時候被初始化,這不就是延遲初始化嗎。改下代碼測試一下:

去掉@Lazy

@Component
@Scope("prototype")
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

啟動結果:

Spring延遲初始化會遇到什么問題

發現和單獨配置@Lazy的效果是一樣,并沒有被初始化。

結論

當 bean 作用域是 prototype 時,這些 bean 每次在需要時,都會按需實例化和初始化,因此它們本質上是延遲始化的。所以給他們配置@Lazy是沒有意義的。

在上面的案例,出現這樣的情況是因為,在啟動的時候 myBean 并沒有,被其他 Bean 依賴和使用。所以表現出和@Lazy一樣的效果。誤以為當 Bean 作用域是 prototype 時,@Lazy可以生效。

總結

由于 spring bean 的默認作用域是:singleton。所以在啟動的時候 bean 會被初始化,如果被標記了@Lazy,會延遲初始化,但是如果被非懶加載的 Bean 注入了,@Lazy會失效。并且@Lazy注解只對單例 singleton 作用域的 Bean 有效。

以上就是Spring延遲初始化會遇到什么問題的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

国语自产精品视频_91超碰人人澡夜夜澡_欧美777精品久久久久网_97精品国产一区二区三区_久久婷婷大香萑太香蕉av 精品一久久香蕉国产线看观 无码草草草在线观看 国产v亚洲v天堂a无码 国产日韩一区二区三区免费高清 天天爽夜夜爽欧美精品视频 国产午夜福利在线观看红一片 国产午夜精品理论片 芒果一二三区乱码天天看隐藏入口 国产高清女人高潮对白 91久久精品日日躁
<dl id="r7hd5"><delect id="r7hd5"></delect></dl>
<dl id="r7hd5"><i id="r7hd5"><font id="r7hd5"></font></i></dl><dl id="r7hd5"><i id="r7hd5"><meter id="r7hd5"></meter></i></dl>
<video id="r7hd5"></video><dl id="r7hd5"><delect id="r7hd5"></delect></dl>
<dl id="r7hd5"><delect id="r7hd5"></delect></dl><dl id="r7hd5"></dl>
<video id="r7hd5"></video> <video id="r7hd5"></video><dl id="r7hd5"></dl><dl id="r7hd5"><i id="r7hd5"><meter id="r7hd5"></meter></i></dl>
<dl id="r7hd5"><i id="r7hd5"></i></dl>
<dl id="r7hd5"></dl><dl id="r7hd5"></dl>
<video id="r7hd5"><i id="r7hd5"></i></video><dl id="r7hd5"></dl><dl id="r7hd5"></dl>
<video id="r7hd5"><i id="r7hd5"><delect id="r7hd5"></delect></i></video>
<i id="r7hd5"></i>
<video id="r7hd5"></video>
<dl id="r7hd5"><delect id="r7hd5"></delect></dl>