SpringBoot自動(dòng)裝配原理

1. Spring部分注解

  1. @Import : 為Spring容器中引入一些組件,通常都有無參數(shù)的構(gòu)造方法
  2. @ConditionXXX : 需要達(dá)成某些條件該配置類才會(huì)生效
  3. @EnableAutoConfiguration : 開啟自動(dòng)配置注解,在@SpringBootApplication注解中已經(jīng)開啟

2. 自動(dòng)裝配過程

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
  1. 通過@Import(EnableAutoConfigurationImportSelector.class)引入了這個(gè)類
  2. 這個(gè)類的父類有一個(gè)selectImports的方法,這個(gè)方法里面有一個(gè)List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);來獲取到所有的候選配置
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
            AnnotationAttributes attributes) {
        /** 這個(gè)方法來獲取所有的配置,getSpringFactoriesLoaderFactoryClass()方法是EnableAutoConfiguration.class; */
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
                getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
        
        Assert.notEmpty(configurations,
                "No auto configuration classes found in META-INF/spring.factories. If you "
                        + "are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

  1. 再點(diǎn)進(jìn)去
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
        String factoryClassName = factoryClass.getName();
        try {
            /** 去掃描所有包的WEB-INF/spring.factory文件,得到他們的路徑 */
            Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                    ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
            List<String> result = new ArrayList<String>();
            while (urls.hasMoreElements()) {
                URL url = urls.nextElement();
                Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
                /** 然后加載這個(gè)properties文件,獲取到key為EnableAutoConfiguration.class的值,實(shí)際上就是很多的XXXAutoConfiguration配置類 */
                String factoryClassNames = properties.getProperty(factoryClassName);
                result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
            }
            return result;
        }
        catch (IOException ex) {
            throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                    "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
        }
    }
  1. 加載這些配置類到Spring容器中,而這些配置類的作用,就是為容器中添加各種各樣的組件,就完成了自動(dòng)裝配的作用,其中一個(gè)配置類如下:
@Configuration
/** 加載這個(gè)類到這個(gè)配置類中,是一些屬性 */
@EnableConfigurationProperties(HttpEncodingProperties.class)
/** 必須是一個(gè)web項(xiàng)目才會(huì)加載這個(gè)配置類 */
@ConditionalOnWebApplication
@ConditionalOnClass(CharacterEncodingFilter.class)
/** 配置文件中有spring.http.encoding開頭的也加載進(jìn)來,如果沒有匹配到,也可以加載這個(gè)類 */
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

    private final HttpEncodingProperties properties;

    public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }

    /** @Bean,為容器中添加組件 */
    @Bean
    @ConditionalOnMissingBean(CharacterEncodingFilter.class)
    public CharacterEncodingFilter characterEncodingFilter() {

3 我們?nèi)绾问褂肧pringBoot

  1. 添加 spring-boot-xxx-starter包
  2. 查看對(duì)應(yīng)的AutoConfiguration配置類,和對(duì)應(yīng)的xxxPropertise文件
  3. 如果不滿意默認(rèn)配置,我們就進(jìn)行配置,按照他的規(guī)范
  4. 容器中有了對(duì)應(yīng)的組件,我們還可以在自己的Confuration類中對(duì)這些組件進(jìn)行進(jìn)一步包裝.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末再菊,一起剝皮案震驚了整個(gè)濱河市放接,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖捡鱼,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異帖旨,居然都是意外死亡坡疼,警方通過查閱死者的電腦和手機(jī)彬呻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闸氮,你說我怎么就攤上這事剪况。” “怎么了蒲跨?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵译断,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我或悲,道長(zhǎng)镐作,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任隆箩,我火速辦了婚禮,結(jié)果婚禮上羔杨,老公的妹妹穿的比我還像新娘捌臊。我一直安慰自己,他們只是感情好兜材,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布理澎。 她就那樣靜靜地躺著,像睡著了一般曙寡。 火紅的嫁衣襯著肌膚如雪糠爬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天举庶,我揣著相機(jī)與錄音执隧,去河邊找鬼。 笑死户侥,一個(gè)胖子當(dāng)著我的面吹牛镀琉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕊唐,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屋摔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了钓试?” 一聲冷哼從身側(cè)響起副瀑,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤硝烂,失蹤者是張志新(化名)和其女友劉穎滞谢,沒想到半個(gè)月后狮杨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橄教,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡护蝶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年盔夜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喂链。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭微。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瓢剿,靈堂內(nèi)的尸體忽然破棺而出悠轩,到底是詐尸還是另有隱情火架,我是刑警寧澤纺弊,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站犹菱,受9級(jí)特大地震影響腊脱,放射性物質(zhì)發(fā)生泄漏陕凹。R本人自食惡果不足惜杜耙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一浆兰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧店茶,春花似錦劫恒、人聲如沸两嘴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舶替。三九已至顾瞪,卻和暖如春惕橙,著一層夾襖步出監(jiān)牢的瞬間吕漂,已是汗流浹背尘应。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工惶凝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人犬钢。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓苍鲜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親玷犹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子混滔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)歹颓,斷路器坯屿,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 傳統(tǒng)的Spring項(xiàng)目會(huì)有很多的配置文件,比如我們要使用Redis巍扛,一般除了對(duì)應(yīng)的依賴的jar包我們還需要在app...
    黃靠譜閱讀 4,410評(píng)論 0 6
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,810評(píng)論 6 342
  • 本文參考的博客(基本是摘自博客中的內(nèi)容):http://www.reibang.com/p/83693d3d0a...
    小manong閱讀 67,976評(píng)論 4 57
  • 讀取hive庫(kù)數(shù)據(jù) pom.xml依賴配置 讀取hive數(shù)據(jù)demo 讀取mysql數(shù)據(jù) pom.xml配置文件 ...
    bigdata_er閱讀 3,295評(píng)論 0 2