本文转载自本人技术博客:felord.cn 转载请注明出处

1. 前言

Spring Boot 都会有一个名为 xxApplication 的启动类,里面有一个标准的 java 应用的入口 main 方法,用于启动 Spring Boot 应用项目。@SpringBootApplication 是Spring Boot的核心注解,作用在启动类上,在通常情况下Spring Boot在启动时会自动扫描 @SpringBootApplication 所在类的同级包及下级包里的所有 Bean 。为什么一个小小的注解就能发挥这么大的作用?今天我们来一探究竟。

2. @SpringBootApplication

我们就从@SpringBootApplication 注解源码开始一步步揭开谜底。看看这个注解都干了什么。

2.1 @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 {

@AliasFor(annotation = EnableAutoConfiguration.class)

Class>[] exclude() default {};

@AliasFor(annotation = EnableAutoConfiguration.class)

String[] excludeName() default {};

@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")

String[] scanBasePackages() default {};

@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")

Class>[] scanBasePackageClasses() default {};

}

@SpringBootApplication 注解是个复合注解,集成了@ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration 三个注解。

2.2 @ComponentScan 注解

Spring里诸如@Service,@Repository,@Component,@Controller等用来向Spring IoC 容器注入bean。@ComponentScan注解就是用来自动扫描被这些注解标识的类,使得这些类被发现并最终注入Spring IoC容器。你也可以通过设置@ComponentScan中的basePackages,includeFilters,excludeFilters属性来动态确定自动扫描包范围和过滤规则。默认情况下:它扫描所有类型,并且扫描范围是@ComponentScan注解所在配置类包及子包的类。

2.3 @EnableAutoConfiguration

@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class>[] exclude() default {}; String[] excludeName() default {};}

这也是个复合注解,该注解可以帮助 Spring Boot 应用将所有符合条件的 @Configuration 配置都加载到当前 Spring Boot 创建并使用的 IoC 容器中。该注解的的核心要属于 @Import(AutoConfigurationImportSelector.class) ,AutoConfigurationImportSelector 是自动配置选择器。其中注解@Import的作用是给容器中导入一个组件。

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { private static final AutoConfigurationEntry EMPTY_ENTRY = new AutoConfigurationEntry(); private static final String[] NO_IMPORTS = {}; private static final Log logger = LogFactory .getLog(AutoConfigurationImportSelector.class); private static final String PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE = "spring.autoconfigure.exclude"; private ConfigurableListableBeanFactory beanFactory; // 环境 private Environment environment; // 类加载 private ClassLoader beanClassLoader; // 资源加载 private ResourceLoader resourceLoader; //----省略方法--------}

该类实现了类加载器,资源加载器,BeanFactoryAware 和 EnvironmentAware,借助 SpringFactoriesLoader 工具类通过类似java SPI查找配置类的功能,实现了从 classpath 中搜寻所有 META-INF/spring.factories 配置文件,并将其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的配置项通过反射实例化为标注了 @Configuration 的配置类,然后汇总加载到Spring IoC 容器。工作流程图为(来源于网络):

2.4 @SpringBootConfiguration 注解

 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }

@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到Spring IoC容器中,并且实例名就是方法名。 特别的是该注解标识这是一个 Spring Boot 项目。

3. 总结

我们简单总结一下Spring Boot的启动步骤。Spring Boot应用启动main方法后执行了一系列事件逻辑(加载环境等等)有兴趣可以去看源码,然后

  1. @SpringBootApplication起作用
  2. @SpringBootConfiguration注入配置
  3. 然后触发了@EnableAutoConfiguration 的作用:
  • 首先@AutoConfigurationPackage这个组合注解。加载AutoConfigurationPackages.Registrar类,Registrar类导入到容器中,而Registrar类作用是扫描主配置类同级目录以及子包,并将相应的组件导入到Spring Boot创建管理的容器中。
  • 然后将AutoConfigurationImportSelector导入到Spring IoC容器中,AutoConfigurationImportSelector作用是通过selectImports方法实现将配置类信息交给SpringFactoriesLoader进行一系列的容器创建过程,具体实现可查看上面的源码。
  1. @ComponentScan 扫描Spring Boot启动类同级以及子包扫描其中的Bean并注入Spring IoC容器。

