Springboot自動(dòng)裝配

Springboot自動(dòng)裝配

springboot啟動(dòng)時(shí)我們常見的就是一個(gè)注解@SpringBootApplication 和 SpringApplication的run方法笨鸡,前面介紹過run(http://www.reibang.com/p/90ebeec86f64),今天詳細(xì)看一下@SpringBootApplication匀借。

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
}

@SpringBootApplication是一個(gè)注解的組合恤磷,進(jìn)去看下它里面

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
      @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

主要包含@SpringBootConfiguration狮鸭,@EnableAutoConfiguration浆竭,@ComponentScan

首先@ComponentScan,默認(rèn)掃描的是與該類同級(jí)的類或者同級(jí)包下的所有類

其次@SpringBootConfiguration性昭,只是封裝了@Configuration,把啟動(dòng)類指定為一個(gè)javaConfig(會(huì)在容器刷新中的invokeBeanFactoryPostProcessors里進(jìn)行解析執(zhí)行)

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

最后@EnableAutoConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

   String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

   /**
    * Exclude specific auto-configuration classes such that they will never be applied.
    * @return the classes to exclude
    */
   Class<?>[] exclude() default {};

   /**
    * Exclude specific auto-configuration class names such that they will never be
    * applied.
    * @return the class names to exclude
    * @since 1.3.0
    */
   String[] excludeName() default {};

}

@EnableAutoConfiguration里面有兩個(gè)主要的注解@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)捎琐。

@AutoConfigurationPackage蓄髓,該注解的作用是添加該注解的類所在的package(啟動(dòng)類所在路徑) 作為 自動(dòng)配置package 進(jìn)行管理叉庐。

@Import(AutoConfigurationImportSelector.class),看一下后面它注冊到容器中的bean AutoConfigurationImportSelector.class会喝。

public class AutoConfigurationImportSelector
      implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
      BeanFactoryAware, EnvironmentAware, Ordered {
        //省略陡叠。。肢执。枉阵。。

其中DeferredImportSelector extends ImportSelector预茄,所以會(huì)執(zhí)行到selectImports岭妖,DeferredImportSelector 和 ImportSelector的區(qū)別在于DeferredImportSelector為延時(shí)加載,等configure都加載完了才開始加載

看一下AutoConfigurationImportSelector里的selectImports

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
  //判斷是否需要自動(dòng)裝配
   if (!isEnabled(annotationMetadata)) {
      return NO_IMPORTS;
   }
  //從META-INF/spring-autoconfigure-metadata.properties讀取元數(shù)據(jù)與元數(shù)據(jù)的相關(guān)屬性
   AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
         .loadMetadata(this.beanClassLoader);
   AnnotationAttributes attributes = getAttributes(annotationMetadata);
  //讀取META-INF/spring.factories下的EnableAutoConfiguration的配置(這里用到了SpringFactoriesLoader反璃,和啟動(dòng)過程中加載spring.factories中的初始化器和監(jiān)聽器是同一個(gè))
   List<String> configurations = getCandidateConfigurations(annotationMetadata,
         attributes);
  //排除與過濾
   configurations = removeDuplicates(configurations);
   Set<String> exclusions = getExclusions(annotationMetadata, attributes);
   checkExcludedClasses(configurations, exclusions);
   configurations.removeAll(exclusions);
   configurations = filter(configurations, autoConfigurationMetadata);
  //讓所有配置在META-INF/spring.factories下的AutoConfigurationImportListener執(zhí)行AutoConfigurationImportEvent事件
   fireAutoConfigurationImportEvents(configurations, exclusions);
   return StringUtils.toStringArray(configurations);
}

上面這些過程只是確定了需要自定裝配的類昵慌,真正開始處理是在容器刷新中的invokeBeanFactoryPostProcessors方法里,里面用了ConfigurationClassPostProcessor這個(gè)后置處理來處理并且用相應(yīng)的解析器來解析@Configuration注解修飾的類(@Component淮蜈、@ComponentScan斋攀、@Import、@ImportResource修飾的類也會(huì)被處理)梧田,具體可參考http://www.reibang.com/p/ab0b7df24c01

另外淳蔼,每個(gè)需要自動(dòng)裝配的類都可以根據(jù)條件判斷是否進(jìn)行裝配@ConditionalXXX,舉例mq

@Configuration
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import(RabbitAnnotationDrivenConfiguration.class)
public class RabbitAutoConfiguration {
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裁眯,一起剝皮案震驚了整個(gè)濱河市鹉梨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌穿稳,老刑警劉巖存皂,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逢艘,居然都是意外死亡旦袋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門它改,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疤孕,“玉大人,你說我怎么就攤上這事央拖〖婪В” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵鲜戒,是天一觀的道長专控。 經(jīng)常有香客問我,道長袍啡,這世上最難降的妖魔是什么踩官? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮境输,結(jié)果婚禮上蔗牡,老公的妹妹穿的比我還像新娘。我一直安慰自己嗅剖,他們只是感情好辩越,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著信粮,像睡著了一般黔攒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天督惰,我揣著相機(jī)與錄音不傅,去河邊找鬼。 笑死赏胚,一個(gè)胖子當(dāng)著我的面吹牛访娶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播觉阅,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼崖疤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了典勇?” 一聲冷哼從身側(cè)響起劫哼,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎割笙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豪嚎,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了革为。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舵鳞。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抛虏,死狀恐怖套才,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沸毁,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站眉孩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巴柿。R本人自食惡果不足惜广恢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一至非、第九天 我趴在偏房一處隱蔽的房頂上張望糠聪。 院中可真熱鬧舰蟆,春花似錦、人聲如沸味悄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淮悼。三九已至,卻和暖如春见擦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背损痰。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辽社,地道東北人翘鸭。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓汉匙,卻偏偏與公主長得像生蚁,于是被迫代替她去往敵國和親邦投。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353