目录

  • 绪论
  • 源码
    • @SpringBootApplication
    • @EnableAutoConfiguration
  • 总结

绪论

  • 什么是SpringBoot?
    Spring Boot 是所有基于 Spring 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不知道这样比喻是否合适)。

  • SpringBoot四个主要特性

  1. SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;
  2. 自动配置:SpringBoot的自动配置特性利用了Spring4对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们;
  3. 命令行接口:(Command-line-interface, CLI):SpringBoot的CLI发挥了Groovy编程语言的优势,并结合自动配置进一步简化Spring应用的开发;
  4. Actuatir:它为SpringBoot应用的所有特性构建一个小型的应用程序。但首先,我们快速了解每项特性,更好的体验他们如何简化Spring编程模型。

Springboot遵循“约定优于配置”的原则,使用注解对一些常规的配置项做默认配置,减少或不使用xml配置,让你的项目快速运行起来。Springboot还为大量的开发常用框架封装了starter,如今引入框架只要引入一个starter,你就可以使用这个框架,只需少量的配置甚至是不需要任何配置。

源码

@SpringBootApplication

一切缘起@SpringBootApplication注解。@SpringBootApplication注解是SpringBoot的核心注解。目前实际项目开发中,该注解标注的类为主启动类,即运行如下代码的main方法作为入口,一般在main方法中使用SpringApplication.run()来启动整个应用。

@SpringBootApplication
public class InformalEssayApplication {public static void main(String[] args) {SpringApplication.run(InformalEssayApplication.class, args);}}

@SpringBootApplication是一个复合注解或派生注解。下面我们跟进该注解,细品它的核心组成。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {//省略详细方法
}

实际开发项目中定义变量名时,一般要求大家见名知意,因此针对本篇文章的主题:自动化配置,那么从上面代码中我们可以找到对应的注解即@EnableAutoConfiguration.

@EnableAutoConfiguration

这个注解也是一个派生注解,其中的关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};}

这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示:

总结

综合以上,可以理解为@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(…)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

SpringBoot总结之浅析自动化配置原理相关推荐

  1. SpringBoot自动化配置之一:SpringBoot内部的一些自动化配置原理

    springboot用来简化Spring框架带来的大量XML配置以及复杂的依赖管理,让开发人员可以更加关注业务逻辑的开发. 比如不使用springboot而使用SpringMVC作为web框架进行开发 ...

  2. Spring Boot的自动化配置原理

    转载自 Spring Boot的自动化配置原理 随着Ruby.Groovy等动态语言的流行,相比较之下Java的开发显得格外笨重.繁多的配置.低下的开发效率.复杂的部署流程以及第三方技术集成难度大等问 ...

  3. SpringBoot自动化配置原理

    SpringBoot的出现,得益于"习惯优于配置"的理念,没有繁琐的配置.难以集成的内容(大多数流行第三方技术都能被集成),这是基于Spring 4.x提供的条件配置Bean的能力 ...

  4. SpringBoot自动化配置之一:SpringBoot内部的一些自动化配置入门介绍

    springboot用来简化Spring框架带来的大量XML配置以及复杂的依赖管理,让开发人员可以更加关注业务逻辑的开发. 比如不使用springboot而使用SpringMVC作为web框架进行开发 ...

  5. springboot thymeleaf 引入jquery_超详细实战:SpringBoot高级之autoconfigure自动化配置

    本篇课程分为概念和实战内容.代码私信: 005获取. 通读全文大概需要五分钟 不知道用过SpringBoot的同学,有没有发现在SpringBoot的maven依赖中经常会有很多的starter之类的 ...

  6. 注解不自动导包_玩转SpringBoot2.X:SpringBoot自动配置原理大揭秘

    我们在使用SpringBoot的时候,是不是觉得特方便,根本不需要我们去配置什么端口号,应用名称,又比如我们再整合redis的时候,其实也不需要我们去指定端口号,IP,都会有默认的.是不是特方便.那么 ...

  7. 《Spring源码深度解析 郝佳 第2版》SpringBoot体系分析、Starter的原理

    往期博客 <Spring源码深度解析 郝佳 第2版>容器的基本实现与XML文件的加载 <Spring源码深度解析 郝佳 第2版>XML标签的解析 <Spring源码深度解 ...

  8. springBoot国际化多语言开发配置,中文OR英文支持一键切换

    springBoot有许多的自动化配置,其中就包括多语言的autoConfiguration,打开org.springframework.boot.autoconfigure.context.Mess ...

  9. SpringBoot面试杀手锏——自动配置原理

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/u014745069/ article/details/83820511 引言 不论在工作中,亦或 ...

最新文章

  1. python06-集合和序列
  2. Gurobi Optimizer的安装教程
  3. java query类是什么类_java – 从包生成QueryDsl Q类
  4. 【运营】运营高手的“葵花宝典”,你就是下一个东方不败
  5. web3 0.2.x 和 1.x.x版本之间的差异
  6. django开源电子文档管理系统_Python实操技术分享:Django文件管理系统,Apple的学习思路...
  7. 看懂架构设计中的服务隔离
  8. 2021年山西副高考试成绩查询,中国卫生人才网2021年山西卫生资格考试成绩查询...
  9. Discuz!NT实际安装流程
  10. Disruptor高性能缓存队列入门指导
  11. 群色散 matlab,科学网—MATLAB软件绘制一维双原子晶格的格波色散曲线 - 李金磊的博文...
  12. 开源众包-项目大厅数据爬取
  13. Linux下OpenCV摄像头录像(c++)
  14. 20190321——Python模块
  15. DB9公头母头的定义
  16. flutter rpx屏幕适配方案
  17. 这辈子你会遇见谁,早已命中注定
  18. Linux上编译curl
  19. java 图像合成加相框_合成走进相框人物照片效果的PS教程
  20. 2021年新版CDA LEVELⅠ 模拟题(二)

热门文章

  1. 光纤通道(FC: Fibre Channel)
  2. Linux查看和控制进程
  3. 收获,不止SQL优化——抓住SQL的本质--第十一章
  4. css选择指定class的元素
  5. Assemby 打包并启动jar包
  6. 计算机更新阶段,较旧的计算机开始自动升级到Windows10 2004版
  7. 实战:基于RabbitMQ的TTL以及死信队列,实现延迟付款,手动补偿案例
  8. logstash-input-jdbc 同步mysql数据到es
  9. java数据结构之折半查找
  10. web 自动化测试 selenium基础到应用(目录)