游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

深入理解springboot的自动注入

  一、开篇
  在平时的开发过程中用的最多的莫属springboot了,都知道springboot中有自动注入的功能,在面试过程中也会问到自动注入,你知道自动注入是怎么回事吗,springboot是如何做到自动注入的,自动注入背后的原理是什么,今天来分析下springboot的自动注入,希望这篇文章可以解除大家心中的疑惑。二、详述2。1、什么是自动注入
  天天将自动注入,你真正明白自动注入是怎么回事吗?举个例子来说,我们要在springboot中使用mybatis,之前的做法是什么?
  1、引入依赖;
  2、在配置文件中配置配置类;
  3、写mybatis的配置文件或注解;
  在springboot中这个步骤就减少了,减少的是第二步,不用再写一堆配置类了,步骤简化为:
  1、引入依赖;
  2、写mybatis的配置文件或注解;
  也就是说无需再搞配置类了,就比如之前的SqlSessionFactoryBean,现在不用配置了,springboot为我们做了这些工作,现在看springboot引入mybatis需要加入的依赖,!mybatis的依赖dependencygroupIdorg。mybatis。spring。bootgroupIdmybatisspringbootstarterartifactIdversion2。1。3versiondependency!mysql的驱动程序dependencygroupIdmysqlgroupIdmysqlconnectorjavaartifactIdversion8。0。26versiondependency
  我们加入mybatis和数据库的驱动依赖,因为mybatis要使用数据库连接,所以这里少不了mysql的数据库驱动。重点看mybatis的这个依赖和之前的是不一样的,这个是mybatisspringbootstarter,再看这个依赖中都有哪些jar,
  除了常见的mybatis及mybatisspring还有一个mybatisspringbootautoconfigure,这个就是今天的主角。2。2、springboot读取spring。facotries文件(可跳过该节)
  前边说到今天的主角是mybatisspringbootautoconfigure,其实还有很多这样的依赖,大多数第三方自己实现的都会有这样一个依赖比如,前边自己实现的starter中就有这样一个customerspringbootautoconfigurer,还有很多都是springboot自己实现的,所以无需这样的依赖。
  要想知道springboot是如何进行自动注入的,唯一的方式是debug,现在开始debug之旅吧。2。2。1、SpringApplication构造方法
  springboot的启动很简单,就是下面这样一行代码SpringApplication。run(BootServer。class);
  要跟着这样一行代码走下去,追踪到了这样一句,publicstaticConfigurableApplicationContextrun(Classlt;?〔〕primarySources,String〔〕args){returnnewSpringApplication(primarySources)。run(args);}
  可以看的会new一个SpringApplication的实例,然后再调用其run方法,先看下new方法做了什么,最终调用的是下面的构造方法,publicSpringApplication(ResourceLoaderresourceLoader,Classlt;?。。。primarySources){this。resourceLoaderresourceLoader;Assert。notNull(primarySources,PrimarySourcesmustnotbenull);this。primarySourcesnewLinkedHashSet(Arrays。asList(primarySources));this。webApplicationTypeWebApplicationType。deduceFromClasspath();设置初始化器,很重要setInitializers((Collection)getSpringFactoriesInstances(ApplicationContextInitializer。class));设置监听器,很重要setListeners((Collection)getSpringFactoriesInstances(ApplicationListener。class));this。mainApplicationClassdeduceMainApplicationClass();}
  我在上面做了注释,重点看注释部分的代码;2。2。2、setInitializers()方法
  该方法从方法名上看是要设置初始化器,其中getSpringFactoriesInstances(ApplicationContextInitializer。class)是重点。其方法定义如下,privateTCollectionTgetSpringFactoriesInstances(ClassTtype,Classlt;?〔〕parameterTypes,Object。。。args){ClassLoaderclassLoadergetClassLoader();UsenamesandensureuniquetoprotectagainstduplicatesSpringFactoriesLoader。loadFactoryNames是重点SetStringnamesnewLinkedHashSet(SpringFactoriesLoader。loadFactoryNames(type,classLoader));ListTinstancescreateSpringFactoriesInstances(type,parameterTypes,classLoader,args,names);AnnotationAwareOrderComparator。sort(instances);returninstances;}
  看SpringFactoriesLoader。loadFactoryNames方法,publicstaticListStringloadFactoryNames(Classlt;?factoryType,NullableClassLoaderclassLoader){StringfactoryTypeNamefactoryType。getName();loadSpringFactories(classLoader)方法是重点returnloadSpringFactories(classLoader)。getOrDefault(factoryTypeName,Collections。emptyList());}
  把断点放在loadSpringFactroies方法内,
  从上面的debug结果可以看到使用AppClassLoader读取FACTORIESRESOURCELOCATION处的资源,AppClassLoader大家都很熟悉,就说应用类加载器,常量FACTORIESRESOURCELOCATION指的是,Thelocationtolookforfactories。pCanbepresentinmultipleJARfiles。publicstaticfinalStringFACTORIESRESOURCELOCATIONMETAINFspring。factories;
  jar下的METAINFspring。factories文件,也就是说要读取项目中jar包中的METAINFspring。factories文件的内容,我在springboot2。3。3。RELEASE。jar中找到这样一个文件,仅截个图,详细内容可以自己查看,
  可以看到是一些列的键值对,我们看下loadSpringFactories方法最后的返回值,
  这个返回值是,项目中所有jar下METAINFspring。factories文件中的键值对组成的map。回到loadFactoryNames方法处
  该方法需要的是key为org。springframework。context。ApplicationContextInitializer的value,该value的值有这样7个
  这样我们把setInitializers方法就分析完了,其主要就是从jar包中的METAINFspring。factories文件中获取org。springframework。context。ApplicationContextInitializer对应的值。下面看setListeners方法2。2。3、setListeners()方法
  该方法和setInitializers方法是类似的,
  重点是其参数不一样,该方法的参数是ApplicationListener。class,也就是要找出org。springframework。context。ApplicationListener在spring。factories中的配置,
  本人核实过这些的确是从spring。factories文件中读取的,和其内容是一致的。
  写到这里其实和自动注入没有关系,如果说有关系的话是,这里认识了一个关键的类SpringFactoriesLoader,该类的作用就是读取jar包中METAINFspring。facotries文件的内容。在后边的自动注入中还会出现该类的影子。继续向前。2。3、自动注入的原理2。3。1、SpringBootApplication注解
  在启动springboot程序的时候在程序的入口都会有写上SpringBootApplication的注解,packagecom。my。template;importorg。springframework。boot。SpringApplication;importorg。springframework。boot。autoconfigure。SpringBootApplication;启动类date20226321:32SpringBootApplicationpublicclassBootServer{publicstaticvoidmain(String〔〕args){try{SpringApplication。run(BootServer。class);}catch(Exceptione){e。printStackTrace();}}}
  看下该注解的定义,
  在该注解上还有SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三个注解,今天重点看EnableAutoConfiguration注解。2。3。2、EnableAutoConfiguration注解
  该注解便是自动注入的核心注解,
  重点是该注解上的下面这句话,Import(AutoConfigurationImportSelector。class)
  看下AutoConfigurationImportSelector类,该类中有这样一个方法,和自动注入是相关的,protectedListStringgetCandidateConfigurations(AnnotationMetadatametadata,AnnotationAttributesattributes){ListStringconfigurationsSpringFactoriesLoader。loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Assert。notEmpty(configurations,NoautoconfigurationclassesfoundinMETAINFspring。factories。Ifyouareusingacustompackaging,makesurethatfileiscorrect。);returnconfigurations;}
  很属性的SpringFactoriesLoader类又出现了,还是很熟悉的loadFactoryNames方法,这次的方法参数是getSpringFactoriesLoaderFactoryClass()方法,Returntheclassusedby{linkSpringFactoriesLoader}toloadconfigurationcandidates。returnthefactoryclassprotectedClasslt;?getSpringFactoriesLoaderFactoryClass(){returnEnableAutoConfiguration。class;}
  所以SpringFactoriesLoader。loadFactoryNames是要从METAINFspring。factories中获取key为org。springframework。boot。autoconfigure。EnableAutoConfiguration的value,这里可以看到有很多,从中还可以找到我自定义的和myatis的。
  也就是说要把这些配置类加到spring的容器中。现在有个问题这些配置都会生效吗?2。3。3、这些配置类都会生效吗?
  上面说到自动配置会加载很多的配置类,但是这些类都会生效吗?答案是不会的,只会在特定情况下生效,以MybatisAutoConfiguration为例,
  可以看的该类上有很多注解,
  ConditionalOnClass,当类路径中存在某个类标识该注解的类才会生效,也就是只有存在SqlSessionFactory、SqlSessionFactoryBean才会解析MybatisAutoConfiguration类。换句话说,要有mybatis、mybatisspring的jar包。
  ConditionaleOnSigleCanidate,需要一个单例bean
  EnableConfigurationProperties读取配置文件,也就是application。properites
  AutoConfigureAfter自动配置在某个类之后
  现在我们知道了一个XXAutoConfiguration类是否会生效还要看其上面的注解是怎么定义的。三、总结
  本文主要分析了springboot的自动注入原理,
  1、注解SpringBootApplication中含有三个注解,其中EnabelAutoConfiguration和自动配置有关;
  2、EnableAutoConfiguration会读取所有jar下METAINFspring。factories文件的内容,获取org。springframework。boot。autoconfigure。EnableAutoConfiguration的配置,把这些配置注入到容器;
  3、EnableAutoConfiguration注入的类是否生效,需要看其上面的注解,主要配合ConditionaleXXX注解使用;

