SpringBoot启动原理解析

 

1. 启动任何一个Spring Boot项目,都会用到如下类

1

2

3

4

5

6

@SpringBootApplication

public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);

    }

}

  

 从上面代码可以看出,Annotation定义@SpringBootApplication和类定义SpringApplication.run是关键所在.

 

2. @SpringBootApplication

点开@SpringBootApplication我们可以看到,如下信息:

 

1

2

3

4

5

6

7

8

9

10

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))

public @interface SpringBootApplication{

...

}

  

其实最重要的还是上面三个Annotation

 

 

3. @Configuration

它就是JavaConfig形式的Spring IOC容器的配置类使用的那个@Configuration.

Spring IOC容器配置类,基于XML配置的方式是这样的:

1

2

3

<bean id="mockService" class="..MockServiceImpl">

    ...

</bean>

  

而基于Javaconfig的配置形式是这样的:

1

2

3

4

5

6

7

@Configuration

public class MockConfiguration{

    @Bean

    public MockService mockService(){

        return new MockServiceImpl();

    }

}

 

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

 

4. @ComponentScan

它的功能其实就是自动扫描符合条件的组件(@Component和@Repository等)或者bean自定义,并加载到IOC容器中.

我们可以通过basePackage等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认从Spring框架实现会从声明@ComponentScan所在类的package进行扫描.

所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackage.

 

5. @EnableAutoConfiguration

首先@Enable*的原理都是借助@Import的支持,收集和注册特定场景相关的Bean定义,比如@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加在到IOC容器中.

 

其次,@EnableAutoConfiguration作为一个复合Annotation,其自身定义信息如下:

1

2

3

4

5

6

7

8

9

10

@SuppressWarnings("deprecation")

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import(EnableAutoConfigurationImportSelector.class)

public @interface EnableAutoConfiguration {

    ...

}

 

借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IOC容器.

 

自动配置的幕后英雄:SpringFactoriesLoader:

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

1

2

3

4

5

6

7

8

9

10

11

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类.

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值