@import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析相关推荐

  1. @order注解_Spring Boot+OAuth2,一个注解搞定单点登录!

    今日干货 刚刚发表查看:66666回复:666 公众号后台回复 ssm,免费获取松哥纯手敲的 SSM 框架学习干货. 需要先说一下,松哥最近写的教程,都是成系列的,有一些重复的东西写来写去就没意思了, ...

  2. @springbootapplication 注解_Spring Boot最核心的27个干货注解,你了解多少?

    Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringClo ...

  3. autowired注解_Spring系列之Spring常用注解总结

    作者:平凡希来源:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做 ...

  4. flyway常用配置_Spring Boot 2 实战:使用 Flyway 管理你数据库的版本变更

    1. 前言 随着项目的不断迭代,数据库表结构.数据都在发生着变化.甚至有的业务在多环境版本并行运行.数据为王的时代,管理好数据库的版本也成为了迫切的需要.如何能做到像 Git 之类的版本控制工具来管理 ...

  5. springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门

    [小宅按]Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可 ...

  6. enablefeignclients 注解_Spring Boot 中 @EnableXXX 注解的驱动逻辑

    作者 | 温安适 来源 | https://juejin.im/post/5efdd689e51d4534af686ca9 点击赠书:聊聊「分布式架构」那些事儿 工作中经常用到,如下注解: @Enab ...

  7. springboot使用netty容器_Spring Boot 2 实战:使用 Undertow 来替代Tomcat

    1. Undertow 简介 Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制.Undertow 是红帽公司的开源产品,是 Wild ...

  8. 扒一扒 @SpringBootApplication 注解背后的奥秘!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 概 述 Spring Boot的约定大于配置的功力让我们如 ...

  9. @aspect注解类不生效_Spring Boot从入门到精通(三)常用注解含义及用法分析总结...

    Spring Boot是目前非常流行的框架,而注解是Spring Boot的核心功能,接下来主要说一说Spring Boot常用注解的含义以及部分注解在项目中的使用方法. @RestControlle ...

最新文章

  1. 下午就要考试啦~~附上自己做的考试范围
  2. LNMP平台搭建之一:nginx编译安装
  3. python使用字典格式化字符串-python实现字符串和字典的转换
  4. 《浪潮之巅》读书笔记汇总
  5. html fond 怎么居中,BeautifulSoup标签定位方法总结
  6. 谭浩强课后题之----判断闰年
  7. Java中实现多线程的两种方式之间的区别
  8. Luogu 1941 飞扬的小鸟
  9. JS复制内容到剪贴板
  10. 利用11行Python代码,盗取了室友的U盘,内容十分刺激!
  11. Ubuntu系统中利用Sublime分别运行Python与Python3
  12. 【CodeForces - 570A】Elections(模拟,水题)
  13. First C program
  14. 56. 合并区间(javascript)
  15. Akka构建Reactive应用《one》
  16. Linux-install-mysql5.6
  17. HLI测试 涉及书籍
  18. 【2023校招刷题】常见面试问题总结(一、EDA工具及IC整体设计流程篇)(随后续面试不断更新....)
  19. 佳能6d2无线链接计算机操作,玩转EOS 6D无线WiFi功能三步骤
  20. 电源完整性之仿真设计原理

热门文章

  1. Dell Caps Lock 切换大小写被窃取焦点问题解决办法
  2. 新浪uc2010官方下载
  3. 飞鸽传书扫描器 v1.3
  4. 用VC写Assembly代码(2)
  5. 电脑操作者的养生之道
  6. 码农30多岁,要被辞退的时候 怎么办?
  7. 新手程序员如何找一个靠谱的公司
  8. AutoCAD 2021 macOS Big Sur 11版 注册机无法打开?注册机怎么使用?
  9. springboot使用mybatis_使用springboot+mybatis数据库存储服务化
  10. div固定大小文字溢出自动缩小_Figma 教程 | 文字工具