當你希望你的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...