环境: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{@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverterFactory(new ConverterFactory<String, User>() {@Overridepublic <T extends User> Converter<String, T> getConverter(Class<T> targetType) {return new Converter<String, T>() {@Overridepublic 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中Controller接口参数还可以这样玩?
警惕!SpringBoot错误发布事件,造成死锁Deadlock
Spring Boot 3太强:全新Controller接口定义方式
SpringBoot整合Flink CDC,实时追踪数据变动,无缝同步至Redis
解锁Spring资源Resource的强大功能,提升开发效率
实战Spring Cloud Gateway自定义谓词及网关过滤器


本篇文章来源于微信公众号: Spring全家桶实战案例源码
微信扫描下方的二维码阅读本文

Comments NOTHING