《精通Spring MVC 4》——1.5 那就正式开始吧

  1. 云栖社区>
  2. 博客>
  3. 正文

《精通Spring MVC 4》——1.5 那就正式开始吧

异步社区 2017-05-27 14:46:46 浏览1482
展开阅读全文

本节书摘来自异步社区《精通Spring MVC 4》一书中的第1章,第1.5节,作者:【美】Geoffroy Warin著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.5 那就正式开始吧

现在Web应用已经准备就绪,先看一下它是如何编写的。在进一步学习之前,我们可以将工作的成果保存到Git上。

screenshot

在Windows下,需要安装Git bash,这可以在https://msysgit.github.io找到。在Mac下,如果你使用homebrew的话,很可能已经安装过Git了,否则的话,使用brew install git命令来进行安装。
如果要使用Git版本化我们的工作内容,那么可以在控制台中输入如下的命令:

$ cd app
$ git init

使用IntelliJ的话,要忽略自动生成的文件,即“.idea”和“*.iml”。使用Eclipse的话,应该将“.classpath”文件和“.settings”文件夹提交上去。不管是哪种情况,都要忽略“.gradle”文件夹和build文件夹。

创建一个包含如下文本内容的“.gitignore“文件:

# IntelliJ project files
.idea
*.iml

# gradle
.gradle
build

现在,我们可以将其他文件添加到Git中:

$ git add .
$ git commit -m "Generated with curl start.Spring.io"
[master (root-commit) eded363] Generated with curl start.Spring.io
4 files changed, 75 insertions(+)
create mode 100644 build.Gradle
create mode 100644 src/main/Java/com/geowarin/AppApplication.Java
create mode 100644 src/main/resources/application.properties
create mode 100644 src/test/Java/com/geowarin/AppApplicationTests.Java

1.5.1 Gradle构建
如果你还不熟悉Gradle的话,那么可以将其视为Maven的继任者,它是一个现代化的构建工具。与Maven类似,它会使用约定,例如如何组织Java应用的结构。我们的源码依然会放在“src/main/java”之中,Web应用的代码放到“src/main/webapp”之中,诸如此类。与Maven类似,我们可以使用Gradle插件来处理各种构建任务。但是,Gradle真正的闪光点在于,它允许我们使用Groovy DSL编写自己的构建任务。默认库使得管理文件、声明任务之间的依赖以及增量执行job都变得非常容易。

screenshot

