spring源碼學(xué)習(xí)分析(一)

1. @Configuration

標(biāo)注在類上霍殴,表示這是一個spring的配置類开镣。使用@bean注解向容器中添加一個組件

2. @bean

標(biāo)注在方法上焕济,表示向容器中添加一個組件嘴瓤。組件的類型為返回值的類型毁腿;組件的id默認(rèn)為方法名,也可以指定組件的名稱@bean(value="bean的名稱")仇冯。

3. @CompentScan

標(biāo)注在類上之宿,用來進(jìn)行包掃描,掃描@component苛坚、@Controller澈缺、@Service、@Repository注解標(biāo)注的類炕婶,添加到容器中

  1. excludeFilters:指定一下排除策略姐赡,排除某些注解
  2. includeFilters:指定包含策略,指定包含某些注解柠掂。需要把useDefaultFilters屬性設(shè)置為false(true表示掃描全部的)
  3. @ComponentScan.Filter type的類型
    1. 注解形式的FilterType.ANNOTATION @Controller @Service @Repository @Compent
    2. 指定類型的 FilterType.ASSIGNABLE_TYPE
    @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,value = {GobaioService.class})
    
    1. aspectj類型的 FilterType.ASPECTJ(不常用)
    2. 正則表達(dá)式的 FilterType.REGEX(不常用)
    3. 自定義的 FilterType.CUSTOM
    public enum FilterType { 
        //注解形式 比如@Controller @Service @Repository @Compent 
       ANNOTATION, 
        //指定的類型 
       ASSIGNABLE_TYPE, 
       //aspectJ形式的 
       ASPECTJ, 
      //正則表達(dá)式的 
      REGEX, 
      //自定義的 CUSTOM
     }
    
    1. FilterType.CUSTOM 自定義類型如何使用
    public class GobaioFilterType implements TypeFilter { 
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { 
        //獲取當(dāng)前類的注解源信息 
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); 
        //獲取當(dāng)前類的class的源信息 
        ClassMetadata classMetadata = metadataReader.getClassMetadata(); 
        //獲取當(dāng)前類的資源信息 
        Resource resource = metadataReader.getResource(); 
        if(classMetadata.getClassName().contains("dao")) {
         return true; 
        }
        return false;
     }
    }
    
      @ComponentScan(basePackages = {"com.gobaio.testcompentscan"},
    includeFilters = { @ComponentScan.Filter(type = FilterType.CUSTOM,value = GobaioFilterType.class) },useDefaultFilters = false) 
      public class MainConfig { }
    

4. @scop

在不指定@Scope的情況下项滑,所有的bean都是單實例的bean,而且是餓漢加載,指定@Scope為 prototype 表示為多實例的,而且還是懶漢模式加載(IOC容器啟動的時候涯贞,并不會創(chuàng)建對象枪狂,而是 在第一次使用的時候才會創(chuàng)建)
@Scope指定的作用域方法取值:
a. singleton 單實例的(默認(rèn))
b. prototype 多實例的
c. request 同一次請求
d. session 同一個會話級別

5. @Lazy

Bean的懶加載
@Lazy(主要針對單實例的bean 容器啟動的時候,不創(chuàng)建對象宋渔,在第一次使用的時候才會創(chuàng)建該對象)

6. @Conditional進(jìn)行條件判斷

public class GobaioCondition implements Condition {
  @Override 
  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    return false;
  }
@Conditional(value = GobaioCondition.class) 
 public GobaioLog gobaioLog() { return new gobiaoLog(); }

7. 往IOC 容器中添加組件的方式

  1. 通過@CompentScan +@Controller @Service @Respository @compent
    適用場景: 針對我們自己寫的組件可以通過該方式來進(jìn)行加載到容器中州疾。
  2. 通過@Bean的方式來導(dǎo)入組件(適用于導(dǎo)入第三方組件的類)
  3. 通過@Import來導(dǎo)入組件(導(dǎo)入組件的id為全類名路徑);通過@Import 的ImportSeletor類實現(xiàn)組件的導(dǎo)入 (導(dǎo)入組件的id為全類名路徑);通過@Import的 ImportBeanDefinitionRegister導(dǎo)入組件 (可以指定bean的名稱);@ImportResource(value = {"classpath:beans/beans.xml"})導(dǎo)入一個spring的配置文件
  4. 通過實現(xiàn)FacotryBean接口來實現(xiàn)注冊 組件

7. @Value+@PropertySource

通過@Value +@PropertySource來給組件賦值

@PropertySource(value = {"classpath:person.properties"}) //指定外部文件的位置

8. 自動裝配

8.1 @AutoWired

  1. 自動裝配首先時按照類型進(jìn)行裝配,若在IOC容器中發(fā)現(xiàn)了多個相同類型的組件皇拣,那么就按照 屬性名稱來進(jìn)行裝配
    @Autowired
    private GobaioDao gobaioDao;
    比如严蓖,我容器中有兩個GobaioDao類型的組件 一個叫g(shù)obaioDao 一個叫g(shù)obaioDao2 那么我們通過@AutoWired 來修飾的屬性名稱時gobaioDao,那么拿就加載容器的gobaiaoDao組件氧急,若屬性名稱為 gobaioDao2 那么他就加載的時gobaioDao2組件
  2. 假設(shè)我們需要指定特定的組件來進(jìn)行裝配颗胡,我們可以通過使用@Qualifier("gobaioDao")來指定裝配的組件 或者在配置類上的@Bean加上@Primary注解
  3. 假設(shè)我們?nèi)萜髦屑礇]有g(shù)obaioDao 和gobaioDao2,那么在裝配的時候就會拋出異常
    No qualifying bean of type 'com.gobaio.testautowired.GobaioDao' available;
    若我們想不拋異常 ,我們需要指定 required為false的時候可以了
