
创建独立的Spring应用,是SpringBoot的首要特性
SpringBoot 1x版本中有且仅有Servlet容器实现,包括传统的Servlet和Spring Web MVC,总20版本开始增加了Reactive Web容器实现,即Spring 50 WebFlux,所以在SpringApplication API上薪资了setWebApplicationType()方法,允许程序显示的设置Web应用的枚举类型。
枚举类型如下:
NONE:非Web应用
SERVLET:
REACTIVE WEB:
主要用于服务提供、调度任务、消息处理等场景;
在传统的Spring应用中,外置容器需要启动脚本引导,随着生命周期的回调执行Spring上下文的初始化,比较有代表性的是SpringWeb的ContextLoaderListener和Web MV中的DispatchServlet,前者利用ServletContext生命周期构建Web Root Spring上下文,后者结合 Servlet生命周期创建DispatchServlet的Spring应用上下文。无论何种方式,均属于被动的回调执行,这也是为什么它们并没有完整的应用主导权的原因。
然而当SpringBoot出现嵌入式容器启动方式后,嵌入式容器称为应用的一部分,从本质上来说,它属于Spring应用上下文中的组件Beans,这些组件和其他组件均有自动装配特性组装成Spring Bean定义BeanDefinition,随着Spring应用上下文启动而注册并初始化。驱动Spring应用上下文启动的核心组件则是SpringBoot核心API,SpringApplication。
mvn archetype:generate -DgroupId=thinking-in-spring-boot -DartifactId=first-spring-boot-application -Dversion=100-SNAPSHOT -DinteractiveMode=false -Dpackage=thinkinginspringboot
运行springboot:mvn spring-boot:run
官方文档告知开发人员构建可执行jar的前提是添加spring-boot-maven-plugin到pomxml文件中。
SpringBoot可执行JAR资源结构:
在Spring Boot应用程序中,可以通过多种方式将多个对象同时传递。其中一种常见方式是将对象封装在集合中,如List,Map等。例如,可以创建一个List对象,其中包含三个不同类型的对象。然后,将该List对象作为参数传递给处理程序方法。
另一种方式是创建包含所有对象属性的单个DTO对象。在这种情况下,可以创建一个Java类,该类包含所有要传递的对象的变量。然后,将该DTO对象作为参数传递给处理程序方法。
最后,还可以使用@RequestBody注解将三个对象封装在一个请求主体中,并将其传递给Spring Boot应用程序。在处理程序方法中,可以通过从请求主体中读取数据来获取三个对象。
springboot 本身支持多种灵活的配置方式,为开发 springboot 程序带来了很大的灵活性和扩展性,但是同时由于太灵活,经常会导致明明配置了相关属性,却没有生效。
本文总结了 springboot 配置文件的原理以及多个配置文件生效的顺序。
springboot 配置文件支持灵活的路径,以及灵活的文件名,用一个变量表达式总结如下:
部分源码如下:
当满足上述变量表达式的配置文件有多个时,会有一个配置的优先级。假设
上面每个条件组合起来,则最多有配置文件如下,且顺序从上到下:
获取属性时,按从上到下的顺序遍历由上述文件生成的属性资源对象 PropertySource ,如果遇到匹配的key直接返回。
总结一下:就是如果同一个key的属性只出现一次,则直接取该值即可。如果同一个key的属性出现多次,则取顺序靠前的属性资源对象。另外其中每个文件都是可选的。
需要注意的一点是:如果在同一个 location 下配置了多个文件名一样的文件,则只会取一个,比如在 classpath:/ ,有如下两个文件 applicationyml :
则只会根据 classloader 的 classpath 列表,选取第一个出现的文件。因为 springboot 加载配置文件时最底层是使用的下面的方法:
这两个方法只会获取 classloader 类的 ucp 属性里面第一个匹配到的值。如果对 springboot 自身的机制不满意,想获取所有的classpath:/路径下面的 applicaitonyml 文件,可以使用下面的方法:
本文总结了 springboot 配置文件的原理以及多个配置文件生效的顺序。如果存在增加了配置文件或者在配置文件里面增加了属性却没有生效,可以参考上面的 springboot 配置文件表达式和配置文件生效顺序进行排查。
后面还会有一篇文章讨论基于 springboot 配置原理如何实现自定义的配置读取方式。
以上就是关于SpringBoot 特性全部的内容,包括:SpringBoot 特性、springboot怎么同时传3个对象、springboot配置文件总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)