springboot2
# Managing the Application Availability State \`\`\`java @Component public class ReadinessStateExporter { @EventListener public void onStateChange(AvailabilityChangeEvent event) { switch (event.getState()) { case ACCEPTING_TRAFFIC: // create file /tmp/healthy break; case REFUSING_TRAFFIC: // remove file /tmp/healthy break; } } } \`\`\` \`\`\`java @Component public class LocalCacheVerifier { private final ApplicationEventPublisher eventPublisher; public LocalCacheVerifier(ApplicationEventPublisher eventPublisher) { this.eventPublisher = eventPublisher; } public void checkLocalCache() { try { //... } catch (CacheCompletelyBrokenException ex) { AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN); } } } \`\`\` # Application Events and Listeners - ApplicationContext初始化之前不能注册监听器, 但可以使用SpringApplication.addListeners(...) , SpringApplicationBuilder.listeners(...) - Listener: 长任务可能不执行,使用CommandLineRunner - ApplicationStartingEvent - ApplicationEnvironmentPreparedEvent - ApplicationContextInitializedEvent - ApplicationPreparedEvent - WebServerInitializedEvent - ServletWebServerInitializedEvent,ReactiveWebServerInitializedEvent - A ContextRefreshedEvent - ApplicationStartedEvent - AvailabilityChangeEvent - ApplicationReadyEvent - AvailabilityChangeEvent - ApplicationFailedEvent # Accessing Application Arguments \`\`\`java import org.springframework.boot.\*; import org.springframework.beans.factory.annotation.\*; import org.springframework.stereotype.\*; @Component public class MyBean { @Autowired public MyBean(ApplicationArguments args) { boolean debug = args.containsOption("debug"); List files = args.getNonOptionArgs(); // if run with "--debug logfile.txt" debug=true, files=\["logfile.txt"\] } } \`\`\` # Using the ApplicationRunner or CommandLineRunner - 在SpringApplication.run()结束前运行 \`\`\`java import org.springframework.boot.\*; import org.springframework.stereotype.\*; @Component public class MyBean implements CommandLineRunner { public void run(String... args) { // Do something... } } \`\`\` # Application Exit \`\`\`java @SpringBootApplication public class ExitCodeApplication { @Bean public ExitCodeGenerator exitCodeGenerator() { return () -\> 42; } public static void main(String\[\] args) { System.exit(SpringApplication.exit(SpringApplication.run(ExitCodeApplication.class, args))); } } \`\`\` # Application Startup \`\`\`java public static void main(String\[\] args) { SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setApplicationStartup(new BufferingApplicationStartup(2048)); app.run(args); } \`\`\` # @Value - Java properties files, YAML files, environment variables, and command-line arguments - $--$server.port=9000 - SpringApplication.setAddCommandLineProperties(false) 设置命令行参数后不生效 - SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}' 环境变量 - java -Dspring.application.json='{"acme":{"name":"test"}}' -jar myapp.jar 系统变量 - java -jar myapp.jar --spring.application.json='{"acme":{"name":"test"}}' 命令行参数 # 默认配置文件位置 - classpath - classpath:/config - current directory - current directory/config - 环境变量:spring.config.name可以自定义配置文件名称 - spring.config.location 配置文件位置 需要以"/"结尾 - spring.config.additional-location - \`\`\`shell java -jar myproject.jar --spring.config.name=myproject java -jar myproject.jar --spring.config.location=optional:classpath:/default.properties,optional:classpath:/ov erride.properties,optional:file:./custom-config/ # Use the prefix optional: if the locations are optional and you don't mind if they don't exist. \`\`\` 1. optional:classpath:/ 2. optional:classpath:/config/ 3. optional:file:./ 4. optional:file:./config/ 5. optional:file:./config/\*/ 6. optional:classpath:custom-config/ 7. optional:file:./custom-config/ # @Random Value \`\`\`properties my.secret=${random.value} my.number=${random.int} my.bignumber=${random.long} my.uuid=${random.uuid} my.number-less-than-ten=${random.int(10)} my.number-in-range=${random.int\[1024,65536\]} \`\`\` # @ConstructorBinding - 2.2之前的属性绑定需要setter方法,之后使用该注解可以使用构造方法绑定 - 松散绑定,不区分大小写,可已添加连字符 # Map绑定 - Map - \`\`\`properties acme.map.\[/key1\]=value1 acme.map.\[/key2\]=value2 acme.map./key3=value3 \`\`\` # Logging - logging.file.name - logging.file.path - logging.level.root=warn - logging.level.org.springframework.web=debug - logging.level.org.hibernate=error - $logging.register-shutdown-hook=true$ # 国际化 \`\`\`properties spring.messages.basename=messages,config.i18n.messages spring.messages.fallback-to-system-locale=false \`\`\` # 响应式webflux - spring-boot-starter-webflux - 异步springmvc # MVC - @EnableWebMvc - DelegatingWebMvcConfiguration - 自定义对象转json \`\`\`java import java.io.\*; import com.fasterxml.jackson.core.\*; import com.fasterxml.jackson.databind.\*; import org.springframework.boot.jackson.\*; @JsonComponent public class Example { public static class Serializer extends JsonSerializer { // ... } public static class Deserializer extends JsonDeserializer { // ... } } \`\`\` ## static content - /static ,/public, /resources, /META-INF/resources - WebMvcConfigurer and overriding the addResourceHandlers - \`\`\`properties spring.mvc.static-path-pattern=/resources/\*\* \`\`\`