mybatis源碼學(xué)習(xí)-自動(dòng)配置原理

原創(chuàng)不易能扒,轉(zhuǎn)載請(qǐng)寫(xiě)明出處

這個(gè)地方涉及到 spring boot 自動(dòng)配置辫狼,就先聊聊spring boot的自動(dòng)配置原理初斑,在sping boot 的自動(dòng)配置中见秤,最重要的注解是如下注解,保留核心代碼

@Import(EnableAutoConfigurationImportSelector.class)

public @interface EnableAutoConfiguration {

}

看看?EnableAutoConfigurationImportSelector的代碼實(shí)現(xiàn)测摔,也是保留核心邏輯

public class EnableAutoConfigurationImportSelector implements DeferredImportSelector{

@Override

public String[] selectImports(AnnotationMetadata metadata) {

? ? List?configurations = getCandidateConfigurations(metadata, attributes);

? ? ?return configurations.toArray(new String[configurations.size()]);

? }

}

下面貼出getCandidateConfigurations()方法的代碼實(shí)現(xiàn)解恰,也是保留核心邏輯

protected List?getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes) {

? ? ?List configurations = SpringFactoriesLoader.loadFactoryNames(

? ? ?getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());

? ? ?return configurations;

}

這個(gè)地方 getSpringFactoriesLoaderFactoryClass()獲取的是?EnableAutoConfiguration.class修噪,也就是上面的自動(dòng)配置的注解

再來(lái)看看SpringFactoriesLoader類中的?loadFactoryNames()方法

public static ListloadFactoryNames(Class factoryClass, ClassLoader classLoader) {

// 這個(gè)地方是?org.springframework.boot.autoconfigure.EnableAutoConfiguration

String factoryClassName = factoryClass.getName();

//? FACTORIES_RESOURCE_LOCATION 的內(nèi)容是"META-INF/spring.factories"

Enumeration urls = (classLoader !=null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :

ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));

? ? ? List result =new ArrayList();

? ? ? while (urls.hasMoreElements()) {

? ? ? URL url = urls.nextElement();

? ? ? ? Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));

? ? ? ? String factoryClassNames = properties.getProperty(factoryClassName);

? ? ? ? result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));

? ? ? }

return result;

}

以上代碼做的事情就是獲取類加載器classLoader下,所有的資源名為META-INF/spring.factories的資源路媚,之后讀取文件轉(zhuǎn)化為properties 文件獲取key為org.springframework.boot.autoconfigure.EnableAutoConfiguration的value黄琼,之后把逗號(hào)分隔的字符串轉(zhuǎn)化為數(shù)組,返回整慎,返回的數(shù)組內(nèi)容就是要初始化的配置類的名字脏款,下面截取了spring-boot-autoconfigure包中的文件spring.factories 返回的數(shù)組

org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,

org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,

org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

最后一個(gè)是比較重要的配置,數(shù)據(jù)源的自動(dòng)配置裤园,有興趣可以自己看一下撤师,上面說(shuō)了spring-boot的自動(dòng)配置原理,下面看看mybatis-spirng-boot-autoconfigure的自動(dòng)配置原理拧揽,這個(gè)包主要依賴了 mybatis剃盾, 以及 mybatis-spring,它的?META-INF/spring.factories中的內(nèi)容為?

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

也就是說(shuō),在spring-boot添加@EnableAutoConfiguration注解時(shí)淤袜,會(huì)去自動(dòng)實(shí)例化?org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration類

MybatisAutoConfiguration類中痒谴,主要核心邏輯如下

// 很重要的方法,讀取yml初始化SqlSessionFactory, 采用的是默認(rèn)實(shí)現(xiàn)類 DefaultSqlSessionFactory铡羡,

// 在SqlSessionFactoryBuilder 中的 build(Configuration)

@Bean

@ConditionalOnMissingBean