如果你使用OS X的话,那么可以通过brew install gradle命令,借助brew来安装Gradle。在任意的*NIX的系统下(包括Mac),都可以使用gvm(http://gvmtool.net/)来进行安装。另外,也可以在https://Gradle.org/downloads下获取二进制分发包。
使用Gradle创建应用的第一个最佳实践就是生成Gradle包装器(wrapper)。Gradle包装器是一个小的脚本,它能够在你的代码中进行共享,从而确保会使用相同版本的Gradle来构建你的应用。

生成包装器的命令是gradle wrapper:

$ gradle wrapper
:wrapper

BUILD SUCCESSFUL

Total time: 6.699 secs

如果我们看一下新创建的文件,可以看到有两个脚本和两个目录:

$ git status -s
?? .gradle/
?? gradle/
?? gradlew
?? gradlew.bat

在“.gradle”目录中包含了Gradle二进制文件,我们不希望将其添加到版本控制之中。

前面已经忽略了这个文件和构建目录,所以可以安全地对其他内容执行git add操作:

$ git add .
$ git commit -m "Added Gradle wrapper"

gradle 目录包含了如何得到二进制文件的信息。另外两个文件是脚本:用于 Windows的批处理脚本(gradlew.bat)以及用于其他系统的shell脚本。

我们可以使用Gradle运行应用,替换借助IDE来执行应用的方式:

$ ./gradlew bootrun
执行上面的命令将会运行一个嵌入式的Tomcat,应用会位于它里面!

如图1-7所示,日志提示服务器运行在8080端口上,我们检查一下。

screenshot

图1-7

可以想象到你内心的失望,因为应用还没有为完全公开做好准备。

换句话说,在工程中,这两个文件所完成的工作内容还是很让人振奋的。我们来看一下。

首先是Gradle构建文件,也就是build.gradle:

buildscript {
    ext {
        springBootVersion = '1.2.5.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-
plugin:${springBootVersion}")
        classpath("io.spring.gradle:dependency-management-
plugin:0.5.1.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'io.spring.dependency-management'

jar {
    baseName = 'masterSpringMvc'
    version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile("org.springframework.boot:spring-boot-starter-test")
}
eclipse {
    classpath {
         containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
         containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.
eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
}

在这里,都看到了什么呢?

对Spring Boot插件的依赖,它分布在Maven中央仓库中。
我们的项目是Java工程。Gradle可以为IntelliJ或Eclipse生成IDE工程文件。
该应用将会生成JAR文件。
我们的项目的依赖是托管在Maven中央仓库中的。
类路径在生产环境下包含spring-boot-starter-web,在测试环境中,还包含spring- boot-starter-test。
针对Eclipse的一些额外配置。
Gradle包装器的版本是2.3。
Spring Boot插件将会产生一个胖(fat)JAR文件,其中包含了项目的所有依赖。要构建的话,只需输入:

./gradlew build
我们将会在“build/libs”目录下找到这个JAR文件。该目录下会包含两个文件,其中一个为胖JAR包,名为masterSpringMvc-0.0.1-SNAPSHOT.jar,另外一个是普通的JAR文件,名为masterSpringMvc-0.0.1-SNAPSHOT. jar.original,这个文件不包含任何的依赖。

screenshot

Spring Boot主要的一个优势在于将应用所需的所有内容都放到一个易于重发布的JAR文件中,其中包含了Web服务器。如果你运行java jar masterSpringMvc-0.0.1- SNAPSHOT.jar的话,Tomcat将会在8080端口上启动,就像在开发期一样。如果要将其部署到生产环境或云中,这都是相当便利的。
在这里,主要的依赖是spring-boot-starter-web,Spring Boot提供了很多的Starter,它们会对应用的很多方面进行自动化配置,这是通过提供典型的依赖和Spring配置来实现的。

例如,spring-boot-starter-web将会包含对tomcat-embedded和Spring MVC的依赖。它会自动运行Spring MVC最为常用的配置并提供一个分发器(dispatcher),使其监听“/”根路径,还会提供错误处理页面,就像之前所看到的404页面那样。除此之外,还有一个典型的视图解析器(view resolver)配置。

稍后,我们将会看到更多的内容,首先从下一节开始吧!

1.5.2 让我们看一下代码
这里将会展现运行应用的所有代码,它是一个经典的main函数,这种方式有很大的优势,因为我们可以在IDE中像运行其他程序那样运行这个应用。我们可以对其进行调试,并且不需要插件就能实现一些类的重新加载。

在开发模式下,当我们在Eclipse中保存文件或者在IntelliJ中点击“Make Project”就会触发重新加载的过程。只有JVM支持切换至新编译版本的类文件时,它才是可行的,如果修改静态变量或配置文件的话,我们必须要重新加载应用。

主类如下所示:

package masterSpringMvc;

import org.Springframework.boot.SpringApplication;
import org.Springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AppApplication {

    public static void main(String[] args) {
        SpringApplication.run(AppApplication.class, args);
    }
}

需要注意的是@SpringBootApplication注解,如果看一下这个注解的代码的话,就会发现它实际上组合了3个其他的注解,也就是@Configuration、@EnableAutoConfiguration和@ComponentScan:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {

  /**
  * Exclude specific auto-configuration classes such that they will
never be applied.
  */
  Class<?>[] exclude() default {};
}

如果你之前使用Java代码配置过Spring应用的话,那么你应该对@Configuration非常熟悉。它表明我们的这个类将会处理Spring的常规配置,如bean的声明。

@ComponentScan也是一个比较经典的注解,它会告诉Spring去哪里查找Spring组件(服务、控制器等)。在默认情况下,这个注解将会扫描当前包以及该包下面的所有子包。

在这里,比较新颖的是@EnableAutoConfiguration注解,它会指导Spring Boot发挥其魔力。如果你将其移除掉的话,就无法从Spring Boot的自动配置中收益了。

使用Spring Boot来编写MVC应用的第一步通常是在代码中添加控制器。将控制器放到controller子包中,这样它就能够被@ComponentScan注解所发现:

package masterSpringMvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @RequestMapping("/")
    @ResponseBody
    public String hello() {
        return "Hello, world!";
    }
}

现在,如果打开浏览器并访问http://localhost:8080的话,就能看到我们钟爱的“Hello, world!”被输出了出来(见图1-8)。

screenshot

图1-8

网友评论

登录后评论
0/500
评论
异步社区
+ 关注