Serie SpringBoot (ocho) ---- principio de configuración de inicio

Principio de configuración de inicio

  • Generalmente, el núcleo de nuestra configuración está en META-INF / spring.factories de cada configuración, y el inicio de nuestro SpringBoot está relacionado con,

    • ApplicationContextInitializer

    • SpringApplicationRunListener

  • Solo necesita colocarse en el contenedor ioc

    • ApplicationRunner

    • CommandLineRunner

Iniciar el proceso

  • Crear objeto SpringApplication
initialize(sources);
private void initialize(Object[] sources) {
    
    
    //保存主配置类
    if (sources != null && sources.length > 0) {
    
    
        this.sources.addAll(Arrays.asList(sources));
    }
    //判断当前是否一个web应用
    this.webEnvironment = deduceWebEnvironment();
    //从类路径下找到META-INF/spring.factories配置的所有ApplicationContextInitializer;然后保存起来
    setInitializers((Collection) getSpringFactoriesInstances(
        ApplicationContextInitializer.class));
    //从类路径下找到ETA-INF/spring.factories配置的所有ApplicationListener
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    //从多个配置类中找到有main方法的主配置类
    this.mainApplicationClass = deduceMainApplicationClass();
}

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

  • Ejecuta el método de ejecución
public ConfigurableApplicationContext run(String... args) {
    
    
   StopWatch stopWatch = new StopWatch();
   stopWatch.start();
   ConfigurableApplicationContext context = null;
   FailureAnalyzers analyzers = null;
   configureHeadlessProperty();
    
   //获取SpringApplicationRunListeners;从类路径下META-INF/spring.factories
   SpringApplicationRunListeners listeners = getRunListeners(args);
    //回调所有的获取SpringApplicationRunListener.starting()方法
   listeners.starting();
   try {
    
    
       //封装命令行参数
      ApplicationArguments applicationArguments = new DefaultApplicationArguments(
            args);
      //准备环境
      ConfigurableEnvironment environment = prepareEnvironment(listeners,
            applicationArguments);
       		//创建环境完成后回调SpringApplicationRunListener.environmentPrepared();表示环境准备完成
       
      Banner printedBanner = printBanner(environment);
       
       //创建ApplicationContext;决定创建web的ioc还是普通的ioc
      context = createApplicationContext();
       
      analyzers = new FailureAnalyzers(context);
       //准备上下文环境;将environment保存到ioc中;而且applyInitializers();
       //applyInitializers():回调之前保存的所有的ApplicationContextInitializer的initialize方法
       //回调所有的SpringApplicationRunListener的contextPrepared();
       //
      prepareContext(context, environment, listeners, applicationArguments,
            printedBanner);
       //prepareContext运行完成以后回调所有的SpringApplicationRunListener的contextLoaded();
       
       //s刷新容器;ioc容器初始化(如果是web应用还会创建嵌入式的Tomcat);Spring注解版
       //扫描,创建,加载所有组件的地方;(配置类,组件,自动配置)
      refreshContext(context);
       //从ioc容器中获取所有的ApplicationRunner和CommandLineRunner进行回调
       //ApplicationRunner先回调,CommandLineRunner再回调
      afterRefresh(context, applicationArguments);
       //所有的SpringApplicationRunListener回调finished方法
      listeners.finished(context, null);
      stopWatch.stop();
      if (this.logStartupInfo) {
    
    
         new StartupInfoLogger(this.mainApplicationClass)
               .logStarted(getApplicationLog(), stopWatch);
      }
       //整个SpringBoot应用启动完成以后返回启动的ioc容器;
      return context;
   }
   catch (Throwable ex) {
    
    
      handleRunFailure(context, listeners, analyzers, ex);
      throw new IllegalStateException(ex);
   }
}

Mecanismo de seguimiento de eventos

Configurado en META-INF / spring.factories

  • ApplicationContextInitializer
public class HelloApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    
    
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
    
    
        System.out.println("ApplicationContextInitializer...initialize..."+applicationContext);
    }
}

  • SpringApplicationRunListener
public class HelloSpringApplicationRunListener implements SpringApplicationRunListener {
    
    

