b05-06 Spring基于注解的配置(精通Spring 4.x)

本篇內(nèi)容:

  • 1窜锯、使用注解定義bean
  • 2、包掃描注解
  • 3芭析、自動(dòng)裝配Bean

Spring成功啟動(dòng)的主要事項(xiàng):Bean定義信息衬浑,Bean實(shí)現(xiàn)類,Spring本身放刨。

一工秩、定義Bean

  • 采用基于xml的配置,Bean定義信息和Bean實(shí)現(xiàn)本省是分離的进统,采用基于注解的配置文件助币,bean定義信息通過在bean實(shí)現(xiàn)類上標(biāo)注注解實(shí)現(xiàn)。
@Component("userDao")
public class UserDao{}

說明:

  • 使用@Component注解對實(shí)體進(jìn)行標(biāo)注螟碎,Spring容器自動(dòng)將當(dāng)前類賬號成容器管理的Bean眉菱。
Spring還提供了3個(gè)功能基本和@Component等效的注解分別用于Dao,Service掉分,Controller
  • 1俭缓、@Repository:用于對dao實(shí)現(xiàn)類標(biāo)注
  • 2、@Service:對Service實(shí)現(xiàn)類標(biāo)注
  • 3酥郭、@Controller用于對Controller實(shí)現(xiàn)類標(biāo)注

注意:

  • 可以用@Component代替此3個(gè)注解华坦,不統(tǒng)一使用一個(gè)注解是為了看出Bean的真實(shí)身份。

二不从、包掃描注解定義的Bean

  • Spring的context命名空間提供了通過掃描包以應(yīng)用注解定義Bean的方式惜姐。

1、xml配置包掃描

<context:component-scan base-package=""/>
說明:
  • context:component-scan:包掃描標(biāo)簽
  • base-package:基礎(chǔ)包椿息,Spring掃描基礎(chǔ)包所有類歹袁,并從類的注解詳細(xì)中獲取Bean的定義信息。

2寝优、掃描特定類可以添加(resource-pattern)屬性過濾

 <context:component-scan base-package="" resource-pattern="anno/*.class"/>
說明:
  • resource-pattern="anno/*.class":Spring僅會掃描基類包annon子包中的類

3条舔、目錄下多種匹配

  • 如果掃描基礎(chǔ)包下需要包含和需要排除的類同時(shí)存在可以使用filter
<context:component-scan base-package="" resource-pattern="anno/*.class">
    <context:incloud-filter type="regex" expression="com\.smart\.anno.*" />
    <context:exclude-filter type="aspectj" expression="com.smart..*Controller+" />
</context:component-scan>
  • context:incloud-filter:表示需要包含的目標(biāo)類
  • context:exclude-filter :表示需要排除的目標(biāo)類

type類型說明:

3.1、annotation:采用目標(biāo)類是否標(biāo)注了某個(gè)注解進(jìn)行過濾
  • 示例:com.smart.XxxAnnotation
  • 說明:所有標(biāo)注了XxxAnnotation的類乏矾,
3.2孟抗、assignable:采用目標(biāo)類首付繼承或擴(kuò)展了某個(gè)特定的類進(jìn)行過濾
  • 示例:com.smart.XxxService
  • 說明:所有繼承或擴(kuò)展XxxService的類
3.3、aspectj:采用AspectJ表達(dá)式進(jìn)行過濾
  • 示例:com.smart..*Service+
  • 說明:所有類名以Service結(jié)束及繼承妻熊,或擴(kuò)展他們的類
3.4夸浅、regex:采用正則表達(dá)式根據(jù)目標(biāo)類的類名進(jìn)行過濾
  • 示例:com.smart.anno..*
  • 說明:所有com.smart.anno類下的包
3.5、custom:采用接口方式過濾
  • 示例:com.smart.XxxTyoeFilter

  • 說明:采用XxxTyoeFilter代碼方式實(shí)現(xiàn)過濾扔役,前提是必須實(shí)現(xiàn)TyoeFilter接口

  • 過濾類型中除了custom類型外帆喇,aspectj的過濾表達(dá)能力是最強(qiáng)的,可以輕易實(shí)現(xiàn)其他類型的表達(dá)規(guī)則亿胸。

4坯钦、user-default-filters屬性

  • 屬性的默認(rèn)值位true:表示默認(rèn)對標(biāo)注@Component预皇,@Controller,@Service婉刀,@Reposity的Bean進(jìn)行掃描

三吟温、自動(dòng)裝配Bean

1、使用@Autowired進(jìn)行自動(dòng)注入

@Service
public class LoginService{
    
    @Autowired
    private LoginDao loginDao;
}

說明

  • @Service注解將LoginService標(biāo)注為一個(gè)Bean
  • @Autowired注入一個(gè)LoginDao實(shí)體Bean
  • @Autowired默認(rèn)按照類型匹配方式從容器中查找匹配的Bean突颊,當(dāng)只有一個(gè)匹配的Bean時(shí)鲁豪,Spring將其注入@Autowired標(biāo)記的變量中

2、使用@Autowired的required屬性

  • 如果容器中沒有和標(biāo)注變量類型匹配的Bean律秃,Spring容器啟動(dòng)時(shí)會拋出異常爬橡,如果希望Spring不拋出異常可以添加required屬性