public SqlSessionFactorysqlSessionFactory(DataSource dataSource)throws Exception {

// 項(xiàng)目啟動(dòng)的時(shí)候初始化 SqlSessionFactoryBean积蔚,設(shè)置成員變量,這個(gè)成員變量是從yml等配置文件讀來(lái)的烦周,也就是spring boot

? ? SqlSessionFactoryBean factory =new SqlSessionFactoryBean();

? ? factory.setDataSource(dataSource);

? ? factory.setVfs(SpringBootVFS.class);

? ? //設(shè)置springBoot解析的配置,可以設(shè)置configLocation,也可以設(shè)置configuration,只能設(shè)置其一

? ? if (StringUtils.hasText(this.properties.getConfigLocation())) {

factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));

? ? }

factory.setConfiguration(properties.getConfiguration());

? ? if (this.properties.getConfigurationProperties() !=null) {

factory.setConfigurationProperties(this.properties.getConfigurationProperties());

? ? }

if (!ObjectUtils.isEmpty(this.interceptors)) {

factory.setPlugins(this.interceptors);

? ? }

if (this.databaseIdProvider !=null) {

factory.setDatabaseIdProvider(this.databaseIdProvider);

? ? }

if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {

factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());

? ? }

if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {

factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());

? ? }

if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {

factory.setMapperLocations(this.properties.resolveMapperLocations());

? ? }

// springBoot配置完成后解析config.xml

? ? return factory.getObject();

}

// 初始化 sqlSessionTemplate,自動(dòng)注入sqlSessionFactory

@Bean

@ConditionalOnMissingBean

public SqlSessionTemplatesqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {

ExecutorType executorType =this.properties.getExecutorType();

? ? if (executorType !=null) {

return new SqlSessionTemplate(sqlSessionFactory, executorType);

? ? }else {

return new SqlSessionTemplate(sqlSessionFactory);

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尽爆,一起剝皮案震驚了整個(gè)濱河市怎顾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漱贱,老刑警劉巖槐雾,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饱亿,居然都是意外死亡蚜退,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)彪笼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钻注,“玉大人,你說(shuō)我怎么就攤上這事配猫》担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵泵肄,是天一觀的道長(zhǎng)捆交。 經(jīng)常有香客問(wèn)我,道長(zhǎng)腐巢,這世上最難降的妖魔是什么品追? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮冯丙,結(jié)果婚禮上肉瓦,老公的妹妹穿的比我還像新娘。我一直安慰自己胃惜,他們只是感情好泞莉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著船殉,像睡著了一般鲫趁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上利虫,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天挨厚,我揣著相機(jī)與錄音,去河邊找鬼糠惫。 笑死幽崩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寞钥。 我是一名探鬼主播慌申,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蹄溉?” 一聲冷哼從身側(cè)響起咨油,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎柒爵,沒(méi)想到半個(gè)月后役电,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棉胀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年法瑟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唁奢。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霎挟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麻掸,到底是詐尸還是另有隱情酥夭,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布脊奋,位于F島的核電站熬北,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诚隙。R本人自食惡果不足惜讶隐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望久又。 院中可真熱鬧整份,春花似錦、人聲如沸籽孙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)犯建。三九已至,卻和暖如春瓜客,著一層夾襖步出監(jiān)牢的瞬間适瓦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工谱仪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玻熙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓疯攒,卻偏偏與公主長(zhǎng)得像嗦随,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理枚尼,服務(wù)發(fā)現(xiàn)贴浙,斷路器,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • SpringMVC原理分析 Spring Boot學(xué)習(xí) 5署恍、Hello World探究 1崎溃、POM文件 1、父項(xiàng)目...
    jack_jerry閱讀 1,286評(píng)論 0 1
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,806評(píng)論 6 342
  • 第5章 Spring Boot自動(dòng)配置原理 5.1 SpringBoot的核心組件模塊 首先盯质,我們來(lái)簡(jiǎn)單統(tǒng)計(jì)一下S...
    光劍書(shū)架上的書(shū)閱讀 48,910評(píng)論 5 65
  • 我一直具有留意微小事物的特長(zhǎng)袁串。這是非自詡的事實(shí)。任何人呼巷。任何經(jīng)不經(jīng)意的小動(dòng)作囱修。只要我注意,就記住下去朵逝。漸漸的蔚袍,這些...
    周摧花閱讀 738評(píng)論 0 0