编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器

wxchong 2024-10-25 18:00:13 开源技术 11 ℃ 0 评论

Spring Boot的配置详解

在本节中,我们将重点聚焦在Spring Boot的配置方面。

理解Spring Boot的自动配置

按照“约定大于配置”的原则,Spring Boot通过扫描依赖关系来使用类路径中可用的库。对于每个pom文件中的“pring-boot-starter-*” 依赖,Spring Boot会执行默认的AutoConiguration类。

AutoConfiguration类使用*AutoConfiguration词法模式,其中*代表类库。例如,JPA 存储库的自动配置是通过JpaRepositoriesAutoConfiguration来实现的。

使用-deboug运行应用程序可以查看自动配置的相关报告。下面的命令用于显示在3.1节中“spring-boot-rest"应用的自动配置报告。

$ java -jar build/libs/spring-boot-rest-1.0.0.jar --debug

以下是自动配置类的一-些示例:

●ServerPropertiesAutoConfiguration;

●RepositoryRestMvcAutoConfiguration;

●JpaRepositoriesAutoConfiguration; .

●JmsAutoConfiguration。

如果应用程序有特殊的要求,比如需要排除某些库的自动配置,也是能够完全实现的。以下是排除DataSourceAutoConfiguration的示例。

@EnableAutoConfiguration (exclude= {DataSourceAutoConfiguration.class})

重写默认的配置值

也可以使用应用程序覆盖默认配置值。重写的配置值配置在application.properties文件中即可。

比如,如果想更改应用启动的端口号,则可以在application.properties文件中添加如下内容。

server .port=8081

这样,这个应用程序再次启动时,就会使用端口8081。

更换配置文件的位置

默认情况下,Spring Boot将所有配置外部化到application.properties文件中。但是, 它仍然是应用程序构建的一部分。

此外,可以通过设置来实现从外部读取属性。以下是设置的属性:

●spring.config.name: 配置文件名;

●spring.config.location: 配置文件的位置。

这里,spring.config.location 可以是本地文件位置。

以下命令从外部启动Spring Boot应用程序来提供配置文件。

$ java -jar build/ libs/ spring-boot-rest-1.0.0.jar -- spring . config . name=bootrest. properties

自定义配置

开发者可以将自定义属性添加到application.properties文件中。

例如,我们自定义了一个名为“ile.server.url"” 的属性在application.properties 文件中。在Spring Boot启动后,我们就能将该属性自动注入应用中。

下面是完整的例子。

