SpringBoot源码解析之SpringApplication

可以用于从Java主方法引导并启动Spring应用程序的类。默认情况下,类将执行以下步骤启动应用程序:

  • 创建适当的ApplicationContext实例(取决于类路径)
  • 注册一个CommandLinePropertySource,以Spring属性的形式暴露命令行参数
  • 刷新应用程序上下文,加载所有的单例bean
  • 触发所有的CommandLineRunner bean

在大多数情况下,静态方法run(Class<?>[] primarySources, String[] args)可以直接从主方法调用,从而引导应用程序:

1
2
3
4
5
6
7
8
9
10
@Configuration
@EnableAutoConfiguration
public class MyApplication {

// ... Bean definitions

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

对于更高级的配置,可以在运行之前创建和定制SpringApplication实例:

1
2
3
4
5
public static void main(String[] args) throws Exception {
SpringApplication application = new SpringApplication(MyApplication.class);
// ... customize application settings here
application.run(args)
}

springapplication可以从各种不同的来源读取bean。通常建议使用一个@Configuration类来引导应用程序,但是,您也可以从以下设置源:

  • 由AnnotatedBeanDefinitionReader加载的完全限定类名
  • XmlBeanDefinitionReader装载的XML资源的位置,或者GroovyBeanDefinitionReader装载的groovy脚本
  • ClassPathBeanDefinitionScanner要扫描的软件包的名称

配置属性也绑定到SpringApplication。这使得可以动态地设置SpringApplication属性,比如额外的源(“spring.main”。来源“-一个CSV列表)标志以表示一个web环境(“spring.main.web-application-type=none”)或标志以关闭横幅(“spring.main.bannermode =off”)。

启动时调用main方法,主要执行***SpringApplication.run()***方法

1
2
3
public static void main(String[] args) {
SpringApplication.run(RabbitApplication.class, args);
}

SpringApplication的run方法实现

1
2
3
4
5
6
7
8
9
10
11
/**
* Static helper that can be used to run a {@link SpringApplication} from the
* specified source using default settings.
* @param primarySource the primary source to load
* @param args the application arguments (usually passed from a Java main method)
* @return the running {@link ApplicationContext}
*/
public static ConfigurableApplicationContext run(Class<?> primarySource,
String... args) {
return run(new Class<?>[] { primarySource }, args);
}

其中primarySource即为com.lemon.rabbit.RabbitApplication

SpringApplication中定义了一些静态的成员属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

//在非web环境中默认使用的应用程序上下文的类名。
public static final String DEFAULT_CONTEXT_CLASS = "org.springframework.context."
+ "annotation.AnnotationConfigApplicationContext";

//应用程序上下文的类名,默认用于web环境。
public static final String DEFAULT_WEB_CONTEXT_CLASS = "org.springframework.boot."
+ "web.servlet.context.AnnotationConfigServletWebServerApplicationContext";

//
private static final String[] WEB_ENVIRONMENT_CLASSES = { "javax.servlet.Servlet",
"org.springframework.web.context.ConfigurableWebApplicationContext" };

public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframework."
+ "boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext";

private static final String REACTIVE_WEB_ENVIRONMENT_CLASS = "org.springframework."
+ "web.reactive.DispatcherHandler";

private static final String MVC_WEB_ENVIRONMENT_CLASS = "org.springframework."
+ "web.servlet.DispatcherServlet";

//banner的默认存放位置
public static final String BANNER_LOCATION_PROPERTY_VALUE = SpringApplicationBannerPrinter.DEFAULT_BANNER_LOCATION;

//旗帜位置属性的关键。
public static final String BANNER_LOCATION_PROPERTY = SpringApplicationBannerPrinter.BANNER_LOCATION_PROPERTY;

private static final String SYSTEM_PROPERTY_JAVA_AWT_HEADLESS = "java.awt.headless";