示例
springboot程序通过SpringBootApplication
注解和Runner类中入口方法main
执行SpringApplication.run()
就可以执行起来,如下:1
2
3
4
5
6
7
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
内部代码分析
通过DemoApplication main
方法进入之后,过掉各种中间多态或抽象的过程,主要包括两个方法: initializer
和run
在启动过程中的各种Spring context和bean的配置,主要在spring-boot的 META-INF/spring.factories文件中
META-INF中这个文件也是开发springboot插件的一个方式
initializer方法
1 | "unchecked", "rawtypes" }) ({ |
主要包含如下几个过程:
- 判断是否为web环境
- 设置初始化类(initializers, springboot 封装的 spring-context中的ApplicationContext列表)
- 设置监听器(listeners, spring封装的spring-context中的ApplicationListener列表)
webEnvironment的过程
判断是否为web环境,主要是看有没有加载javax.servlet.Servlet
和 org.springframework.web.context.ConfigurableWebApplicationContext
相关的类
另外,在DemoApplication的main方法中手动设置webEnvironment也会直接生效,如下:
1 | public static void main(String[] args) { |
设置初始化类
设置初始化类是通过SpringApplication中的方法getSpringFactoriesInstances()
,参数为 ApplicationContextInitializer.class
1 | private <T> Collection<? extends T> getSpringFactoriesInstances(Class<T> type, |
SpringFactoriesLoader.loadFactoryNames
方法,获取了spring-boot包下的META-INF/spring.factories
中的ApplicationListeners,主要包括:1
2
3
4
5
6
7
8
9org.springframework.boot.ClearCachesApplicationListener
org.springframework.boot.builder.ParentContextCloserApplicationListener
org.springframework.boot.context.FileEncodingApplicationListener
org.springframework.boot.context.config.AnsiOutputApplicationListener
org.springframework.boot.context.config.ConfigFileApplicationListener
org.springframework.boot.context.config.DelegatingApplicationListener
org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener
org.springframework.boot.logging.ClasspathLoggingApplicationListener
org.springframework.boot.logging.LoggingApplicationListener
//TODO
run方法
1 | public ConfigurableApplicationContext run(String... args) { |
======== 未完待续 =========