springboot 原理

spring boot 为什么加了@SpringbootApplication注解就是启动类?

因为@SpringbootApplication注解包含了3个注解:
    1.@ComponentScan
    2.@SpringBootConfiguration
    3.@EnableAutoConfiguration

@ComponentScan

@ComponentScan注解等同于
    <context:component-scan package="" />
    我们没有设置package,是因为@ComponentScan这个注解配合
    @EnableAutoConfiguration进行自动扫描,
    扫描启动类所在包及其子包下所有springIOC注解.
    所以,我们需要把启动类放在根目录下

@EnableAutoConfiguration

含义:
    开启自动配置
    自动配置是SpringBoot的一个特性,
    可以根据classpath中的jar依赖,自动注册bean
    
我们点开这个注解查看源代码得知:
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {...}
中有一个@Import(AutoConfigurationImportSelector.class)这个最为重要
可以帮助springboot应用将所有符合条件的@Configuration配置都加载到当
前springboot创建并使用的IOC容器中

AutoConfigurationImportSelector类

点开@Import(AutoConfigurationImportSelector.class)进入类中,
我们可以看导入了import org.springframework.core.io.support.SpringFactoriesLoader;

看到这个我们就可以得知,springboot应用是借助spring框架的一个工具类SpringFactoriesLoader
来真正实现智能的自动配置.

怎么自动配置?

翻看源码得知:
List<String> configurations = SpringFactoriesLoader
.loadFactoryNames(getSpringFactoriesLoaderFactoryClass()

通过SpringFactoriesLoader.loadFactoryNames()来加载所有注入的bean

核心:
    1.从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
    (查看桌面本地图片)
    2.去重,并将exclude和excludeName属性携带的类排除;
    3.过滤,将满足条件(@Conditional)的自动配置类返回;

@SpringBootConfiguration

含义: 定义该类为配置类
继承自Spring的@Configuration
如果这个类被这个注解或@Configuration注解标记,则表示该类为配置类
会自动扫描标记了@Bean的方法,自动注册到springIOC容器中,并且实例名就是方法名

springboot的启动流程

public static void main(String[] args) {
    SpringApplication.run(SBMApplication.class,args);
  }
  
  进入run方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值