spring boot学习记录2---springboot启动类浅析

上一节介绍了spring boot工程的新建和启动,这一节主要来看看spring boot的启动类和pom的相关配置。
首先,看一下启动类的代码:

package com.example.demo;

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

@SpringBootApplication
public class DemoApplication {

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

简单明了的代码,而其中能够引起我们注意的就只有那一个注解,和run方法了。
首先看看注解的源码:
源码
在注解类的头部注释中可以了解到,其实SpringBootApplication就是将@Configuration,@EnableAutoConfiguration以及@ComponentScan三个注解的功能合在一起。相当于集成了这三个注解,让代码更简洁。
而这三个注解的功能依次是
1.声明bean
2.启动自动配置,配置bean
3.配置注解扫描

在知道了注解的功能后,再来看看main方法中的SpringApplication.run()。其实在知道了注解功能后,就可以猜测这个run方法就是实际执行启动的方法。那么我们来看看具体的源码是怎样的:
run
点进源码后发现并没有看到run方法的具体实现代码,在具体的方法之前还经历了两个静态方法的调用。
先看第一个方法的注释,解释这个方法是用来在默认配置下从特定资源运行SpringApplication的。
然后第二个方法的注释,与第一个差不多,唯一的差别就是最后多了一个用户提供的参数。
而仔细看两个方法的差别,第二个方法的primarySource是一个数组对象,也就是可以传递多个primarySource,这其中应该就包含有用户提供的参数之类的。而第二个方法中才调用了实际执行的run方法。实际执行过程也就是启动监听器,初始化上下文等等。
run方法
除此之外,spring还提供了一个定制化的启动方式:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApplication.class);
        Banner banner = new Banner() {
            @Override
            public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
                System.out.println("hello world");
            }
        };
        app.setBanner(banner);
        app.run(args);
    }
}

这个方法实际上就是先实例化SpringApplication类,然后直接调用run方法执行启动初始化过程。
在这中间,类的实例可以调用很多set方法根据开发者需求更改配置,比如我这里更改了启动时的输出:
定制化
spring boot提供了以下的set方法供开发者进行定制化启动:
set

那么关于spring boot启动类的解析就暂时到这里。关于这部分还有许多问题并没有了解清楚,比如上面提到的第二个传入多个primarySource的run方法,在什么情况下去使用?再比如实际执行的run方法具体过程也没有深入的了解。这些只能留待之后再继续学习了解。

猜你喜欢

转载自blog.csdn.net/qq_19656425/article/details/80867884