@Service
public class LoginService{
    
    @Autowired(required=false)
    private LoginDao loginDao;
}

說明

  • Autowired的required屬性為true

3棒动、使用@Qualifier指定注入Bean的名稱

  • 如果容器中存在多個(gè)匹配的Bean時(shí)糙申,采用@Qualifier屬性限定Bean的名稱
@Service
public class LoginService{
    
    @Autowired 
    private LoginDao loginDao;
    
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
}

說明:

  • 指定UserDao的實(shí)例對象在當(dāng)前當(dāng)前類注入的bean名稱為"userDao"

4、對類方法進(jìn)行標(biāo)注

  • @Autowired可以對類采用變量和方法的參數(shù)進(jìn)行標(biāo)注
@Service
public class LoginService{
    private LoginDao loginDao;
    private UserDao userDao;
    
    //自動(dòng)將LoginDao傳給方法入?yún)?    @Autowired
    public void setLoginDao(LoginDao loginDao){
        this.loginDao = loginDao;
    }
    //自動(dòng)將名為userDao的實(shí)體傳給方法入?yún)?    @Autowired
    @Qualifier("userDao")
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
}
  • 如果一個(gè)方法有多個(gè)入?yún)⒋遥J(rèn)情況下Spring會自動(dòng)選擇匹配入?yún)㈩愋偷腂ean進(jìn)行注入
  • Spring允許對方法入?yún)?biāo)注@Qualifier來指定注入Bean的名稱
@Autowired
public void init(@Qualifier("userDao")UserDao userDao,LoginDao loginDao){
    this.userdao = userDao;
    this.loginDao =loginDao;
}
  • 一般Spring中的bean都是單實(shí)例對象柜裸,一般不需要特別指定Bean實(shí)例的名稱,來按名稱注入

5粱锐、對集合類進(jìn)行標(biāo)注

  • 如果對類中集合類的變量或方法入?yún)⑦M(jìn)行@Autowired標(biāo)注疙挺,那么Spring會將容器中類型匹配的所有Bean都自動(dòng)注入進(jìn)來。
public class ListComponent{
      
    @Autowired(required=false)
    private List<Plugin> plugins;
    @Autowired
    private Map<String,plugin> pluginMaps;
    
    public List<Plugin> getPlugins(){
        return plugins;
    }
}

說明:

  • plugins注入:Spring會將容器中所有類型為Plugin的Bean注入到這個(gè)變量中
  • pluginMaps:將Plugin類型的Bean注入Map中卜范,key是Bean的名字衔统,value是對應(yīng)的bean
@Component
@Order(value = 1)
public class OnePlugin implements Plugin{}

說明:

  • @Order(value = 1):指定此實(shí)體對象的加載順序鹿榜,值越小優(yōu)先被加載海雪。

6、對延遲依賴注入的支持

  • 在Spring容器啟動(dòng)時(shí)舱殿,在Bean上標(biāo)記了@Lazy及@Autowired注解的屬性不會立即注入屬性值奥裸,而是延遲到調(diào)用此屬性時(shí)才會注入
@Lazy
@Repository
public class Login{}
@Service
public class LoginService {
    @Lazy
    @Autowired(required=false)
    public void setLogin(LoginDao loginDao){}
}
  • 對Bean實(shí)施延遲依賴注入,@Lazy注解必須同時(shí)標(biāo)注在屬性及目標(biāo)Bean上沪袭,缺一不可湾宙。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冈绊,隨后出現(xiàn)的幾起案子侠鳄,更是在濱河造成了極大的恐慌,老刑警劉巖死宣,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伟恶,死亡現(xiàn)場離奇詭異,居然都是意外死亡毅该,警方通過查閱死者的電腦和手機(jī)博秫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門潦牛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挡育,你說我怎么就攤上這事巴碗。” “怎么了即寒?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵橡淆,是天一觀的道長。 經(jīng)常有香客問我母赵,道長明垢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任市咽,我火速辦了婚禮痊银,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘施绎。我一直安慰自己溯革,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布谷醉。 她就那樣靜靜地躺著致稀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俱尼。 梳的紋絲不亂的頭發(fā)上抖单,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音遇八,去河邊找鬼矛绘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛刃永,可吹牛的內(nèi)容都是我干的货矮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼斯够,長吁一口氣:“原來是場噩夢啊……” “哼囚玫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起读规,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤抓督,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后束亏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铃在,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年枪汪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涌穆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怔昨。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宿稀,靈堂內(nèi)的尸體忽然破棺而出趁舀,到底是詐尸還是另有隱情,我是刑警寧澤祝沸,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布矮烹,位于F島的核電站,受9級特大地震影響罩锐,放射性物質(zhì)發(fā)生泄漏奉狈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一涩惑、第九天 我趴在偏房一處隱蔽的房頂上張望仁期。 院中可真熱鬧,春花似錦竭恬、人聲如沸跛蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赊级。三九已至,卻和暖如春岔绸,著一層夾襖步出監(jiān)牢的瞬間理逊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工盒揉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晋被,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓预烙,卻偏偏與公主長得像墨微,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子扁掸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容