Spring的例項化和依賴注入時機與延遲例項化

2021-10-01 23:33:23 字數 2621 閱讀 5706

使用@autowired可以注入乙個bean進來

@autowired

private diana diana;

那麼如果在容器中沒有diana的物件被例項化的時候應用程式會報錯嗎?我們可以通過把diana上面的@component注釋掉來看一下結果如何

//@component

public

class

diana

}@restcontroller

("/v1/banner"

)public

class

bannercontroller

啟動springboot會出現以下結果:

由此可見,如果spring無法在容器中找到diana的物件,在預設的機制下啟動時就會直接報錯。

當在@autowired後面加上(required = false),變成

@restcontroller

("/v1/banner"

)public

class

bannercontroller

}

springboot可以正常啟動,但是當訪問diana下面的方法時會出現下面這樣的結果

出現這樣的情況注入是沒有問題的,而是由於容器中沒有diana這個物件卻又呼叫diana下面的方法

結論:

_如果spring無法在容器中找到diana的物件,在預設的機制下啟動時就會直接報錯。我們可以通過@autowired(required = false)的方式令應用程式可以正常啟動。 _

ioc容器究竟是在什麼時候例項化物件並把物件注入到**片段裡的呢?是當請求訪問controller的時候才進行例項化並注入,還是在springboot應用啟動時就開始例項化並把物件注入到**片段的呢?

由之前的**可以看出,當把diana上面的@component注釋掉時,springboot應用啟動時應用程式會立即報錯,我們也可以通過在diana這個類中加乙個無參的構造方法來驗證以下

@component

public

class

diana

public

voidr(

)}

應用程式啟動時控制台列印出了"hello diana"

結論:

預設機制下,在springboot應用啟動時,ioc容器就開始例項化物件並把物件注入到**片段裡

springboot預設是立即例項化的機制,我們可以通過@lazy讓它變成延遲例項化。

當只在diana上加上@lazy,啟動應用卻發現diana仍然是立即例項化,@lazy並沒有起作用。這是因為bannercontroller是立即例項化的,那它下面的屬性如果是@autowired的就也需要立即例項化,只加在diana上的 @lazy是會被忽略掉的。如果真的需要延遲例項化就需要在bannercontroller也加上@lazy或者是bannercontroller注入diana的地方加上@lazy,示例**如下:

@restcontroller

("/v1/banner"

)@lazy

public

class

bannercontroller

{

或者

@autowired

@lazy

private diana diana;

當訪問當前的controller控制台列印出了下面的結果:

由此可見,此時是當請求訪問controller的時候才進行例項化並注入

如果沒有特殊理由最好不要開啟延遲例項化。使用預設機制提前例項化才是乙個比較好的做法,因為可以盡早發現問題,避免很多問題在執行時才被發現。

spring依賴注入例項

依賴注入 blpublic class t01bl implements serializable 對應的配置檔案 注意 配置檔案中,ref反射的值是其他配置處寫的bean的id值 name值對應的是類中注入屬性的變數,首字母必須小寫 bean的class屬性是類對應的class路徑 不過令人費解的...

Spring的IOC依賴注入例項

操作步驟 1.將所有的類在beans.xml 中建立 2.對有依賴的類完成注入 2.1.為每乙個依賴類建立相應的getter和setter 方法 2.2.建構函式注入 2.3.自動注入 不常用 開發中一般都是使用byname。autowire default byname 根據名稱來注入 setus...

spring 依賴注入 Spring依賴注入

依賴注入 dependency injection,簡稱di 與控制反轉 ioc 的含義相同控制反 在使用spring框架之後,物件的例項不再由呼叫者來建立,而是由spring容器來建立,spring容器會負責控制程式之間的關係,而不是由呼叫者的程式 直接控制,這樣控制權由應用程式轉移到了sprin...