spring boot启动类在哪个位置_解读Spring boot 启动过程工作原理(上)

本文详细解析了Spring Boot核心注解@SpringBootApplication的工作原理,包括@SpringBootConfiguration、@ComponentScan与@EnableAutoConfiguration的作用及相互之间的联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

认识@SpringBootApplication注解

4092ec5ee94b4a1aa6b44eb72bcce710

我们把@SpringBootApplication点进去发现有一下几个注解:

f6990750fae64f52ab22d5fc381f62bd

主要由是 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 三个注解的复合

下面分表说说这三个注解:

@SpringBootConfiguration

这里的@SpringBootConfiguration我们点进去发现是@Configuration,这太熟悉了,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,

这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。本身其实也是一个IoC容器的配置类。

现在SpringBoot官方推荐使用JavaConfig的配置形式,我们基本也不用XML的形式了:

XML是这样的:

 ...

JavaConfig是这样的:

@Configurationpublic class TestConfiguration{ @Bean public TestService testService(){ return new TestServiceImpl(); } } 

任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。

@ComponentScan

这个注解我们也很熟悉,@ComponentScan告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。自动扫描加载组件将这些bean定义加载到IoC容器中;

默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。所有我们要注意SpringBoot这个启动类别放错地方了。

我们写Config配置类是不是经常用到它

a204a1ab9a8d42229355160b79455dc3

@EnableAutoConfiguration

重要角色出场了,我们点击进来

e7cb130eb95442b58ef7345761559bd6

看出有一特殊的注解@Import,@Import(AutoConfigurationImportSelector.class),再点击AutoConfigurationImportSelector进来

db9e72b9e3434095bac901fb1a7baef5

看如下代码,获取类路径下spring.factories下key为EnableAutoConfiguration全限定名对应值

List configurations = getCandidateConfigurations(annotationMetadata,attributes);

继续跟进

ee9f1b92fb3443dd9e037b55cdab55d3

再次跟进

e78efa23715248229cf697c8df0e77cc

是不是就发现了最终是在classpath下的读取META-INF/spring.factories文件的配置,并返回一个字符串数组。

c0977d2abc284f78b79d353b59cc6432

这个外部文件,有很多自动配置的类,以上为Spring Boot中所有的自动配置相关类;在启动过程中会解析对应类配置信息,以MongoDB为例,则会去解析MongoAutoConfiguration

只有spring.boot.enableautoconfiguration为true(默认为true)的时候,才启用自动配置

@EnableAutoConfiguration还可以进行排除,排除方式有2中,一是根据class来排除(exclude),二是根据class name(excludeName)来排除

其内部实现的关键点有

1)ImportSelector 该接口的方法的返回值都会被纳入到spring容器管理中

2)SpringFactoriesLoader 该类可以从classpath中搜索所有META-INF/spring.factories配置文件,并读取配置;

SpringFactoriesLoader配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类

总之@EnableAutoConfiguration从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。

总结:

第一步@SpringBootConfiguration构建bean定义,

第二步@ComponentScan自动扫描加载组件将这些bean定义加载到IoC容器中,

第三步@EnableAutoConfiguration从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器。

8e0a65b33f394c7e8e03fd9d7ac2ab87

请大家指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值