@Autowired(required = false) 
@Qualifier("gobaioDao") 
private GobaioDao gobaioDao2;
  1. @Resource(JSR250規(guī)范)
    功能和@AutoWired的功能差不多一樣吩坝,但是不支持@Primary 和@Qualifier的支持
  2. @InJect(JSR330規(guī)范)
    需要導(dǎo)入jar包依賴 功能和支持@Primary功能 ,但是沒有Require=false的功能
<dependency>
   <groupId>javax.inject</groupId> 
   <artifactId>javax.inject</artifactId>
   <version>1</version> 
</dependency>
  1. 使用autowired 可以標(biāo)注在方法上
    標(biāo)注在set方法上
//@Autowired 
public void setGobaioLog(GobaioLog gobaioLog) {
  this.gobaioLog = gobaioLog; 
}

標(biāo)注在構(gòu)造方法上

@Autowired 
public GobaioAspect(GobaioLog gobaioLog) { 
  this.gobaioLog = gobaioLog;
 }

標(biāo)注在配置類上的入?yún)⒅校梢圆粚懀?/p>

@Bean 
public GobaioAspect gobaioAspect(@Autowired GobaioLog gobaioLog) { 
  GobaioAspect gobaioAspect = new GobaioAspect(gobaioLog); 
  return gobaioAspect;
 }

9. @Profile

通過@Profile注解 來根據(jù)環(huán)境來激活標(biāo)識不同的Bean

  1. @Profile標(biāo)識在類上毒姨,那么只有當(dāng)前環(huán)境匹配,整個配置類才會生效
  2. @Profile標(biāo)識在Bean上 钉寝,那么只有當(dāng)前環(huán)境的Bean才會被激活
  3. 沒有標(biāo)志為@Profile的bean 不管在什么環(huán)境都可以被激活
    激活切換環(huán)境的方法:
  4. 通過運(yùn)行時jvm參數(shù)來切換 -Dspring.profiles.active=test|dev|prod
  5. 通過代碼的方式來激活
public static void main(String[] args) {
  AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
  ctx.getEnvironment().setActiveProfiles("test","dev"); 
  ctx.register(MainConfig.class); 
  ctx.refresh(); printBeanName(ctx); 
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末弧呐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嵌纲,更是在濱河造成了極大的恐慌俘枫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疹瘦,死亡現(xiàn)場離奇詭異崩哩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門邓嘹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酣栈,“玉大人,你說我怎么就攤上這事汹押】篌荩” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵棚贾,是天一觀的道長窖维。 經(jīng)常有香客問我,道長妙痹,這世上最難降的妖魔是什么铸史? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮怯伊,結(jié)果婚禮上琳轿,老公的妹妹穿的比我還像新娘。我一直安慰自己耿芹,他們只是感情好崭篡,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吧秕,像睡著了一般琉闪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上砸彬,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天颠毙,我揣著相機(jī)與錄音,去河邊找鬼拿霉。 笑死吟秩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绽淘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼闹伪,長吁一口氣:“原來是場噩夢啊……” “哼沪铭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起偏瓤,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤杀怠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厅克,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赔退,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了硕旗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窗骑。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漆枚,靈堂內(nèi)的尸體忽然破棺而出创译,到底是詐尸還是另有隱情,我是刑警寧澤墙基,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布软族,位于F島的核電站,受9級特大地震影響残制,放射性物質(zhì)發(fā)生泄漏立砸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一初茶、第九天 我趴在偏房一處隱蔽的房頂上張望颗祝。 院中可真熱鬧,春花似錦纺蛆、人聲如沸吐葵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽温峭。三九已至,卻和暖如春字支,著一層夾襖步出監(jiān)牢的瞬間凤藏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工堕伪, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留揖庄,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓欠雌,卻偏偏與公主長得像蹄梢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子富俄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 深入使用 Spring兩種后處理器Bean 后處理器容器后處理器屬性占位符配置器重寫占位符配置器Spring 的自...
    漸丶忘閱讀 1,085評論 0 1
  • Spring致力于提供一種方法管理你的業(yè)務(wù)對象禁炒。在大量Java EE的應(yīng)用中,隨處可見Spring霍比。今天我將簡單的...
    JAVA架構(gòu)師的圈子閱讀 1,318評論 0 16
  • 如何學(xué)習(xí)Spring框架 了解Spring的出現(xiàn)是為了解決什么問題D桓ぁ!悠瞬!了解Spring的出現(xiàn)是為了解決什么問題们豌!...
    G_慧慧閱讀 677評論 0 0
  • 來源:關(guān)于Spring IOC (DI-依賴注入)你需要知道的一切作者:zejian Dao層(AccountDa...
    楊井閱讀 5,326評論 0 27
  • 如下是整篇文章的結(jié)構(gòu)涯捻,所需閱讀時間大約20min Spring簡介 Spring框架由Rod Johnson開發(fā),...
    李序鍇閱讀 890評論 0 15