首页
TVP 最新优惠活动
学习
活动
专区
工具
返回腾讯云官网
大家好,又见面了,我是你们的朋友全栈君。
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(Rapid Application Development)成为领导者。
Spring大家都知道,Boot是启动的意思。所以,Spring Boot其实就是一个启动spring项目的一个工具而已。从最根本上来讲,Spring Boot就是一些库的集合,它能够被任意项目的构建系统所使用。
SpringBoot启动整体可分为两步:
想了解SpringBoot的启动原理,首先就要从项目的主启动类入手,说到主启动类那最关键的就是注解@SpringBootApplication
先看下SpringBoot主启动类:
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
再看下@SpringBootApplication
注解的源码:
@Target({
ElementType.TYPE})//注解的适用范围,其中TYPE用于描述类、接口(包括注解类型)或枚举类型
@Retention(RetentionPolicy.RUNTIME)//注解的声明周期,保留到class文件中(三个声明周期)
@Documented//表名这个注解应该被javadoc记录
@Inherited//表名子类可以继承这个注解
@SpringBootConfiguration//继承了@Configuration注解,表示当前类是注解类
@EnableAutoConfiguration//开启SpringBoot的自动注解功能,器主要借助@import注解实现的
@ComponentScan(excludeFilters = {
//扫描路径配置(具体使用待配置)
@Filter(type = FilterType.CUSTOM, classes = {
TypeExcludeFilter.class}),
@Filter(type = FilterType.CUSTOM, classes = {
AutoConfigurationExcludeFilter.class})
}
)
public @interface SpringBootApplication {
...
}
从上述我们可以看出,实际上@SpringBootApplication
是一复合的注解,其中起到主要作用的注解是:
SpringBootConfiguration
:继承了@Configuration注解,表示当前类是注解类@EnableAutoConfiguration
:开启SpringBoot的自动注解功能,器主要借助@import注解实现的@ComponentScan
:扫描路径配置(具体使用待配置)所以我们把主启动类上面的注解写成这三个注解组合的形式其实也是可以的,整个SpringBoot应用依然可以与之前的启动类功能一样:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public class HelloWorldApplication{
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
因为如果我们每次新建项目时都要写上这三个注解来完成配置,这显然太繁琐了,SpringBoot就为我们提供了@SpringBootApplication
这样一个复合注解来简化我们的操作。
我们看下@SpringBootConfiguration注解的源码
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
@SpringBootConfiguration标注在哪个类上说明这是一个主配置类。
SpringBoot为了区别@Configuration
而提供新的专属于SpringBoot的注解SpringBootConfiguration
,在上面我们可以看出SpringBootConfiguration
其实也是基于@Configuration
注解实现的, 配置类也是容器中的一个组件;@Component,而它本身也是Spring容器中的一个配置。
其实了解到这,我们把SpringBoot的启动类来拆成两个类,拆完以后就非常清楚了:
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class HelloWorldConfiguration {
}
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldConfiguration .class, args);
}
}
从上面拆分后我们可以很清晰的看出,其实启动类HelloWorldApplication就是一个标准的StandAlone(独立)类型的Java程序main函数启动类。
看到这我想大家肯定就一下想起了Spring中很多以@Enable
开头的注解,比如:@EnableScheduling:自动调度
、@EnableCaching:自动缓存
以及@EnableMBeanExport:监控JVM运行时状态
等等。
而@EnableAutoConfiguration:开启自动注解
的理念和工作原理和他们是一脉相承。简单的来说该注解是借助@Import
注解的支持来实现的,Spring的IoC容器会收集和注册特定场合相关的Bean实例:
@EnableScheduling自动调度
:是通过@import
将Spring调度框架相关的Bean都加载到IoC容器中。@EnableMBeanExport监控JVM运行时状态
是通过@Import
将JMX相关的Bean定义加载到IoC容器中。@EnableAutoConfiguration开启自动注解
:是通过@Import
将所有复合配置条件的Bean定义加载到IoC容器中,仅此而已。我们看下@EnableAutoConfiguration
注解的源码:
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({
![AutoConfigurationImportSelector.class](https://img-blog.csdnimg.cn/72fda74967224245a0028a2b4552a271.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5LiA5a6_5ZCb,size_20,color_FFFFFF,t_70,g_se,x_16)})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {
};
String[] excludeName() default {
};
}
上述源码的注解中,最关键的@EnableAutoConfiguration
主要就是借助AutoConfigurationImportSelector.class
来帮助SpringBoot应用将所有符合条件的@Configuration
标注的配置类都加载到当前SpringBoot创建并使用的IoC容器中,就像一个收割机
一样,全文搜索配置类:
我们可以看下AutoConfigurationImportSelector.class
类的部分源码:
public class AutoConfigurationImportSelector implements
DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
protected List<AutoConfigurationImportFilter> getAutoConfigurationImportFilters() {
return SpringFactoriesLoader.loadFactories(AutoConfigurationImportFilter.class, this.beanClassLoader);
}
protected List<AutoConfigurationImportListener> getAutoConfigurationImportListeners() {
return SpringFactoriesLoader.loadFactories(AutoConfigurationImportListener.class, this.beanClassLoader);
}
}
从上面我们可以看出,@AutoConfiguration
注解主要是借助于SpringFactoriesLoader工厂加载类
,获取配置类的过滤器和监听器都是通过SpringFactoriesLoader来实现的,那下面让我们来看下什么是SpringFactoriesLoader
:
SpringFactoriesLoader属于Spring框架专属的一种扩展方案,其功能和使用方式类似于Java的SPI方案:java.util.ServiceLoader,它的主要功能就是从指定的配置文件META-INF/spring.factories
中加载配置,spring.factories是一个非常经典的java.properties文件,内容格式是key-value形式,只不过这key以及value都非常特殊,为Java类的完整类名和包名,(Fully qualified name),比如:
com.wbs.service.DemoService = com.wbs.service.impl.DemoServiceImpl
然后Spring框架就可以根据某个类型作为Key来查找对应的类型名称列表了,SpringFactories源码如下:
public final class SpringFactoriesLoader {
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
static final Map<ClassLoader, Map<String, List<String>>> cache = new ConcurrentReferenceHashMap();
}
对于@EnableAutoConfiguration
来说,SpringFactoriesLoader的用途和其本意稍有不同,他本意是为了提供SPI扩展,而在@EnableAutoConfiguration
场景下,它更多的是提供一种配置查找的功能的支持,也就是根据@EnableAutoConfiguration
的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration
作为key来获取一组对应的@Configuration
类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
...
在SpringBoot的AutoConfiguration依赖包中的META-INF文件下的spring.factories文件中,我们可以找到以上内容,这就很好的解释了为什么。
总结来说,@EnableAutoConfiguration
能实现自动配置的原理就是:SpringFactoriesLoader从classpath类路径下去搜寻所有的META-INF/spring.factories文件,并将其中key为org.springframework.boot.autoconfigure.EnableAutoConfiguration
对应的Value配置项通过反射的方式实例化为对应的标注为@Configuration
的JavaConfig形式的IoC容器配置类,然后汇总到当前使用的IoC容器中。
@ComponentScan
注解很重要,它对应XML配置中的元素,@ComponentScan
的功能就是自动扫描并加载符合条件的组件(如@Component和@Repository)
或Bean定义
,最终将这些Bean定义加载到当前使用的IoC容器中。
我们可以通过basePackages
等属性来细粒度的定制@ComponentScan
自动扫描的范围,如果不指定,则默认spring框架实现会从声明@ComponentScan
所在类的package进行递归扫描。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196382.html原文链接:https://javaforall.cn
本文分享自 作者个人站点/博客 前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
玻璃钢生产厂家阜阳佛像玻璃钢雕塑设计嘉兴多彩玻璃钢雕塑订做价格商场春季美陈绿色河南玻璃钢人物雕塑厂家订制沈阳玻璃钢卡通雕塑公司浙江节庆商场美陈焦作哪里有玻璃钢景观雕塑亳州制作玻璃钢雕塑商家报价西宁玻璃钢蔬菜雕塑黄山卡通玻璃钢雕塑定做足球玻璃钢雕塑玻璃钢商业雕塑湛江典雅的玻璃钢雕塑玻璃钢雕塑很贵吗玻璃钢雕塑厂家服务介绍衡水玻璃钢仿真水果雕塑定制云南动物玻璃钢雕塑厂家安阳玻璃钢动物雕塑银川户外玻璃钢雕塑定制婴儿玻璃钢雕塑松原小品系列玻璃钢雕塑价格皇朝玻璃钢雕塑汕头玻璃钢仿砂岩雕塑驻马店玻璃钢商场美陈陕西高质量玻璃钢雕塑供应商浙江莲花玻璃钢雕塑报价明细表河南节庆商场美陈生产厂家装饰商场美陈怎么样代理玻璃钢动画雕塑水果玻璃钢雕塑设计香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万