Spring Boot知识点(一)-starter与自动化配置

平时项目中经常使用Spring Boot,却没有时间整理成一个比较系统的知识,这里罗列并总结下Spring Boot相关的知识点。知其然,更知其所以然,写之前,突然想了解一下Spring和Spring Boot的历史,查找资料,顺便记录在此了解一下吧。
2002年,美国小伙子Rod Johnson(还是一位音乐学博士)编写了一本书《Expert One-on-One J2EE》,直指当时J2EE和EJB开发的臃肿和缺陷,并提供了解决依赖注入的更简单的解决方案。书发布之后,开发者 Juergen Hoeller 和 Yann Caroff 就说服了Rod Johnson 创建一个基于基础结构代码的开源项目。Yann 为新框架创造了“Spring”的名字,意味着spring是传统J2EE的新开始。
2004年,Spring 1.0发布。
随着使用 Spring 进行开发的个人和企业越来越多,Spring 也慢慢从一个单一简洁的小框架变成一个大而全的开源软件,Spring 的边界不断的进行扩充,到了后来 Spring 几乎可以做任何事情了,市面上主流的开源软件、中间件都有 Spring 对应组件支持,人们在享用 Spring 的这种便利之后,也遇到了一些问题。Spring 每集成一个开源软件,就需要增加一些基础配置,慢慢的随着人们开发的项目越来越庞大,往往需要集成很多开源软件,因此后期使用 Spring 开发大型项目需要引入很多配置文件,太多的配置非常难以理解,并容易配置出错,到了后来人们甚至称 Spring 为配置地狱。Spring 似乎也意识到了这些问题,急需有这么一套软件可以解决这些问题,这个时候微服务的概念也慢慢兴起,快速开发微小独立的应用变得更为急迫,Spring 刚好处在这么一个交叉点上,于 2013 年初开始的 Spring Boot 项目的研发,2014年4月,Spring Boot 1.0.0 发布。
2014年,Spring Boot 1.0发布。
2004~2014,整整10年。

Spring Boot场景启动器(starter)

Spring Boot将所有功能场景都抽取成一个个starter,我们一般web开发,只需引入spring-boot-starter-web,该starter就导入了web开发相关的jar包。


spring-boot-starter-web

注意到,上面的spring-boot-starter-web并没有写版本号, 因为Spring Boot中maven的pom文件默认继承了spring-boot-starter-parent。


spring-boot-starter-parent

而spring-boot-starter-parent继承了spring-boot-dependencies,其中维护了jar包的版本,包括了spring-boot-starter-web的版本。
spring-boot-dependencies

jar包版本配置


spring-boot-dependencies

Spring Boot自动化配置

通过上面的步骤,Spring Boot已经能够导入开发所需的jar包,那Spring Boot又是怎么为这些jar包配置默认值的呢? 答案就在Spring Boot的启动类上的注解@SpringBootApplication中。

Spring Boot启动类

@SpringBootApplication主要由三个注解构成:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
@SpringBootApplication

@SpringBootConfiguration底层其实是@Configuration,说明是一个配置类。
@SpringBootConfiguration

@ComponentScan则是配置了当前类(启动类)下的所有包到扫描到Spring容器,同时使用FilterType.CUSTOM排除了一些需要类。
@ComponentScan

@EnableAutoConfiguration底层是由两个注解组成,@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)
@EnableAutoConfiguration

@AutoConfigurationPackage其底层,还是一个@Import(AutoConfigurationPackages.Registrar.class),其将会把启动类的包下的组件都扫描到Spring容器中。
@AutoConfigurationPackage

@Import(AutoConfigurationImportSelector.class) 自动配置的奥妙就在这里啦,这个类导入了很多自动配置类,debug一下可以发现,其读取的是classpath下的META-INF/spring.factories下的自动配置类

自动配置类

自动化配置原理

自动配置类如下:


自动配置类

取一个出来看下,可以发现,该类是@Configuration配置类,所以默认的配置都在这里了,但是这些配置类并不是都生效,因为使用了@ConditionalOnClass,需满足一定的条件才会生效配置。


默认配置

Spring Boot自动化配置总结

Spring Boot通过maven中的starter导入了所需场景下的jar包,并通过主启动类上的@SpringBootApplication中的@EnableAutoConfiguration读取了类路径下的META-INF/spring.factories下EnableAutoConfiguration的配置类,但是这些配置类使用了@ConditionalOnClass,需满足一定的条件才会激活配置,这些配置类写入了默认的配置。

自定义Spring Boot场景启动器

既然知道了starter中jar包的导入和@EnableAutoConfiguration工作原理,那么,我们可以自定义一个自己的场景启动器。
夜深了,晚上0点30分了,明天早点起床再继续吧。
继续,首先我们新建一个普通的工程,取名为starter,导入我们需要的jar,然后,为了能自定义配置我们的jar,那么我们总需要有地方给我们写@Configuration配置吧。Ok,新建一个自动化配置工程,在starter工程pom文件中引入。


自定义starter

我们这个工程呢,是一个服务器,可以配置一个端口,默认是80 。如下,新建一个@Configuration配置类,绑定配置文件的myserver.port属性。


@Configuration

再写一个服务类,绑定(打印)这个端口号。
banding端口

既然组件都有了,那把这些组件组合起来,放到spring容器中管理吧,写一个配置类。
bean

大功告成,将autoconfigurationdemo使用maven install到仓库,再starter中就可以引入了。再新建一个测试工程,可以导入starter进行测试,如下。


test

不配置端口时,默认的是80端口,如下:


80端口

配置了端口9090,如图,则绑定到9090端口。
9090配置
配置成功

至此,springboot自动化配置原理大致如上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容