@import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析
本文转载自本人技术博客: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方法后执行了一系列事件逻辑(加载环境等等)有兴趣可以去看源码,然后
- @SpringBootApplication起作用
- @SpringBootConfiguration注入配置
- 然后触发了@EnableAutoConfiguration 的作用:
- 首先@AutoConfigurationPackage这个组合注解。加载AutoConfigurationPackages.Registrar类,Registrar类导入到容器中,而Registrar类作用是扫描主配置类同级目录以及子包,并将相应的组件导入到Spring Boot创建管理的容器中。
- 然后将AutoConfigurationImportSelector导入到Spring IoC容器中,AutoConfigurationImportSelector作用是通过selectImports方法实现将配置类信息交给SpringFactoriesLoader进行一系列的容器创建过程,具体实现可查看上面的源码。
- @ComponentScan 扫描Spring Boot启动类同级以及子包扫描其中的Bean并注入Spring IoC容器。
@import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析相关推荐
- @order注解_Spring Boot+OAuth2,一个注解搞定单点登录!
今日干货 刚刚发表查看:66666回复:666 公众号后台回复 ssm,免费获取松哥纯手敲的 SSM 框架学习干货. 需要先说一下,松哥最近写的教程,都是成系列的,有一些重复的东西写来写去就没意思了, ...
- @springbootapplication 注解_Spring Boot最核心的27个干货注解,你了解多少?
Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务框架SpringClo ...
- autowired注解_Spring系列之Spring常用注解总结
作者:平凡希来源:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做 ...
- flyway常用配置_Spring Boot 2 实战:使用 Flyway 管理你数据库的版本变更
1. 前言 随着项目的不断迭代,数据库表结构.数据都在发生着变化.甚至有的业务在多环境版本并行运行.数据为王的时代,管理好数据库的版本也成为了迫切的需要.如何能做到像 Git 之类的版本控制工具来管理 ...
- springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门
[小宅按]Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可 ...
- enablefeignclients 注解_Spring Boot 中 @EnableXXX 注解的驱动逻辑
作者 | 温安适 来源 | https://juejin.im/post/5efdd689e51d4534af686ca9 点击赠书:聊聊「分布式架构」那些事儿 工作中经常用到,如下注解: @Enab ...
- springboot使用netty容器_Spring Boot 2 实战:使用 Undertow 来替代Tomcat
1. Undertow 简介 Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器,提供包括阻塞和基于 NIO 的非堵塞机制.Undertow 是红帽公司的开源产品,是 Wild ...
- 扒一扒 @SpringBootApplication 注解背后的奥秘!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 概 述 Spring Boot的约定大于配置的功力让我们如 ...
- @aspect注解类不生效_Spring Boot从入门到精通(三)常用注解含义及用法分析总结...
Spring Boot是目前非常流行的框架,而注解是Spring Boot的核心功能,接下来主要说一说Spring Boot常用注解的含义以及部分注解在项目中的使用方法. @RestControlle ...
最新文章
- 下午就要考试啦~~附上自己做的考试范围
- LNMP平台搭建之一:nginx编译安装
- python使用字典格式化字符串-python实现字符串和字典的转换
- 《浪潮之巅》读书笔记汇总
- html fond 怎么居中,BeautifulSoup标签定位方法总结
- 谭浩强课后题之----判断闰年
- Java中实现多线程的两种方式之间的区别
- Luogu 1941 飞扬的小鸟
- JS复制内容到剪贴板
- 利用11行Python代码,盗取了室友的U盘,内容十分刺激!
- Ubuntu系统中利用Sublime分别运行Python与Python3
- 【CodeForces - 570A】Elections(模拟,水题)
- First C program
- 56. 合并区间(javascript)
- Akka构建Reactive应用《one》
- Linux-install-mysql5.6
- HLI测试 涉及书籍
- 【2023校招刷题】常见面试问题总结(一、EDA工具及IC整体设计流程篇)(随后续面试不断更新....)
- 佳能6d2无线链接计算机操作,玩转EOS 6D无线WiFi功能三步骤
- 电源完整性之仿真设计原理