启动配置原理 几个重要的事件回调机制
配置在META-INF/spring.factories
ApplicationContextInitializer
SpringApplicationRunListener
只需要放在ioc容器中
ApplicationRunner
CommandLineRunner
启动流程:
1、创建SpringApplication对象 1 2 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方法 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 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
1 2 3 4 5 6 public class HelloApplicationContextInitializer implements ApplicationContextInitializer <ConfigurableApplicationContext > { @Override public void initialize (ConfigurableApplicationContext applicationContext) { System.out.println("ApplicationContextInitializer...initialize..." +applicationContext); } }
SpringApplicationRunListener
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 31 32 33 public class HelloSpringApplicationRunListener implements SpringApplicationRunListener { 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)
1 2 3 4 5 org.springframework.context.ApplicationContextInitializer =\ com.atguigu.springboot.listener.HelloApplicationContextInitializer org.springframework.boot.SpringApplicationRunListener =\ com.atguigu.springboot.listener.HelloSpringApplicationRunListener
只需要放在ioc容器中
ApplicationRunner
1 2 3 4 5 6 7 @Component public class HelloApplicationRunner implements ApplicationRunner { @Override public void run (ApplicationArguments args) throws Exception { System.out.println("ApplicationRunner...run...." ); } }
CommandLineRunner
1 2 3 4 5 6 7 @Component public class HelloCommandLineRunner implements CommandLineRunner { @Override public void run (String... args) throws Exception { System.out.println("CommandLineRunner...run..." + Arrays.asList(args)); } }
欢迎访问 chenyawei 的博客, 若有问题或者有好的建议欢迎留言,笔者看到之后会及时回复。 评论点赞需要github账号登录,如果没有账号的话请点击 github 注册, 谢谢 !
If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !