轻量级仿 SpringBoot=嵌入式 Tomcat+SpringMVC

啥?Spring Boot 不用?——对。就只是使用 Spring MVC + Embedded Tomcat,而不用 Boot。为啥?——Boot 太重了:)

这是反智吗?Spring Boot 好好的就只是因为太重就不用?——请允许我跟你说, 优化后的 Spring MVC 几乎能做到 Spring Boot 的事情,是一个近乎 99% 完成度的平替,而且它更轻量级,何乐不为呢?Yes,让我们试试:Spring Framework without Spring Boot!

为了说明如何打造轻量级的 Spring Boot,本文分为“嵌入式 Tomcat”、“增强 Spring MVC”和“打包/部署”三个小节来介绍。

嵌入式 Tomcat

目的是通过执行main()函数即可启动 Web 程序。在上一篇文章《嵌入式 Tomcat 调校》中已经讨论了如何制定化 Tomcat,但仍未与 Spring 结合。

实际上,从 Spring MVC 时代起就支持通过 Java 注解来配置,代替古老的 XML 方式。笔者在两年之前的文章《Spring MVC 用起来还是很香的》已经介绍过。那时还未摆脱标准 Tomcat 的运行模式,而目前要做的,就是结合嵌入式 Tomcat 与 Spring MVC 两者。

因为是纯手动编码(Programmatically)达成的,所以要了解 Tomcat 加载的生命周期。当为LifecycleState.STARTING_PREP之时,才能有关键的ServletContext ctx对象,以便 Spring 绑定。

轻量级仿 SpringBoot=嵌入式 Tomcat+SpringMVC_第1张图片

完整代码在这里。

增强 SpringMVC

把应用原来的 src/main/webapp/WEB-INF,移动到 src/main/resources/WEB-INF下,把在src/main/webapp下面的所有文件,移动到 src/main/META-INF/resources 目录下。

打包与部署

Maven 打包

我们希望打出哪个环境的包,就只需要包含这个环境的配置文件即可,不想包含其他环境的配置文件,这时候可以直接在 maven 中使用 profiles 和 resources 来配置,打包时使用mvn package -P dev即可。

<profiles>
    
    <profile>
        <id>devid>
        <properties>
            <spring.profiles.active>devspring.profiles.active>
        properties>
        <activation>
            <activeByDefault>trueactiveByDefault>
        activation>
    profile>
    
    <profile>
        <id>testid>
        <properties>
            <spring.profiles.active>testspring.profiles.active>
        properties>
    profile>
    
    <profile>
        <id>prodid>
        <properties>
            <spring.profiles.active>prodspring.profiles.active>
        properties>
    profile>
profiles>
<build>
    <resources>
        <resource>
            <directory>src/main/resourcesdirectory>
            <filtering>falsefiltering>
        resource>
        <resource>
            <directory>src/main/resources.${spring.profiles.active}directory>
            <filtering>falsefiltering>
        resource>
    resources>
build>

原理如下:

maven 在构建项目时,默认是把main/resoures目录作为资源文件所在目录的,现在我们在main/conf目录下也存放了资源文件(即application.properites文件),因此需要告诉 maven 资源文件所在的目录有哪些,通过 build 元素中增加 resources 元素就可以达到这一目的。这里告诉 maven 有两个地方存在资源文件,一个是默认的 resources 目录,另一个是在src/main/conf/${env}目录下,而${env}引用的是上面 properties 元素中定义的 env 的值,而它的值引用的又是spring.profiles.active的值(其值为 dev、test 和 online 中的一个),因此,目录要么是src/main/conf/dev,要么是src/main/conf/test,要么是main/conf/online,这最终取决于参数spring.profiles.active的值。因此,根据参数spring.profiles.active的值的不同,在构建打包时最终会选择 dev、test 和 online 这三个目录中的一个中的application.properties打包到项目中来。

将应用打成一个 Fat Jar 的方式,可以用 Spring 的:

<plugin>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-maven-pluginartifactId>
  <version>1.3.3.RELEASEversion>
  <configuration>
    <mainClass>com.demo.proj.MainmainClass>
  configuration>
  <executions>
    <execution>
      <phase>packagephase>
      <goals>
        <goal>repackagegoal>
      goals>
    execution>
  executions>
plugin>

Profiles

在实际使用环境中,我们同一个应用环境可能需要在不同环境运行(开发、测试、生产等),每个环境的参数都有可能不同(连接参数、日志级别等),使用 Profiles 可以将不同环境下的参数进行拆分,并指定加载。

IDEA 配置,在 src 目录下创建 profiles 目录,安排如下图的配置文件。

轻量级仿 SpringBoot=嵌入式 Tomcat+SpringMVC_第2张图片
然后 Maven Profile 打勾即可。

轻量级仿 SpringBoot=嵌入式 Tomcat+SpringMVC_第3张图片

启动参数

开始以为要 run 配置中加入--spring.profiles.active=dev参数,其实不用,还是在 IDEA 里面选 profile 打勾即可。

小结

参考

  • SpringMVC 纯注解配置

你可能感兴趣的:(轻量级组件,spring,boot,tomcat)