1.导入xml配置文件,可以用@ImportResource注解
2.可以在@SpringBootApplication,@EnableAutoConfiguration注解中排除自动配置类
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@SpringBootApplication(excludeName={类的全路径名})
devtools
添加maven依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
devtools依赖hook,SpringApplication.setRegisterShutdownHook(false)会导致出现问题
restart通过销毁旧的类加载器,创建新的类加载器实现
reload通过
spring.devtools.restart.log-condition-evaluation-delta 开关restart执行时打印的日志
启动流程
创建SpringApplication实例
/**
检测应用类型,通过是否成功加载某些类来确定
**/
this.webApplicationType = WebApplicationType.deduceFromClasspath();
/**
在META-INF/spring.factories中查找org.springframework.boot.Bootstrapper的实现类,并
循环调用initialize方法
查找并创建org.springframework.boot.BootstrapRegistryInitializer实现类
**/
this.bootstrapRegistryInitializers = getBootstrapRegistryInitializersFromSpringFactories();
/**
查找并创建org.springframework.context.ApplicationContextInitializer实现类
**/
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
this.initializers = new ArrayList<>(initializers);
/**
查找并创建org.springframework.context.ApplicationListener实现类
**/
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.listeners = new ArrayList<>(listeners);
//通过遍历堆栈方法名,如果methodName是main,则该类作为mainClass
this.mainApplicationClass = deduceMainApplicationClass();
SpringApplication.run()
//遍历调用this.bootstrapRegistryInitializers::initialize方法
DefaultBootstrapContext bootstrapContext = createBootstrapContext();
ConfigurableApplicationContext context = null;
configureHeadlessProperty();
/**
查询META-INF/spring.factories文件下的org.springframework.boot.SpringApplicationRunListener实现类
创建EventPublishingRunListener类实例,并存入SpringApplicationRunListeners
**/
SpringApplicationRunListeners listeners = getRunListeners(args);
/**
发布ApplicationStartingEvent事件,通知监听器
EnvironmentPostProcessorApplicationListener
AnsiOutputApplicationListener
LoggingApplicationListener
BackgroundPreinitializer
DelegatingApplicationListener
FileEncodingApplicationListener
**/
listeners.starting(bootstrapContext, this.mainApplicationClass);
//应用命令行参数设置
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
/**
根据应用类型创建environment
(StandardServletEnvironment、StandardReactiveWebEnvironment、StandardEnvironment)
配置PropertySources,配置Profiles
发布ApplicationEnvironmentPreparedEvent,通知监听器
EnvironmentPostProcessorApplicationListener
AnsiOutputApplicationListener
LoggingApplicationListener
BackgroundPreinitializer
DelegatingApplicationListener
FileEncodingApplicationListener
**/
ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
//设置spring.beaninfo.ignore系统参数=true
configureIgnoreBeanInfo(environment);
//根据webApplicationType创建context
context = createApplicationContext();
context.setApplicationStartup(this.applicationStartup);
prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
refreshContext(context);
afterRefresh(context, applicationArguments);
listeners.started(context);
callRunners(context, applicationArguments);
listeners.running(context);
return context;
}