Spring Boot启动配置原理
|Word count:717|Reading time:3min|Post View:
Spring Boot启动配置原理
几个重要的事件回调机制
配置在META-INF/spring.factories
ApplicationContextInitializer
SpringApplicationRunListener
只需要放在ioc容器中
ApplicationRunner
CommandLineRunner
启动流程:
1、创建SpringApplication对象
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | initialize(sources);private void initialize(Object[] sources) {
 
 if (sources != null && sources.length > 0) {
 this.sources.addAll(Arrays.asList(sources));
 }
 
 this.webEnvironment = deduceWebEnvironment();
 
 setInitializers((Collection) getSpringFactoriesInstances(
 ApplicationContextInitializer.class));
 
 setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
 
 this.mainApplicationClass = deduceMainApplicationClass();
 }
 
 | 
2、运行run方法
| 12
 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
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 
 | public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch = new StopWatch();
 stopWatch.start();
 ConfigurableApplicationContext context = null;
 FailureAnalyzers analyzers = null;
 configureHeadlessProperty();
 
 
 SpringApplicationRunListeners listeners = getRunListeners(args);
 
 listeners.starting();
 try {
 
 ApplicationArguments applicationArguments = new DefaultApplicationArguments(
 args);
 
 ConfigurableEnvironment environment = prepareEnvironment(listeners,
 applicationArguments);
 
 
 Banner printedBanner = printBanner(environment);
 
 
 context = createApplicationContext();
 
 analyzers = new FailureAnalyzers(context);
 
 
 
 
 prepareContext(context, environment, listeners, applicationArguments,
 printedBanner);
 
 
 
 
 refreshContext(context);
 
 
 afterRefresh(context, applicationArguments);
 
 listeners.finished(context, null);
 stopWatch.stop();
 if (this.logStartupInfo) {
 new StartupInfoLogger(this.mainApplicationClass)
 .logStarted(getApplicationLog(), stopWatch);
 }
 
 return context;
 }
 catch (Throwable ex) {
 handleRunFailure(context, listeners, analyzers, ex);
 throw new IllegalStateException(ex);
 }
 }
 
 | 
3、事件监听机制
配置在META-INF/spring.factories
ApplicationContextInitializer
| 12
 3
 4
 5
 6
 
 | public class HelloApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Override
 public void initialize(ConfigurableApplicationContext applicationContext) {
 System.out.println("ApplicationContextInitializer...initialize..."+applicationContext);
 }
 }
 
 | 
SpringApplicationRunListener
| 1
 | public class HelloSpringApplicationRunListener implements SpringApplicationRunListener {
 | 
| 12
 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
 31
 
 |     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...");
 }
 }
 
 | 
配置(META-INF/spring.factories)
| 12
 3
 4
 5
 
 | org.springframework.context.ApplicationContextInitializer=\com.atguigu.springboot.listener.HelloApplicationContextInitializer
 
 org.springframework.boot.SpringApplicationRunListener=\
 com.atguigu.springboot.listener.HelloSpringApplicationRunListener
 
 | 
只需要放在ioc容器中
ApplicationRunner
| 12
 3
 4
 5
 6
 7
 
 | @Componentpublic class HelloApplicationRunner implements ApplicationRunner {
 @Override
 public void run(ApplicationArguments args) throws Exception {
 System.out.println("ApplicationRunner...run....");
 }
 }
 
 | 
CommandLineRunner
| 12
 3
 4
 5
 6
 7
 
 | @Componentpublic class HelloCommandLineRunner implements CommandLineRunner {
 @Override
 public void run(String... args) throws Exception {
 System.out.println("CommandLineRunner...run..."+ Arrays.asList(args));
 }
 }
 
 |