纷杂的Spring-boot-starter: 2 快速 Web 应用 开发 与 spring- boot- starter- web

在这个互联网时代,使用Spring框架除了开发少数的独立应用,大部分情况下实际上在使用SpriugnMVC开发web应用,为了帮助我们简化快速搭建并开发一个Web项目,SpringBoot为我们提供了spring-boot-starter-web自动配置模块

只要将spring-boot-starter-web加入项目的maven依赖:

< dependency> 
	< groupId> org. springframework. boot</ groupId> 
	< artifactId> spring- boot- starter- web</ artifactId> 
</ dependency>

我们就得到了一个直接可执行的web应用,当前项目下运行mvn spring-boot: run就可以直接启动一个使用了嵌入式tomcat服务请求的Web应用,只不过,我们还没有提供任何服务Web请求的Controller,所以,访问任何路径都会返回一个SpringBoot默认提供的错误页面(一般称其为whiltelable error page),我们可以在当前项目下新建一个服务根路径Web请求的Controller实现:

@RestController 
public class IndexController { 
	@RequestMapping("/") 
	public String index() { 
		return "hello, there";
	}
} 

重新运行mvn spring-boot: run 并访问http://localhost:8080,错误页面将被我们的Controller返回的消息所替代,一个简单的Web应用就这样完成了。

但是,简单的背后,其实却有很多“潜规则”(约定),我们只有充分了解了这些“潜规则”,才能更好地应用spring-boot-starter-web

项目结构层面的约定

项目结构层面与传统打包为war的Java Web应用的差异在于,静态文件和页面模板的存放位置变了,原来是放在srac/main/webapp目录下的一系列资源,现在都统一放在src/main/resources相应子目录下,比如:

  1. src/main/resources/static用于存放各类静态资源,比如css,js等
  2. src/main/resources/templates用于存放模板文件,比如*.vm

注意 当然,如果还是希望使用war包形式,而不是springboot推荐使用的独立jar包形式发布Web应用,也可以继续原来Java Web应用的项目结构约定。

SpringMVC框架层面的约定和定制

spring-boot-starter-web默认将为我们自动配置如下一些springMVC必要组件:

  • 必要的ViewResolver,比如ContentNegotiatingViewResolver和Beran-NameViewResolver
  • 将必要的Convertor、GenericConverter和Formatter等bean注册到IoC容器
  • 添加一系列的HttpMessageConvertor以便支持对Web请求和相应的类型转换
  • 自动配置和注册MessageCodesResolver
  • 其它

任何时候,如果我们对默认提供的SpringMVC组件设定不满意,可以在IoC容器中注册新的同类型的bean定义来替换,或者直接提供一个基于WebMvcConfigurerAdapter类型的bean定义来定制,甚至直接提供一个标注了@EnableWebMvc的@Configuration配置类完全接管所有SpringMVC的相关配置,自己完全重新配置

嵌入式Web容器层面的约定和定制

spring-boot-starter-web默认使用嵌入式tomcat作为web容器对外提供HTTP服务,默认将使用8080端口对外监听和提供服务

  1. 假设我们不想使用默认的嵌入式tomcat(spring-boot-starter-tomcat自动配置模块),那么可以引入spring-boot-starter-jetty或者spring-boot-starter-undertow作为替代方案
  2. 假设我们不想使用默认的8080端口,那么我们可以通过更改配置项server.port使用自己指定的端口,比如:
    server.port=9000
    spring-boot-starter-web提供了很多以server.为前缀的配置项用于对嵌入式Web容器提供配置,比如:
  • server.port
  • server.address
  • server.ssl.*
  • server.tomcat.*

如果这些依然无法满足需求,SpringBoot甚至允许我们直接对嵌入式的Web容器实例进行定制,这可以通过向IoC容器中注册一个EmbeddedServletContainerCustomizer类型的组件来对嵌入式Web容器进行定制:

public class UnveilSpringEmbeddedTomcatCustomizer implements EmbeddedServletContainerCustomizer { 
	@Override 
	public void customize( ConfigurableEmbeddedServletContainer container) { 
		container. setPort( 9999); 
		container. setContextPath("/ unveil- spring- chapter3"); 
		// ... 
	} 
}

再深入的定制则需要针对特定的嵌入式Web容器,使用实现对应的Factory并注册到IoC容器:

  • TomcatEmbeddedServletContainerFactory
  • JettyEmbeddedServletContainerFactory
  • UndertwoEmbeddedServletContainerFactory

但是,笔者认为大家几乎没有走到这一步的必要,而且建议最好也不要走到这一步,目前来看,spring-boot-starter-web提供的配置项列表已经是最简单和完备的定制方式了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值