OPPO系统迎来大升级?Coloros13首发体验视频加载中。。。记者王公逸手机参数决定消费决策,但想要增加粘性,系统才是一部手机的灵魂。就在8月30日,OPPO推出了全新系统:Coloros13。在诸多方面……场均18分,维金斯终有一日,也会成为联盟的传奇我记得有人说过,如果一个球员连续四年的优势都是有潜力的话,那这个球员基本就没有希望了。有潜力,就代表你现在没有实力。所以这只是一句场面话。但是这个定理在嘴哥身上好像不是很有用,……孔乙己的长衫,穿在谁的身上?学历不但是敲门砖,也是我下不来的高台,更是孔乙己脱不下的长衫。学历是敲门砖没错,但并不是我下不来的高台,或者说,我从没觉得那是什么高台,更别说什么脱不下的长衫。当代……辉煌冬奥主题展览讲述一个关于冬奥文化遗产的故事距离北京冬奥会成功举办已经过去一年,在一年后的今天,当人们再次看到记录着冬奥会精彩瞬间的一张张照片、蕴含着中国传统文化之美的冬奥火炬、有着独特设计的冬奥奖牌、冬奥冠军夺冠时所穿……官翻机是个好生意,但只有苹果做出了知名度前阵子,苹果发布了iPad10。对这样一款非常有争议性的产品,雷科技编辑部的小伙伴们自然毫不客气,纷纷开炮吐槽。在一番讨论后,我们都得出了它不是很值得买的结论。而且,还有……战舰世界航母如何玩,全球同步震撼推出S系航母每一个航母玩家在进入战局后,都要面临当团队保姆还是输出中坚的选择问题。这个问题的本质是航母应该权衡什么时候该去抓驱逐,什么时候该去帮队友打输出的问题。随着硬核军武游戏《战舰世界……八马茶业教你如何将铁观音品出茶韵第一次觉得铁观音非凡美妙,是在十年前的一个盛夏。当时的我,背着背包约了三五好友,去山里徒步。盛夏时节,南方的气温特高,我们一行人,走在华东天目山脉中,是靠着耳边淙淙的流水声和山……法甲乌纳希建功,南特主场02不敌马赛北京时间2023年2月2日2时,法甲第21轮,南特在主场迎接马赛的挑战。半场结束,两队半场均无建树,比分维持00。来到下半场比赛,比赛第57分钟,南特球员维克多不慎自摆乌龙,将……最是难忘少年时第五建平几天前,我随艺术家采风团乘坐了一次动车。列车上,大伙对如今出行的方便快捷交口称赞,并畅谈不同时期乘坐火车的经历。我坐在车窗边,看着在蒙蒙细雨中闪过的风景,想起了自……可燃冰也许会替代石油,中国储存量世界第一,为何大量进口石油?在大海深处,埋着一种神奇的冰,它可以燃烧,将封印的远古能量释放出来,这就是可燃冰!燃烧的可燃冰可燃冰,冰如其名,有望成为未来取代石油的能源。我国是全世界可燃冰……今日大寒,记得吃2味,喝2样,忌2事,养好身体,迎春接福今日起中东部会有大范围的雨雪天气。今日也就是大寒了,大寒冷了好啊。不是有句谚语是这么说的嘛:大寒寒得透,来年春日暖还有说大寒天日暖,寒到二月满。因此大寒当日非常冷才是顺应……首个人机共创大会来袭,百度诸多黑科技背后是怎样的大格局?过去一年里,AIGC(人工智能自动生成内容)成为科技行业内外大火的话题。输入一句简短的话,AI就能画出一幅精美的画作;给出一个指令,AI就能写出不输人类水准的大段文字。就在人们……
杨丞琳真大胆,五五分造型配死亡刘海,网友这时尚真心不懂一说起台湾偶像剧女神,杨丞琳肯定少不了,90后的童年回忆之一,当年看得津津有味。而且浙西台湾女神真的很会保养,90后都长大成年了,她们也没变老多少,杨丞琳被称为是可爱教主。虽然……航班信息丨西藏各机场9月8日航班情况提示尊敬的各位旅客:2022年9月8日,西藏各机场计划执行进出港航班8架次,具体如下:一、拉萨贡嘎机场(一)出港航班1。航班号:四川航空3U8634拉……韩系旗舰轿车即将全新上市,帅过亚洲龙,谁还买凯美瑞?在国内的中型轿车市场,德系双雄和日系三强长期占据着市场的主导位置,并且随着这些车型相继更新换代,继续拿出较为强势的市场表现。而除了这些车型,现代索纳塔也曾经创造出辉煌的成绩,在……华为怎么样今天更想借着HuaweiMate10发布的时机,说说所谓智慧手机,是概念还是真实的存在这个话题。最初看见智慧手机这个名词的时候,我的内心是有点不屑的。商业化品牌总会时不时……租赁假结婚花钱过户换取京牌这几招都不靠谱在一线城市买车实在不是件简单的事,比如在北京。原因在于一牌难求!北京车牌生意火爆最近一次北京市小客车摇号公布的数据显示,2367人抢一个普通车指标,难度创历史新高。……刚拿到驾照,有必要买好车吗?直接买新车,不建议买二手车,没必要,而且更浪费钱。我是拿了驾照两年后买的新车,我的技术可能比刚拿驾照的新手司机都还菜,因为两年过去了,我早把当年在驾校学的理论以及实操几乎忘得一……划重点!自驾游,这些事你一定要知道!在秋高气爽美景无限的秋季自驾去感受初秋的美好一辆车三五好友换个地方玩手机哦!不是旅行!你准备好了吗?道路千万条,安全第一条!1。选择正……有没有公认质量最好的SUV推荐?我这三个月试驾过47款SUV,可以给你最中肯的意见!干货满满,绝对不会让你失望!NO。1,劳斯莱斯库里南。这款车做工细致,整车豪华,也有很多前沿科技和人工智能的元素在。驾……可不可以推荐一款落地30万左右,刹车40米内,麋鹿80以上,2040万车型初步了解如下第一,福特锐界,这台车我是2017年去店看过,当时顺路看的都是中大型suv,包括大众途昂,丰田汉兰达,本田冠道。这台车外观一般,内饰也一般,没有……奥运知识科普互动哪届奥运会被称为跨越两洲的大赛?奥运知识科普互动被称为跨越两洲的大赛?奥运会哪届奥运会被称为跨越两洲的大赛?各位朋友们,大家好。我是厦门奥林匹克博物馆志愿者陈昱含,今天为大家带来的奥运知识科……红旗汽车作为国产车的劳斯莱斯,以后能否成为国民神车?红旗汽车车型覆盖面越来越全面,除了大家熟知的轿车H5,H7,H9,城市SUV车型HS5,HS7纯电动大型SUV车型EHS9等!又在西藏看见红旗新车型测试,属大型SUV车型!非常……一切办完落地上路在8万之内,要自动挡省油毛病少的家用车,有哪宗瑞说车,实话实说。帮助头条朋友们选车,算车,聊车。有汽车问题的朋友们,可以加我好友并邀请我回答。宗瑞肯定知无不言,言无不尽。随着生活水平的提高,很多家庭都打算买一辆小车……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网