Spring實戰讀書筆記 高階裝配(1)

2021-09-20 21:38:37 字數 3588 閱讀 9590

當你希望你的bean在特殊條件下才能裝配時,比如在宣告了特定的bean時,或者配置了特定的環境變數的時候。那麼就可以使用@conditional註解,可以用在@bean註解下。

比如

@configuration

public

class

magicbean

}

public

class

magiexistcondition

implements

condition

}

我們可以看到 @conditional(magiexistcondition.class)中的magiexistcondition實現了condition介面,而它只有乙個matches方法,只有matches方法返回true的時候,magicbean 才會建立。

下面這個例子用到了選擇性註解和條件註解

①、建立介面

條件介面

@retention

(retentionpolicy.runtime)

@target()

@documented

@conditional()

//這裡不再是import介面,而是conditional

public @inte***ce

conditionalsystem

選擇介面

@retention

(retentionpolicy.runtime)

@target()

@documented

@import()

//helloworldconfigselecltor 自定義的配置類

public @inte***ce

helloworldselector

選擇配置類

//選擇性裝配

public

class

helloworldconfigselecltor

implements

importselector;}

else;}

}}

條件配置類

public

class

onsystemcondition

implements

condition

}

條件配置

@conditionalsystem

(system =

"windows"

)//條件裝配

public

class

helloworldconfig

}

@conditionalsystem

(system =

"linux"

)//條件裝配

public

class

helloworldconfig2

}

啟動載入

@enablecaching()

//@helloworld //自定義註解 啟動時裝配

@helloworldselector

(islinux =

false

)//自定義註解 啟動時裝配 false ,裝配helloworldconfig2

public

class

}

啟動時islinux = false,根據選擇裝配,載入helloworldconfig2,而根據helloworldconfig2上的註解進行條件判斷,linux 等於@conditionalsystem(system = 「linux」) 中的system,返回true。

由於@autowired是按型別進行裝配的。那麼當某個介面有多個實現時,就會丟擲nouniquebeandefinitionexception。

1、在某個實現類上加上@primary註解,表明首選bean。

@component

@primary

public

class

cake

implements

dessert

這種方法有限制。當你在多個實現類上加了@primary註解,還會出現歧義。

2、@qualifier

@autowired

@qualifier

("cake"

)private dessert dessert;

qualifier的引數就是需要注入的bean的id。

提到qualifier,必須談一下@resource

@resource屬於j2ee,預設是名稱進行裝配。如果沒有指定name屬性,當註解寫在字段上時,預設取欄位名進行安裝名稱查詢,如果註解寫在setter方法上預設取屬性名進行裝配。當找不到與名稱匹配的bean時才按照型別進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。

那麼也可以寫成

@resource

(name=

"cake"

)private dessert dessert;

限制:與 bean的name緊耦合。

建立限定符

@retention

(retentionpolicy.runtime)

@target()

@qualifier

//代表時qualifier註解

public @inte***ce

soft

@retention

(retentionpolicy.runtime)

@target()

@qualifier

public @inte***ce

code

新增在需要建立bean的類上

@component

@code

@soft

public

class

cake

implements

dessert

自動裝配

@autowired

@code

@soft

private dessert dessert;

這樣就會低耦合,可以隨意重構是實現類。

Spring實戰讀書筆記 高階裝配(2)

單例 singleton 整個應用中,只建立乙個bean的例項 預設 原型 prototype 每次注入或者通過spring上下文獲取的時候,都會建立乙個新的bean例項。會話 session 在web應用中,為每次會話建立乙個新的bean例項。請求 request 在web應用中,為每次請求建立要...

spring讀書筆記

spring的計畫任務 enablescheduling 配置中加入 scheduling 在方法上配置支援cron表示式定時,fixedrate固定時間。條件註解 conditional 通過實現同乙個介面在配置類裡做判斷 組合註解 restcontroller 相當於 controller和 r...

讀書筆記 《Redis實戰》

常見db對比表,由於未標明各個db的版本,這個 其實並不準確,特別是附加功能欄。名稱型別 資料儲存結構 查詢型別 附加功能 redis 使用記憶體的非關係型資料庫 字串 列表 集合 有序集合 雜湊表 每種資料型別都有專屬指令 批量操作 不完全的事務支援 發布與訂閱 主從複製 持久化 指令碼 memc...