springboot微服务-03 Spring Boot工作机制


Spring Boot工作机制

通过Http://start.spring.io/创建一个最简单额依赖Web模块的SpringBoot应用,其启动类如下所示:

package com.example.demo20180607;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Demo20180607Application {

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

如上最重要的注释就是@SpringBootApplication

@SpringBootApplication

它是一个组合注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}

其中重要的有三个注解:@Configuration、@EnableAutoConfiguration、@ComponentScan

@Configuration

SpringBoot社区推荐使用基于JavaConfig的配置形式,所以启动类标注了@Configuration之后,本身就是一个 IOC 容器配置类;

@EnableAutoConfiguration

@Enable*也是一个组合注解,其中包括@import,借助了@import的支持收集和注册特定场景相关的bean定义:

  • @EnableAutoConfiguration的定义:
package org.springframework.boot.autoconfigure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.autoconfigure.AutoConfigurationImportSelector;
import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
import org.springframework.context.annotation.Import;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

其中,最关键的是@Import({AutoConfigurationImportSelector.class}),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的 IoC 容器;

自动配置原理: SpringFactoriesLoader:从指定的配置文件(spring-boot-autoconfigure-2.0.2.RELEASE.jar!\META-INF/spring.factories)加载配置,spring.factories,配置格式Key=Value形式,只是Key、Value都是完整的类名。在 @EnableAutoConfiguration的场景中,他更多是提供一种配置查找的功能支持,根据 @EnableAutoConfiguration的完整类名 org.springframework.boot.autoconfigure.EnableAutoConfiguration 作为查找的Key,获取对应的一组@Configuration类。

# 截取 spring.factories 文件部分内容
# Auto Configure
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,\
...

SpringApplication程序启动的一站式解决方案

SpringApplication执行流程

https://www.processon.com/view/link/59812124e4b0de2518b32b6e

springApplication执行流程

SpringApplicationRunListener

@SpringApplicationRunListener是 main () 执行过程中接收不同执行时点事件通知的监听者,无需自己实现,默认是实现了一个org.springframework.boot.context.event.EventPublishingRunListener,用于在SpringBoot启动的不同时点发布不同的应用事件类型(ApplicationEvent),如果有哪些ApplicationListener对这些事件感兴趣,则可以处理。

ApplicationListener

ApplicationContextInitializer

允许对ApplicationContext做进一步设置,只需要重写ApplicationContextInitializer的一个initialize()方法即可

CommandLineRunner

执行点:在SpringBoot应用的ApplicationContext完全初始化开始工作之后,main方法执行完成之前最后一步。建议CommandLineRunner的实现类使用 @org.springframework.core.annotation.Order进行标注或者实现org.springframework.core.Ordered接口,便于对他们的执行顺序进行调整。

参考

Springboot执行流程:https://www.cnblogs.com/trgl/p/7353782.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值