SpringBoot启动原理(一)

    原文出处:Springboot 启动原理详细解析 - jstarseven - 博客园

    开发任何一个SpringBoot项目,都需要一个启动类

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

一、关于@SpringBootApplication

        @SpringBootApplication是一个组合注解,其中最重要的分别是:@SpringBootConfiguration(本质上是一个@Configuration)、@EnableAutoConfiguration、@ComponentScan。

即@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan

1、@Configuration

        它就是JavaConfig形式下的那个@Configuration,所以,这个启动类本质上也是一个Spring的IOC容器配置类

        JavaConfig配置下的两个注解:参考XML配置与Java配置_m0_50043893的博客-CSDN博客

2、@ComponentScan

        @ComponentScan注解的作用是自动扫描并加载符合条件的组件或者bean,并将他们加载到IOC容器中

        我们可以通过注解里包含的basePackages等属性来定制扫描的范围,如果不指定,则默认从声明@ComponentScan所在类的package里面找。

        所以,SpringBoot启动类最好放在根目录下。

3、@EnableAutoConfiguation

        Spring也提供了其他Enable开头的注解,例如@EnableCaching

        @EnableAutoConfiguration简单概括就是借助@Import,收集和注册特定场景相关的bean定义

        @EnableAutoConfiguration会根据类路径中的jar依赖为项目进行自动配置,如:添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,Spring Boot会对Tomcat和Spring MVC进行自动配置。

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    ...
}

        @EnableAutoConfiguration作为一个复合注解,其中最关键的注解为@Import(EnableAutoConfigurationImportSelector.class),它借助于Spring原有的工具类SpringFactoriesLoader,可以帮助SpringBoot将所有符合条件的@Configuration配置都添加到当前SpringBoot创建并使用的IOC容器。

自动配置幕后英雄:SpringFactoriesLoader详解

SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。

public abstract class SpringFactoriesLoader {
    //...
    public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {
        ...
    }


    public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
        ....
    }
}

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

上图就是从SpringBoot的autoconfigure依赖包中的META-INF/spring.factories配置文件中摘录的一段内容,可以很好地说明问题。

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

结论:

  1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

  2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;

  3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;

  4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;

  5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值