环境:SpringBoot2.7.18


1. 应用程序参数

SpringBoot程序在启动时,可以通过如下方式设置启动参数:

java-jarapp.jar--pack.title=xxx--pack.version=1.0.0

一般访问上面的参数可以通过如下方式:

@Resourceprivate Environment env ;public void getArgs() {Stringtitle=env.getProperty("pack.title");String version = env.getProperty("pack.version");}

其实SpringBoot为我们注册了一个Bean对象ApplicationArguments,在代码中可以直接注入该对象

@Resourceprivate ApplicationArguments applicationArguments ;public void getArgs() {  List<String> titles = applicationArguments.getOptionValues("pack.title") ;List<String>version=applicationArguments.getOptionValues("pack.version");}

我们还可以拿到原始配置的参数信息

String[]args=applicationArguments.getSourceArgs();

输出结果

[--pack.title=xxx, --pack.version=1.0.0]

可以根据自己的需要进行解析处理。

2. Banner

如果你想在项目中获取Banner信息,那么你可以直接在代码中注入Banner对象。

@Resourceprivate Banner banner ;@Resourceprivate Environment env ;publicvoidprintBanner() {banner.printBanner(env,PackApplication.class,System.out);}

注意:确保你没有关闭Banner,也就是说你没有进行如下的配置。

spring:  main:banner-mode:off#关闭Banner

编程方式

SpringApplication app = new SpringApplication(PackApplication.class);app.setBannerMode(Mode.OFF) ;

如果你关闭了Banner,那么上面的注入将会报错。

3. 类型转换器

ConversionService是个非常重要及强大的类,该类在SpringBoot启动过程中将配置文件中的配置数据转换为对应的数据类型。Controller请求参数数据类型进行转换。在代码中我们可以直接注入该类,如下示例:

@Resourceprivate ConversionService conversionService ;Integer ret = conversionService.convert("6666",   TypeDescriptor.valueOf(String.class),   TypeDescriptor.valueOf(Integer.class)) ;

你也可以注册自定义的类型转换

@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{  @Override  public void addFormatters(FormatterRegistry registry) {    registry.addConverterFactory(new ConverterFactory<String, User>() {      @Override      public <T extends User> Converter<String, T> getConverter(Class<T> targetType) {        return new Converter<String, T>() {          @Override          public T convert(String source) {            String[] s = source.split(",") ;            return (T) new User(Integer.valueOf(s[0]), s[1]) ;          }        } ;      }    }) ;  }}

添加自定义类型转换后,我们可以在代码中自己通过ConversionService进行类型转换。

4. Servlet相关对象

SpringBoot启动过程中会注册以下4个与Web相关的Bean对象。

  • ServletRequest
  • ServletResponse
  • HttpSession
  • WebRequest

这4个对象,我们可以在代码中任意的注入,而不必担心线程安全问题。因为这些对象实际对应的是ObjectFactory。而对应的内部实现是从ThreadLocal中获取。如下示例:

@ResourceprivateHttpServletRequest request ;@Resourceprivate HttpServletResponse response ;publicvoidgetParam() {  String value = request.getParameter("name") ;}

每个请求到来时都会将当前对应的Request存入到ThreadLocal中。

5.国际化MessageSource

我们可以在代码中直接注入MessageSource对象,进行国际化资源的访问,如下示例:

@Resourceprivate MessageSource messageSource ;publicvoidgetMsg() {  String message = this.messageSource.getMessage("pack.info.message",     new Object[] {"张三"}, "我是默认消息", Locale.CHINA) ;}

上面代码如果你没有设置默认消息,那么会报错,在默认情况下Spring实例化的MessageSource对象是DelegatingMessageSource这是一个空的实现。要能使的我们的国际化资源生效,你还需要在配置文件中进行如下配置:

spring:  messages:basename:i18n/message#这里根据自己实际情况自定义basename

这样配置后,SpringBoot会自动注册ResourceBundleMessageSource对象。

其实我们也可以不使用MessageSource,而直接注入ApplicationContext对象,如下示例:

@Resourceprivate ConfigurableApplicationContext context ;Stringmessage = context.getMessage("pack.info.message",   new Object[] {"张三"}, "我是默认消息", Locale.CHINA) ;

通过ApplicationContext对象获取资源消息,起内部还是使用的上面的MessageSource。

6.事件发布对象

在项目中你要发布事件你可以通过ApplicationContext对象来发布,如下示例:

@Resourceprivate ConfigurableApplicationContext context ;// 发布事件context.publishEvent(new TxApplicationEvent(context)) ;

一般在项目中通过上面的方式发布一个事件。而实际Spring为我们还注册了一个ApplicationEventMulticaster对象,该对象专门用来广播事件。

@Resourceprivate ApplicationEventMulticaster eventMulticast ;eventMulticast.multicastEvent(newTxApplicationEvent(context));

我们也可以自定义beanName为applicationEventMulticaster的Bean对象实现自定义。

7. 优雅关闭服务

如果你是内嵌Tomcat启动(以Jar包形式)SpringBoot项目,那么会向容器中注册一个WebServerGracefulShutdownLifecycle对象,通过该对象你可以优雅的关闭服务。

@ResourceprivateWebServerGracefulShutdownLifecyclewebServerGracefullShutdown;public void shutdownWebServer() {  webServerGracefullShutdown.stop(() -> {    System.out.println("优雅关闭Web Server");    context.close() ;  }) ;}

注意:你还需要开启如下配置

server:  shutdown: graceful

当执行上面动作,输出如下

当然,你也可以通过actuator来进行优雅的关闭webserver。

以上是本篇文章的全部内容,如对你有帮助就请作者吃个棒棒糖🍭。

推荐文章

这才是Spring为什么不支持static字段注入的原因【源码分析】

瞧瞧老外总结的SpringBoot最佳实践

请一定掌握SpringBoot这4个高级开发技巧

SpringBoot中Controller接口参数还可以这样玩?

警惕!SpringBoot错误发布事件,造成死锁Deadlock

Spring Boot 3太强:全新Controller接口定义方式

SpringBoot通过编程式事务提高系统性能

SpringBoot整合Flink CDC,实时追踪数据变动,无缝同步至Redis

解锁Spring资源Resource的强大功能,提升开发效率

实战Spring Cloud Gateway自定义谓词及网关过滤器

强烈建议JDK升级到17,因为这些功能

解锁Spring隐藏工具类:让你的开发效率飞升

详解Spring Cloud Task短期运行的微服务框架

基于响应式WebSocket即时通信

【分享】SpringBoot这几个小技巧还是挺实用的

本篇文章来源于微信公众号: Spring全家桶实战案例源码



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-08-02