@Controller
@RequestMapping("/u")
public class UserspaceController {
@Value("$ {file.server.url}")
private String fileServerUrl;
@GetMapping ("/ {username} /blogs/edit")
public ModelAndView createBlog (@PathVariable ("username") String
username, Model model) {
model . addAttribute ("blog", new Blog (null,
null, null)) ;
model . addAttribute ("fileServerUrl", fileServerUrl) ;
//文件服务
器的地址返回给客户端
return new ModelAndView (" /userspace/blogedit", "blogModel", mod-
el) ;

使用.yaml 作为配置文件

我们使用的是.yaml文件,以此来作为application.properties文件的一种替代方式。YAML与平面属性文件相比,提供了类似JSON的结构化配置。YAML数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“_”来表示,map结构里面的key/value对用冒号“:来分隔。样例如下。

spring: 
application:
name: waylau
datasource:
driverClassName: com. mysql. jdbc.Driver
url: jdbc:mysql: / /localhost/test
server:
port: 8081

profiles的支持

Spring Boot支持profiles,即不同的环境使用不同的配置。通常需要设置-一个系统属性( spring.profiles.active )或OS环境变量( SPRING_ PROFILES_ ACTIVE) 。例如,使用-D参数启动应用程序(记住将其放在主类或jar之前)。$ java -jar -Dspring . profiles.active-production

build/ libs/spring-boot-rest-1.0.0.jar

在Spring Boot中,还可以在aplication.properties中设置激活的配置文件,例如,

spring. profiles .active=production

YAML文件实际上是由“__” 行分隔的文档序列,每个文档分别解析为平坦化的映射。

如果-一个YAML文档包含-一个spring.profiles键,那么配置文件的值(逗号分隔的配置文件列表)将被反馈到Spring Enironmentaccptsrofiles)中,并且如果这些配置文件中的任何-一个被激活,那么文档被包含在最终的合并中。

例如,

server:
port: 9000
spring:
profiles: development
server:
port: 9001
spring:
profiles: production
server :
port: 0

在此示例中,默认端口为9000,但是如果Spring profile的“development" 处于激活状态,则端口为9001,如果“production” 处于激活状态,则为0。

要使.properties文件做同样的事情,可以使用“aplication-S {profile};properties”的方式来指定特定于配置文件的值。


内嵌Servlet容器

Spring Boot Web Starter 内嵌了Tomcat服务器。在应用中使用嵌人式的Servlet容器,可以方便我们来进行项目的启动和调试。

Spring Boot包括支持嵌入式Tomcat、Jetty 和Undertow服务器。默认情况下,嵌入式服务器将侦听端口 8080上的 HTTP 请求。

注册Servlet、过滤器和监听器

当使用嵌人式Servlet容器时,可以通过使用Spring bean或扫描Servlet组件从Servlet规范(如HttpSessionListener )中注册Servlet、 过滤器和所有监听器。

默认情况下,如果上下文只包含-一个Servlet, 它将映射到“/” 路径。在多个Servlet bean的情况下,bean名称将被用作路径前缀,过滤器将映射到“/*” 路径。

如果觉得基于惯例的映射不够灵活,可以使用ServletRegistrationBean. FilterRegistrationBean和ServletListenerRegistrationBean类进行完全控制。

Servlet上下文初始化

嵌人式Servlet 容器不会直接执行Servlet 3.0+的javax.servlet. ServletContainerInitializer接口或Spring的org.springframework. web.WebApplicationitializer接口。这是因为在war中运行的第三方库会带来破坏Spring Boot应用程序的风险。

如果您需要在Spring Boot应用程序中执行Servlet上下文初始化,则应注册一个实现org.springframework.boot.web.servlet.ServletContextInitializer接口的bean。onStartup 方法提供对Servlet-Context的访问,并且如果需要,可以轻松地用作现有WebApplicationInitializer的适配器。

当使用嵌人式容器时,可以使用@ServletComponentScan来自动注入启用了@WebServlet、@WebFilter和@WebListener注解的类。

需要注意的是,@ServletComponentScan 在独立部署的容器中不起作用,这是因为在独立部署的容器中将使用容器内置的发现机制。

ServletWebServerApplicationContext

Spring Boot使用一种新型的ApplicationContext 来支持嵌人式的Servlet 容器。ServletWeb-

ServerApplicationContext 就是这样- - 种特殊类型的WebApplicationContext,它通过搜索单个Serv-

letWebServerFactory bean来引导自身。通常, TomcatServletWebServerFactory 、JettyServletWebServer

Factory或UndertowServletWebServerFactory将被自动配置。

通常,开发者并不需要关心这些实现类。在大多数应用程序中将被自动配置,并将创建适当的ApplicationContext和ServletWebServerFactory。

更改内嵌Servlet容器

Spring Boot Web Starter默认使用了Tomcat 来作为内嵌的容器。在依赖中加入相应Servlet 容器的Starter,就能实现默认容器的替换,如下所示。

spring-boot- starterjetty: 使用Jetty 作为内嵌容器,可以替换spring bot-starter-tomcat。

springoboot-starter-undertow:使用Undertow作为内嵌容器,可以替换spring-boot-starter-tomcat。

可以使用Spring Environment属性配置常见的Servlet 容器的相关设置。通常将在application.properties文件中来定义属性。

常见的Servlet容器设置如下所示。

●网络设置:监听HTTP请求的端口( server.port)、绑定 到server.address 的接口地址等。

会话设置:会话是否持久( server.session.persistence)、会话超时( server.session.timeout)、会话数据的位置( server.session.store-dir )和会话cookie配置( serversession.cookie.* )错误管理:错误页面的位置( serererror.path)等。

SSL。

●HTTP压缩。

Spring Boot尽可能地尝试公开这些常见公用设置,但也会有一些特殊的配置。对于这些例外的情况,SpringBoot提供了专用命名空间来对应特定于服务器的配置(比如server.tomcat和server.undertow )。

本篇给大家讲解的是SpringBoot的配置详解+内嵌Servlet容器这两块儿的内容,觉得内容不错的朋友可以转发关注小编一下!

下篇文章将介绍基于Sprin Security 实现的基本认证及 OAuth2,大家得空可以学习一下子~~

学以致用,努力提升自己!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表