SpringApplication#run()getRunListeners()

简介: SpringApplication#run()getRunListeners()

SpringBoot启动流程之(SpringApplication#run()getRunListeners())

  • getRunListeners(args)流程如下

1.第二大步SpringApplication的run()方法

public ConfigurableApplicationContext run(String...args){
        StopWatch stopWatch=new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context=null;
        Collection<SpringBootExceptionReporter> exceptionReporters=new ArrayList<>();
        configureHeadlessProperty();
        //加载并实例化META-INF/spring.factories下面的SpringApplicationRunListener所对应的class集合
        SpringApplicationRunListeners listeners=getRunListeners(args);
//后面删掉了,因为这里不讲......

3.1.SpringApplicationRunListeners listeners = getRunListeners(args);

  • getRunListeners()代码

 

private SpringApplicationRunListeners getRunListeners(String[]args){
        Class<?>[]types=new Class<?>[]{SpringApplication.class,String[].class };
        return new SpringApplicationRunListeners(logger,
        //注意入参SpringApplicationRunListener.class,会作为筛选META-INF/spring.factories的条件
        getSpringFactoriesInstances(SpringApplicationRunListener.class,types,this,args));
        }

以SpringApplicationRunListener.class为key值的META-INF/spring.factories全限定类如下

# Run Listeners
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener
  • 程序DEBUG截图如下
  • 可见以SpringApplicationRunListener为入参,最终筛选的结果集便是EventPublishingRunListener
  • SpringApplicationRunListener结构
  • 可以看出SpringApplicationRunListener为一个接口,它的实现依赖于子类的继承
  • 而EventPublishingRunListener继承了并且实现了所有抽象方法

当通过META-INF/spring.factorie实例化了EventPublishingRunListener对象之后,将其作为List转化为SpringApplicationRunListeners的入参,代码如下:

 

private SpringApplicationRunListeners getRunListeners(String[]args){
        //这里的types会作为后面事件发布的参数
        Class<?>[]types=new Class<?>[]{SpringApplication.class,String[].class };
        //getSpringFactoriesInstances(SpringApplicationRunListener.class,types,this,args)
        //返回的实例集合转为SpringApplicationRunListeners的入参,在实例化集合创建时同时完成了ApplicationListener的广播处理
        return new SpringApplicationRunListeners(logger,
        getSpringFactoriesInstances(SpringApplicationRunListener.class,types,this,args));
        }
  • 加载全类名

 

private<T> Collection<T> getSpringFactoriesInstances(Class<T> type,Class<?>[]parameterTypes,Object...args){
        ClassLoader classLoader=getClassLoader();
        // 通过Set集合去除同名class,根据type属性加载META-INF/spring.factorie下的class全类名
        Set<String> names=new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type,classLoader));
        //实例化class集合,前面讲过,这里就不再说了
        List<T> instances=createSpringFactoriesInstances(type,parameterTypes,classLoader,args,names);
        AnnotationAwareOrderComparator.sort(instances);
        return instances;
        }
  • 将ApplicationListener交给广播处理
public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered {
    private final SpringApplication application;
    private final String[] args;
    //广播器
    private final SimpleApplicationEventMulticaster initialMulticaster;
    //application为反射创建对象的SpringApplication对象
    public EventPublishingRunListener(SpringApplication application, String[] args) {
        this.application = application;
        this.args = args;
        this.initialMulticaster = new SimpleApplicationEventMulticaster();
        //获取在构造SpringApplication时创建的ApplicationListener并把他们交给广播处理
        for (ApplicationListener<?> listener : application.getListeners()) {
            this.initialMulticaster.addApplicationListener(listener);
        }
    }
目录
相关文章
|
4月前
|
前端开发 Java 应用服务中间件
SpringBoot-Run启动流程
探索Spring Boot启动流程,从加载配置、创建应用上下文、自动配置到启动内嵌服务器。启动类是入口点,`@SpringBootApplication`标记启动,`SpringApplication.run`启动应用。自动配置基于条件注解配置Bean,应用上下文由`SpringApplication`创建并刷新。内嵌服务器如Tomcat随应用启动,简化部署。理解此流程有助于深入掌握Spring Boot。
197 2
|
29天前
|
调度
Runnable接口的 run() 方法和start()方法
Runnable接口的 run() 方法和start()方法
8 0
|
3月前
|
缓存 Java Maven
Spring Boot 启动错误:To display the conditions report re-run your application with ‘debug‘ enable —【已解决】
Spring Boot 启动错误:To display the conditions report re-run your application with ‘debug‘ enable —【已解决】
242 1
|
2月前
|
数据安全/隐私保护
部署初始化bug,刚开始部署出现的问题---ERROR o.s.b.SpringApplication - [reportFailure,870] - Application run failed
部署初始化bug,刚开始部署出现的问题---ERROR o.s.b.SpringApplication - [reportFailure,870] - Application run failed
|
4月前
|
Java
springboot启动报错:“Error starting ApplicationContext. To display the conditions report re-run your appl
springboot启动报错:“Error starting ApplicationContext. To display the conditions report re-run your appl
128 0
|
4月前
|
Java Spring 容器
[Spring 源码] 浅析 SpringApplication#run()
[Spring 源码] 浅析 SpringApplication#run()
|
10月前
Error starting ApplicationContext. To display the auto-configuration report re-run your application
Error starting ApplicationContext. To display the auto-configuration report re-run your application
|
Java 数据库连接 数据库
ERROR 2384 — [ main] o.s.boot.SpringApplication : Application run failed
ERROR 2384 — [ main] o.s.boot.SpringApplication : Application run failed
296 0
SpringApplication
不简单的方法 我最初以为就是运行了一个main方法,没想到却开启了一个服务;
SpringApplication
|
Java Spring
【SpringBoot 一】SpringApplication启动类的Args详解
【SpringBoot 一】SpringApplication启动类的Args详解
【SpringBoot 一】SpringApplication启动类的Args详解