    //必须有的构造器
    public HelloSpringApplicationRunListener(SpringApplication application, String[] args){
    
    

    }

    @Override
    public void starting() {
    
    
        System.out.println("SpringApplicationRunListener...starting...");
    }

    @Override
    public void environmentPrepared(ConfigurableEnvironment environment) {
    
    
        Object o = environment.getSystemProperties().get("os.name");
        System.out.println("SpringApplicationRunListener...environmentPrepared.."+o);
    }

    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
    
    
        System.out.println("SpringApplicationRunListener...contextPrepared...");
    }

    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
    
    
        System.out.println("SpringApplicationRunListener...contextLoaded...");
    }

    @Override
    public void finished(ConfigurableApplicationContext context, Throwable exception) {
    
    
        System.out.println("SpringApplicationRunListener...finished...");
    }
}

  • Colocación (META-INF / spring.factories)
org.springframework.context.ApplicationContextInitializer=\
com.atguigu.springboot.listener.HelloApplicationContextInitializer

org.springframework.boot.SpringApplicationRunListener=\
com.atguigu.springboot.listener.HelloSpringApplicationRunListener

Solo necesita colocarse en el contenedor ioc

  • ApplicationRunner
@Component
public class HelloApplicationRunner implements ApplicationRunner {
    
    
    @Override
    public void run(ApplicationArguments args) throws Exception {
    
    
        System.out.println("ApplicationRunner...run....");
    }
}

CommandLineRunner

@Component
public class HelloCommandLineRunner implements CommandLineRunner {
    
    
    @Override
    public void run(String... args) throws Exception {
    
    
        System.out.println("CommandLineRunner...run..."+ Arrays.asList(args));
    }
}

Arrancador personalizado

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

  • Cree un nuevo módulo Maven ordinario: springboot-starter1
    Inserte la descripción de la imagen aquí
  • Cree un nuevo módulo Springboot: springboot-starter-autoconfigure
    Inserte la descripción de la imagen aquí
  • Haga clic en aplicar, estructura básica
    Inserte la descripción de la imagen aquí
  • ¡Importa la dependencia de autoconfigure en nuestro starter1!

<!-- 启动器 -->
<dependencies>
<!--  引入自动配置模块 -->
    <dependency>
        <groupId>com.cz</groupId>
        <artifactId>springboot-starter-autoconfigure</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>
  • Elimina todos los archivos redundantes del proyecto de autoconfiguración. ¡Solo queda un iniciador en el Pom, que es la configuración básica de todos los iniciadores!
    Inserte la descripción de la imagen aquí
  • Escribimos nuestro propio servicio
public class HelloService {
    
    

    HelloProperties helloProperties;

    public HelloProperties getHelloProperties() {
    
    
        return helloProperties;
    }

    public void setHelloProperties(HelloProperties helloProperties) {
    
    
        this.helloProperties = helloProperties;
    }

    public String sayHello(String name){
    
    
        return helloProperties.getPrefix() + name + helloProperties.getSuffix();
    }

}
  • Escribir la clase de configuración HelloProperties
@ConfigurationProperties(prefix = "cz.hello")
public class HelloProperties {
    
    

    private String prefix;
    private String suffix;

    public String getPrefix() {
    
    
        return prefix;
    }

    public void setPrefix(String prefix) {
    
    
        this.prefix = prefix;
    }

    public String getSuffix() {
    
    
        return suffix;
    }

    public void setSuffix(String suffix) {
    
    
        this.suffix = suffix;
    }
}

  • Escribe nuestra clase de autoconfiguración e inyecta el bean, ¡prueba!
@Configuration
@ConditionalOnWebApplication //web应用生效
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
    
    

    @Autowired
    HelloProperties helloProperties;

    @Bean
    public HelloService helloService(){
    
    
        HelloService service = new HelloService();
        service.setHelloProperties(helloProperties);
        return service;
    }
}
  • Escriba su propio META-INF \ spring.factories en recursos
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.cz.starter.HelloServiceAutoConfiguration
  • Después de escribir, puede instalarlo en el almacén de maven.
    Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_43844418/article/details/114368210
Recomendado
Clasificación