Spring IoC容器之類路徑掃描及組件管理

通過類掃描路徑的方式來隱式檢測候選組件,候選組件是匹配過濾條件的類庫,并有在容器中注冊(cè)對(duì)應(yīng)bean的定義。開發(fā)者可以使用注解、AspectJ風(fēng)格的表達(dá)式、自定義的過濾條件來選擇哪些類有在容器中注冊(cè)bean。

1、@Component及其同義的注解

spring2.5引入了更多典型注解,如@Component、@Repository、@Service、@Controller等。@Component注解是對(duì)受spring過濾組件的通用注解。@Repository、@Service、@Controller注解分別對(duì)應(yīng)持久層、服務(wù)層和表現(xiàn)層。可以使用@Component注解自己的組件類,若使用@Repository、@Service、@Controller來替代,則這些類更適合由工具來處理或與切面進(jìn)行關(guān)聯(lián)。

2、元注解

元注解就是能被應(yīng)用到另一個(gè)注解上的注解。

元注解可以被用于創(chuàng)建組合注解,如springMVC中的@RestController就是@Controller和@ResponseBody。組合注解可能從元注解中任意重新聲明屬性來允許用戶自定義。如下是一個(gè)自定義的@Scope注解,將作用域名稱指定到@Session注解上,也允許自定義proxyMode。

SessionScope定義
@SessionScope可以不聲明proxyMode就使用??
為proxyMode重載一個(gè)值

3、自動(dòng)檢測類并注冊(cè)bean定義

spring可以自動(dòng)檢測類并在ApplicationContext中注冊(cè)對(duì)應(yīng)的BeanDefinition。示例如下:

要自動(dòng)檢測這些類并注冊(cè)對(duì)應(yīng)的bean,需要添加@ComponentScan到@Configuration類上,其中的base-package元素是這兩個(gè)類的公共父類包,可以任意選擇使用逗號(hào)、分號(hào)、空格分隔的列表將每個(gè)類引入父包。示例如下:

或者使用XML配置:

<context:component-scan>隱式的開啟了<context:annotation-config>功能,因此無需再使用<context:annotation-config>。

4、使用過濾器來自定義掃描

默認(rèn)情況下@Component、@Repository、@Service、@Controller注解,或使用進(jìn)行自定義的@Component注解的類本身僅用于檢測候選組件,開發(fā)者可以修改并擴(kuò)展這種行為,只需應(yīng)用自定義的過濾器,即在@ComponentScan注解中添加include-filter或exclude-filter參數(shù)即可。每個(gè)過濾器元素需要type和expression屬性。

過濾器選項(xiàng)及描述
使用Stub庫來代替Repository注解
使用XML方式來配置

JSR-330規(guī)范注解

JSR-330是Java依賴注入的標(biāo)準(zhǔn)規(guī)范,從spring3.0開始支持。

\bullet @Inject

@javax.inject.Inject可以代替@Autowired注解,和@Autowired一樣,它可以在字段、方法或構(gòu)造器參數(shù)級(jí)別使用,示例如下:

import javax.inject.Inject;

public class TestBean {

????private MessageServiceservice;

? ? @Inject

????public void setService(MessageService service) {this.service = service;}

}

\bullet @Named和@ManagedBean

@javax.inject.Named和javax.annotation.ManagedBean可以代替@Component。示例如下:

import javax.inject.Named;

import javax.inject.Inject;

@Named("testBean") //等同于@ManagedBean("testBean")

public class?TestBean {

? ??private MessageServiceservice;

? ??@Inject

????public void setService(MessageService service) {this.service = service;}

}

當(dāng)使用@javax.inject.Named和javax.annotation.ManagedBean注解時(shí),可以與使用spring注解相同的方式使用組件掃描。

@Configuration

@ComponentScan(basePackages ="com.xlws")

public class AppConfig {}


--參考文獻(xiàn)《Srping5開發(fā)大全》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • [TOC] Spring配置方案 (不僅僅是Ioc的配置)從前文容器的具體實(shí)現(xiàn)已經(jīng)知道,配置容器或者說配置應(yīng)用上下...
    0x70e8閱讀 531評(píng)論 0 0
  • 1.@Component和相關(guān)的注解 Spring提供了很多類似的注解,包括@Component, @Servic...
    Mrsunup閱讀 839評(píng)論 0 0
  • 本來是準(zhǔn)備看一看Spring源碼的。然后在知乎上看到來一個(gè)帖子,說有一群**自己連Spring官方文檔都沒有完全讀...
    此魚不得水閱讀 7,037評(píng)論 4 21
  • 轉(zhuǎn) Spring****基于 Annotation 的簡單介紹 2011年03月29日 15:07:00 閱讀數(shù):...
    fd649cf896c0閱讀 376評(píng)論 1 0
  • 概述 Spring是什么? Spring是一個(gè)開源框架,為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的,但是現(xiàn)在已經(jīng)不止于企...
    瑯筑閱讀 1,294評(píng)論 2 8

友情鏈接更多精彩內(nèi)容