核心

BeanDefinition

容器中的每一個 bean 都會有一個對應的 BeanDefinition 實例,該實例負責保存bean對象的所有必要信息,包括 bean 對象的 class 類型、是否是抽象類炼邀、構造方法和參數(shù)槽片、其它屬性等等。

BeanDefinitionRegistry和 BeanFactory就是菜譜(記錄這道菜怎么做出來的)

BeanDefinitionRegistry 抽象出 bean 的注冊邏輯普筹,而 BeanFactory 則抽象出了 bean 的管理邏輯,而各個 BeanFactory 的實現(xiàn)類就具體承擔了 bean 的注冊以及管理工作

DefaultListableBeanFactory

實現(xiàn)BeanFactory接口 隘马,它同時也實現(xiàn)了 BeanDefinitionRegistry 接口

IOC容器的工作流程

  1. 容器啟動階段
    容器啟動時太防,會通過某種途徑加載 ConfigurationMetaData(xml的配置文件)。除了代碼方式比較直接外酸员,在大部分情況下蜒车,容器需要依賴某些工具類,比如: BeanDefinitionReader幔嗦,BeanDefinitionReader 會對加載的 ConfigurationMetaData(xml的配置文件)進行解析和分析酿愧,并將分析后的信息組裝為相應的 BeanDefinition,最后把這些保存了 bean 定義的 BeanDefinition邀泉,注冊到相應的 BeanDefinitionRegistry嬉挡,這樣容器的啟動工作就完成了钝鸽。
  2. Bean的實例化階段
    經過第一階段,所有 bean 定義都通過 BeanDefinition 的方式注冊到 BeanDefinitionRegistry 中庞钢,當某個請求通過容器的 getBean 方法請求某個對象拔恰,或者因為依賴關系容器需要隱式的調用 getBean 時,就會觸發(fā)第二階段的活動:容器會首先檢查所請求的對象之前是否已經實例化完成基括。如果沒有颜懊,則會根據(jù)注冊的 BeanDefinition 所提供的信息實例化被請求對象,并為其注入依賴风皿。當該對象裝配完畢后河爹,容器會立即將其返回給請求方法使用。
    BeanFactory 只是 Spring IoC 容器的一種實現(xiàn)桐款,如果沒有特殊指定咸这,它采用采用延遲初始化策略:只有當訪問容器中的某個對象時,才對該對象進行初始化和依賴注入操作魔眨。而在實際場景下炊苫,我們更多的使用另外一種類型的容器: ApplicationContext,它構建在 BeanFactory 之上冰沙,屬于更高級的容器侨艾,除了具有 BeanFactory 的所有能力之外,還提供對事件監(jiān)聽機制以及國際化的支持等拓挥。它管理的 bean唠梨,在容器啟動時全部完成初始化和依賴注入操作。(?? BeanFactory在被請求getBean要獲取bean時才實例化侥啤,而如果說BeanFactory是Spring的心臟当叭,那么ApplicationContext就是完整的軀體了,ApplicationContext由BeanFactory派生而來盖灸,比它強大)

JavaConfig (@Configuration @Bean)

上面我們提到bean的定義和相互間是用xml描述的蚁鳖,因為產生了許多的xml文件因此人們對它不滿,所以完善了用Annotation來注冊bean就是我們所見的@注釋

@ComponentScan

注解用于導入配置類赁炎,比如配置類中的bean依賴于另一個別的類的bean醉箕,那么就可以借助@import把依賴的那個bean引進配置類
通過 basePackages等屬性來指定 @ComponentScan自動掃描的范圍,如果不指定徙垫,默認從聲明 @ComponentScan所在類的 package進行掃描讥裤。正因為如此,SpringBoot的啟動類都默認在 src/main/java下

@Import

用于導入配置類姻报,比如配置類中的bean依賴于另一個別的類的bean己英,那么就可以借助@import把依賴的那個bean引進配置類

例子:

@Configuration
public class MoonBookConfiguration {
    @Bean
    public BookService bookService() {
        return new BookServiceImpl();
    }
}

現(xiàn)在有另外一個配置類,比如: MoonUserConfiguration吴旋,這個配置類中有一個bean依賴于 MoonBookConfiguration中的bookService损肛,如何將這兩個bean組合在一起厢破?借助 @Import即可:

@Configuration
// 可以同時導入多個配置類,比如:@Import({A.class,B.class})
@Import(MoonBookConfiguration.class)
public class MoonUserConfiguration {
    @Bean
    public UserService userService(BookService bookService) {
        return new BookServiceImpl(bookService);
    }
}

在4.2之前治拿, @Import注解只支持導入配置類摩泪,但是在4.2之后,它支持導入普通類忍啤,并將這個類作為一個bean的定義注冊到IOC容器中

@Conditional

表示在滿足某種條件后才初始化一個bean或者啟用某些配置

@ConfigurationProperties與@EnableConfigurationProperties

當某些屬性的值需要配置的時候,我們一般會在 application.properties文件中新建配置項仙辟,然后在bean中使用 @Value注解來獲取配置的值同波。
使用 @Value注解注入的屬性通常都比較簡單,如果同一個配置在多個地方使用叠国,也存在不方便維護的問題(考慮下未檩,如果有幾十個地方在使用某個配置,而現(xiàn)在你想改下名字粟焊,你改怎么做冤狡?)。對于更為復雜的配置项棠,Spring Boot提供了更優(yōu)雅的實現(xiàn)方式悲雳,那就是 @ConfigurationProperties注解。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末香追,一起剝皮案震驚了整個濱河市合瓢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌透典,老刑警劉巖晴楔,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異峭咒,居然都是意外死亡税弃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門凑队,熙熙樓的掌柜王于貴愁眉苦臉地迎上來则果,“玉大人,你說我怎么就攤上這事漩氨《烫酰” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵才菠,是天一觀的道長茸时。 經常有香客問我,道長赋访,這世上最難降的妖魔是什么可都? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任缓待,我火速辦了婚禮,結果婚禮上渠牲,老公的妹妹穿的比我還像新娘旋炒。我一直安慰自己,他們只是感情好签杈,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布瘫镇。 她就那樣靜靜地躺著,像睡著了一般答姥。 火紅的嫁衣襯著肌膚如雪铣除。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天鹦付,我揣著相機與錄音尚粘,去河邊找鬼。 笑死敲长,一個胖子當著我的面吹牛郎嫁,可吹牛的內容都是我干的。 我是一名探鬼主播祈噪,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泽铛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辑鲤?” 一聲冷哼從身側響起厚宰,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遂填,沒想到半個月后铲觉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡吓坚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年撵幽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片礁击。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡盐杂,死狀恐怖,靈堂內的尸體忽然破棺而出哆窿,到底是詐尸還是另有隱情链烈,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布挚躯,位于F島的核電站强衡,受9級特大地震影響,放射性物質發(fā)生泄漏码荔。R本人自食惡果不足惜漩勤,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一感挥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧越败,春花似錦触幼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亿傅,卻和暖如春媒峡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袱蜡。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工丝蹭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慢宗,地道東北人坪蚁。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像镜沽,于是被迫代替她去往敵國和親敏晤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內容