SpringBoot的自动配置原理
使用SpringBoot之后,一个整合了SpringMVC的WEB工程开发,变的无比简单,那些繁杂的配置都消失不见了,这是如何做到的?
一切魔力的开始,都是从我们的main函数来的,所以我们再次来看下启动类:
我们发现特别的地方有两个:注解:SpringBootApplicationrun方法:SpringApplication。run()
我们分别来研究这两个部分。了解SpringBootApplication
点击进入,查看源码:
这里重点的注解有3个:SpringBootConfigurationEnableAutoConfigurationComponentScan
4。1。1。SpringBootConfiguration
通过这段我们可以看出,在这个注解上面,又有一个Configuration注解。通过上面的注释阅读我们知道:这个注解的作用就是声明当前类是一个配置类,然后Spring会自动扫描到添加了Configuration的类,并且读取其中的配置信息。而SpringBootConfiguration是来声明当前类是SpringBoot应用的配置类,项目中只能有一个。所以一般我们无需自己添加。
4。1。2。EnableAutoConfiguration
关于这个注解,官网上有一段说明:ThesecondclasslevelannotationisEnableAutoConfiguration。Thisannotation
tellsSpringBoottoguesshowyouwanttoconfigureSpring,basedonthejar
dependenciesthatyouhaveadded。SincespringbootstarterwebaddedTomcat
andSpringMVC,theautoconfigurationassumesthatyouaredevelopingaweb
applicationandsetsupSpringaccordingly。
简单翻译以下:
第二级的注解EnableAutoConfiguration,告诉SpringBoot基于你所添加的依赖,去猜测你想要如何配置Spring。比如我们引入了springbootstarterweb,而这个启动器中帮我们添加了tomcat、SpringMVC的依赖。此时自动配置就知道你是要开发一个web应用,所以就帮你完成了web及SpringMVC的默认配置了!
总结,SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。
所以,我们使用SpringBoot构建一个项目,只需要引入所需框架的依赖,配置就可以交给SpringBoot处理了。除非你不希望使用SpringBoot的默认配置,它也提供了自定义配置的入口。
4。1。3。ComponentScan
我们进源码
并没有看到什么特殊的地方。我们查看注释:
大概的意思:配置组件扫描的指令。提供了类似与标签的作用
通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性,那么将从声明这个注解的类所在的包开始,扫描包及子包
而我们的SpringBootApplication注解声明的类就是main函数所在的启动类,因此扫描的包是该类所在包及其子包。因此,一般启动类会放在一个比较前的包目录中。默认配置原理:
4。2。1默认配置类
通过刚才的学习,我们知道EnableAutoConfiguration会开启SpringBoot的自动配置,并且根据你引入的依赖来生效对应的默认配置。那么问题来了:这些默认配置是在哪里定义的呢?为何依赖引入就会触发配置呢?
其实在我们的项目中,已经引入了一个依赖:springbootautoconfigure,其中定义了大量自动配置类:
还有
非常多,几乎涵盖了现在主流的开源框架,例如:redisjmsamqpjdbcjacksonmongodbjpasolr
elasticsearch
我们来看一个我们熟悉的,例如SpringMVC,查看mvc的自动配置类:
打开WebMvcAutoConfiguration:
我们看到这个类上的4个注解:Configuration:声明这个类是一个配置类ConditionalOnWebApplication(typeType。SERVLET)ConditionalOn,翻译就是在某个条件下,此处就是满足项目的类是是Type。SERVLET类型,也就是一个普通web工程,显然我们就是ConditionalOnClass({Servlet。class,DispatcherServlet。class,WebMvcConfigurer。class})这里的条件是OnClass,也就是满足以下类存在:Servlet、DispatcherServlet、WebMvcConfigurer,其中Servlet只要引入了tomcat依赖自然会有,后两个需要引入SpringMVC才会有。这里就是判断你是否引入了相关依赖,引入依赖后该条件成立,当前类的配置才会生效!ConditionalOnMissingBean(WebMvcConfigurationSupport。class)这个条件与上面不同,OnMissingBean,是说环境中没有指定的Bean这个才生效。其实这就是自定义配置的入口,也就是说,如果我们自己配置了一个WebMVCConfigurationSupport的类,那么这个默认配置就会失效!
接着,我们查看该类中定义了什么:
视图解析器
处理器适配器(HandlerAdapter)
还有很多,这里就不一一截图了。
4。2。2。默认配置属性
另外,这些默认配置的属性来自哪里呢?
我们看到,这里通过EnableAutoConfiguration注解引入了两个属性:WebMvcProperties和ResourceProperties。这不正是SpringBoot的属性注入玩法嘛。
我们查看这两个属性类:
找到了内部资源视图解析器的prefix和suffix属性。
ResourceProperties中主要定义了静态资源(。js,。html,。css等)的路径:
如果我们要覆盖这些默认属性,只需要在application。properties中定义与其前缀prefix和字段名一致的属性即可。4。3。总结
SpringBoot为我们提供了默认配置,而默认配置生效的条件一般有两个:你引入了相关依赖你自己没有配置
1)启动器
所以,我们如果不想配置,只需要引入依赖即可,而依赖版本我们也不用操心,因为只要引入了SpringBoot提供的stater(启动器),就会自动管理依赖及版本了。
因此,玩SpringBoot的第一件事情,就是找启动器,SpringBoot提供了大量的默认启动器,参考课前资料中提供的《SpringBoot启动器。txt》
2)全局配置
另外,SpringBoot的默认配置,都会读取默认属性,而这些属性可以通过自定义application。properties文件来进行覆盖。这样虽然使用的还是默认配置,但是配置中的值改成了我们自定义的。
因此,玩SpringBoot的第二件事情,就是通过application。properties来覆盖默认属性值,形成自定义配置。我们需要知道SpringBoot的默认属性key,非常多,参考课前资料提供的:《SpringBoot全局属性。md》
五问广汽埃安混改,洪流下不进则退关注并标星电动星球News每天打卡阅读更深刻理解汽车产业变革大概10天前,广汽集团发布了一则公告。表示拟通过对新能源汽车研发能力及业务、资产的重组整合,推进广……
专业游戏手机排名,这三款品牌深受大家喜爱,你认识多少现在的手机牌子多种多样,性能也是各有异处。有些适合打游戏,有些就不太适合,每一年都有统计数据出专业游戏手机品牌排名,你知道哪款手机在排行榜前几吗?不知道的话就快来看看下文,小编……
凌晨突发!两船碰撞,12人失联!8月30日凌晨,福建泉州深沪籍渔船闽晋渔05119在距平潭岛正东45海里海域沉没,渔船上14人遇险,两名船员被周边作业渔船闽晋渔05769救起,另外12名船员失联。福建省……
余承东评价华为Mate40Pro,网友用雷军名言回复!缺德华为每一代的Mate系列手机和p系列手机都是顶级的旗舰,销量自然是不用担心,更重要的是热度能够一直保持下去,也是目前国产手机中唯二的高端机。不过,mate40系列作为一款去年1……
浅谈自动变速箱的L档S档都有什么作用如今自动变速箱逐渐被市场所接受,毕竟交通越来越堵,走走停停是家常便饭,开手动波箱确实很遭罪,一些新手更会显得手忙脚乱,所以这个拥堵的时代,向自动变速箱妥协也是一种必然。当我们过……
挂增幅装置,外星人AW510H耳机AW521BR蓝牙接收器众所周知外星人Alienware品牌在业界是高端和顶级的代名词,旗下的产品也都有着非常个性独特的造型。最近接触到了外星人旗下一套通过悬挂外接装置,对有线耳机进行蓝牙无线升级的组……
瑞福德系严管办公用品领用,有助于降低企业成本很多企业在企业管理过程当中并不注意办公用品的领用,特别是对于一些低值易耗的办公用品,更是格外轻视。认为一支笔一个本的成本很低,员工即使多领几个能有什么成本呢?殊不知这样的想法是……
会用光用好光,洋葱工厂布朗尼摄影灯套装体验摄影是用光的艺术,想必你已经听过这句话了。光是影响照片氛围感的重要因素,充足的光线能够最大程度发挥相机性能,好的摄影师总是在第一时间找到合适的光线。如果光线不足,或者需要特殊光……
制造业的云服务器如何选?【新网云资讯】在5G、物联网、人工智能等技术的应用下,产品实体正在成为数字化服务的载体。这也使得越来越多的数据产生在远离数据中心的边缘端,促使企业IT向着边缘端延伸来提供智能服……
IT精英巅峰对决,智慧点亮软件之光IT精英巅峰对决,智慧点亮软件之光大连高新区首届IT职业技能大赛举行决赛暨颁奖典礼5月31日,大连高新区首届IT职业技能大赛决赛暨颁奖典礼在高新区创业DNA咖啡厅举……
蝴蝶兰花期后的修剪方法,如何才能更快的复花?蝴蝶兰开花特别漂亮,就像一朵朵各色的蝴蝶在枝条上翩翩起舞,而且它的花朵很大,花色艳丽,而且花期很长,所以也深受人们的喜爱,在春节是很重要的年宵花。蝴蝶兰开完花之后,要把它的花梗……
教育部新增37个本科专业!这一领域涉及的最多!原子同学教育部3月1日公布2020年度普通高等学校本科专业备案和审批结果的通知。在经过对高等学校专业设置与教学指导委员会评议后,于日前确定了同意设置的备案专业、国家控制布点专业和新增目……