Hello World
依照编程的惯例,第一个简单的程序都是从编写“Hello World"开始。本节也依照惯例,来实现一个Spring Boot版本的“Hello World"应用。
该“Hello World”"应用可以基于上一节中实现的itializr-start项目做少量的调整。“Hello World”应用是我们将要编写的一个最简单的Web项目。当我们访问项目时,界面会打印出“Hello World"的字样。
编写项目构建信息
我们创建一个新的hello-world目录,并复制在上一节用到的样例程序initializr-start的源码,到新的hello-world目录下,当然相关的编译文件(如build、.gradle 等目录下的文件)就不需要复制了。
最终,我们新项目的根目录下会有gradle、 src 目录及build.gradle、gradlew.bat、 gradlew。 在该项目上做一点小变更,就能生成一个新项目的构建信息。
打开build.gradle文件,做- - 下修改变更。默认情况下, Spring Boot的版本都是0.0.1-SNAPSHOT,这里改为1.0.0, 意味着是一个成熟的可用的项目。
version = '1.0.0'我们先尝试执行gradle build来对hello-world项目进行构建。$ gradle buildStarting a Gradle Daemon, 1 busy and 1 incompatible and 1 stopped Daemonscould not be reused, use --status for details> Task :test2017-09-27 23:14:29.115 INFO 15464 --- [Thread-5]o.s.w.c.s .Gener icWebAppl icationContext: Closing org. springframework.web. context. support . GenericwebAppl icationContext@5922b551: startup date[Wed Sep 27 23:14:27 CST 2017]; root of context hierarchyBUILD SUCCESSFUL in 1m 0s5 actionable tasks: 5 executed
看到上述构建信息,则说明构建信息编写正确。构建成功之后,可以在build/ibs/目录下看到一个名为hello-world-1.0.0.jar的可执行文件。
编写程序代码
现在终于可以进入编写代码的时间了。我们进入hello-world项目的sre目录下,应该能够看到com.waylau.spring.cloud.initializrstart 包及InitializrStartApplication.java 文件。为了规范,我们需要将该包名改为com.waylau.spring.cloud. weather,将Initilizistartapplicationjava更名为Application.java。
更名最好是在Java IDE ( Integrated Development Environment,集成开发环境)中进行。这样可以借助IDE的“重构”功能快速实现改名。
1.观察Application.java
打开Application.java文件,观察一下代码。
package com. waylau. spring. cloud. weather;import org.springframework.boot. SpringApplication;import org. springframework. boot. autoconfigure . SpringBootApplication;/**★主应用程序* @since 1.0.0 2017年9月27日 ★Cauthor Way Lau@Spr ingBootAppl icationpublic class Applicationpublic static void main (String[] args) {Spr ingAppl ication. run (Appl ication.class, args) ;
首先看到的是@SpringBootApplication注解。对于经常使用Spring的用户而言,很多开发者总是使用@Configuration、@EnableAutoConfiguration 和@ComponentScan注解main类。由于这些注解被如此频繁地-起使用, 于是Spring Boot提供了-一个方便的@SpringBootApplication选择,该
@SpringBootApplication注解的默认属性,等同于使用@Configuration. @EnableAutoConfiguration
和@ComponentScan三个注解组合的默认属性。即:
@SpringBootApplication= (默认属性的) @Configuration + @EnableAutoConfiguration + @ComponentScan。
它们的含义分别如下。
@Configuration:经常与@Bean组合使用,使用这两个注解就可以创建一个简单的Spring配置类,用来替代相应的XML配置文件。@Configuration 的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean 注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
●@EnableAutoConfiguration: 能够自动配置Spring 的上下文,试图猜测和配置想要的bean类,通常会自动根据类路径和Bean定义自动配置。
@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然也包括@Component下的子注解@Service、@Repository、 @Contoller。 这些bean - -般是结合@Autowired构造函数来注入。
所以,不要小看这么一-个小小的注解,其实它融汇了很多Spring里面的概念,包括自动扫描包、
自动装配bean、声明式配置等,这些都有利于最大化减少项目的配置,采用约定的方式来实现bean的依赖主人。
按照约定,声明了@SpringBootApplication注解的Application类,应处于项目的根目录下,这样才能让Spring正确扫描包,实现bean的正确注入。
2. main方法
该Application类的main方法是一一个标准的Java方法,它遵循Java对一个应用程序人口点的约定。
main方法通过调用run,将业务委托给了Spring Boot的SpringApplication 类。SpringApplication将引导我们的应用,启动Spring,相应地启动被自动配置的TomcatWeb服务器。我们需要将Application.class作为参数传递给run方法,以此告诉SpringAplication哪个是主要的Spring组件,并传递args数组以暴露所有的命令行参数。
3.编写控制器HelloController
创建com.waylau.spring. cloud.weather.controller包,用于放置控制器类。
HelloController.java的代码非常简单。当请求到/hello路径时,将会响应“Hello World!”字样的字符串给浏览器。代码如下。
package com. waylau. spring.cloud. weather .controller;import org. spr ingf ramework. web . bind. annotation . Reques tMapping;import org. springf ramework. web. bind. annotation. RestController;Hello Controller .@since 1.0.0 2017年9月27日 @author way Lau*/@RestControllerpublic class HelloController {@Reques tMapping ("/hello")public String hello() {return "Hello World! Welcome to visit waylau.com!";
其中,@RestController 等价于@Controller与@ResponseBody的组合,主要用于返回在RESTful应用常用的JSON格式数据。即:
@RestController = @Controller + @ResponseBody
其中:
@ResponseBody:该注解指示方法的返回值应绑定到Web响应正文;
@RequestMapping:是-一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。根据方法的不同,还可以用GetMap-ping、PostMapping、PutMapping、 DeleteMapping、 PatchMapping 代替;
@RestContoller:暗示用户,这是- -个支持REST的控制器。
编写测试用例
我们进入test目录下,项目已经默认包含了测试用例的包com.waylauspringcloudinitializrstart及测试类InitilizistartapplicationTests.java。我们将测试用例包更名为com.waylau.springcloud.weather,测试用例类更名为ApplicationTests.java文件。
1.编写HelloControllerTest.java测试类
相对于源程序一一对应,我们在测试用例包下创建com.waylau.spring cloud.weathercontroller包,
用于放置控制器的测试类。
测试类HelloControllerTestjava的代码如下。
package com. waylau. spring. cloud. weather .controller;import org.junit.Test;import org. junit. runner . RunWith;import org . springf ramework . beans. factory . annotation. Autowired;import org. springf ramework. boot. test. autoconfigure . web. servlet. AutoConfigureMockMvc;import org. springfr amework .boot. test. context. SpringBootTest;import org. springfr amework. http .MediaType;import org.springframework. test. context. junit4. SpringRunner;import org. springframework. test. web.servlet.MockMvc;import org. springframework. test . web. servlet. request .MockMvcRequestBuild-ers;import static org . hamcrest .Matchers. equalTo;import static org. springf ramework. test. web. servlet.result. MockMvcResultMatchers. content;import static org. springframework. test. web. servlet. result . MockMvcResultMatchers. status;/**大HelloController Test.★@since 1.0.0 2017年9月27日* Cauthor Way Lau*/@RunWith (Spr ingRunner.class@SpringBootTest@AutoConfigureMockMvcpublic class HelloControllerTest {CAutowiredprivate MockMvC mockMvc;@Testpublic void testHello() throws ExceptionmockMvc . perform (MockMvcRequestBuilders. get (" /hello") . accept(MediaType . APPLICATION_ JSON) ). andExpect (status() .isOk()). andExpect (content () . string (equalTo("Hello World!Welcome to visit waylau.com!"))) ;
2.运行测试类
用JUnit运行该测试,绿色表示该代码测试通过。
配置Gradle Wrapper
Gradle项目可以使用Gradle的安装包进行构建,也可以使用Gradle Wrapper来进行构建。使用Gradle Wrapper的好处是可以使项目的构建工具版本得到统一 。
我们修改Wrapper属性文件(位于gradle/wrapperl/gradle-wrapper.properties )中的distributionUrl属性,将其改为指定的Gradle版本,这里是采用了Gradle 4版本:
distributionUrl=https:/ /services .gradle.org/distributions/grad1e-4.0-bin. zip
或者也可以指向本地的文件:
distributionUrl-file:/D:/software/webdev/ java/gradle-4.0-a1l. zip
这样,Gradle Wrapper会自动安装Gradle的版本。
不同平台,执行不同的命令脚本。
gradlew (UNIX Shell脚本)。
gradlew.bat ( Windows批处理文件)。
运行程序
1.使用Gradle Wrapper
执行gradlew来对“hello-world” 程序进行构建。
gradlew build> Task :test2017-09-28 00:07:08.082 INFO 19516 --- [Thread-5]o.s.w.c.s . Generi cWebAppl icationContextClosing org. springf ramework.web. context. support. GenericwebAppl icationContext@ 75bb1267: startup date[Thu Sep 28 00:07:05 CST 2017]; root of context hierarchy2017-09-28 00:07:08.082 INFO 19516 --- [Thread-8]o.s.w.c.s . GenericwebAppl icationContext: Closing org. springf r amework.web. context. support . GenericWebAppl icationContext@26d413ce: startup date[Thu Sep 28 00:07:07 CST 2017]; root of context hierarchyBUILD SUCCESSFUL in 6s5 actionable tasks: 4 executed, 1 up-to-date
如果是首次使用,会先下载Gradle发布包。你可以在$USER_ HOME/gradl/wrapper/dists 下的用户主目录中找到它们。
2.运行程序
执行java -jar build/ibs/hello world-1.0.0.jar来运行程序。
$ java -jar build/ libs/hello-world-1.0.0.jar
2017-09-28 00:07:56.343 INFO 16936 ---main] C.w. spring.cloud. weather . Appl ication: Starting Application on AGOC3-705091335with PID 16936 (D: workspaceGitoscspring-cloud-microservices-developmentsampleshello-worldbuildlibs hello-world-1.0.0.jar started by Admin-istrator in D: workspaceGi toscspr ing-cloud-microservices-developmentsamples hello-world)2017-09-28 00:07:56.343INFO 16936main] C.w. spring.cloud. weather .Application: No active profile set, falling back todefault profiles: default滚动鼠标轴或单击,开始截长图2017-09-28 00:07:58. 858INFO 16936 --- [main]s.w.s.m. m.a. RequestMappingHandlerMapping : Mapped "{[/he11o]}" ontopublic java. lang. String com. waylau. spring.cloud. weather.controller.HelloController .hel1o()2017-09-28 00:07:58.874INFO 16936 --- [main]s.w.s.m.m.a. RequestMappingHandlerMapping : Mapped "{[/error]}" onto pub-lic org. spr ingf ramework . http .ResponseEntity> org . springframework.boot.autoconfigure.web. servlet.error . BasicErrorController . error (javax . servlet.http. HttpServletRequest)2017-09-28 00:07:58. 874INFO 16936 --- [main]s.w.s .m.m.a. RequestMappingHandlerMapping : Mapped "{ [/error],produces=[text/html]}" onto public org. springframework. web.servlet .ModelAndView org. spr ingf ramework . boot. autoconfigure.web.servlet.error .BasicErrorCon-troller. errorHtml (javax. servlet. http. HttpServletRequest, javax. servlet.http. HttpServletResponse)2017-09-28 00:07:58. 905INFO 16936 --- [main]o.s.w.s. handler .SimpleUrlHandlerMapping: Mapped URL path [/webjars/**]onto handler of type [class org. spr ingframework . web . servlet.resource.ResourceHttpRequestHandler]2017-09-28 00:07:58.905INFO 16936 --- [main]o.s.w.s. handler .SimpleUrlHandlerMapping: Mapped URL path [/**] ontohandler of type [class org. springframework. web.servlet.resource.ResourceHttpReques tHandler]2017-09-28 00:07:58.968 INFO 16936 --- [main]o.s.w.s. handler . SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org. springframework. web.servlet. resource.Resour ceHttpReques tHandler]2017-09-28 00 : 07:59.124 INFO 16936 -- [main] o.s.j .e.a.AnnotationMBeanExporter: Registering beans for JMX exposure on startup2017-09-28 00:07:59.202 INFO 16936 --- [main] o.s.b.w.embedded. tomcat. TomcatwebServer : Tomcat started on port(s) : 8080(http)2017-09-28 00:07:59.218INFO 16936 --- [main] c.w. spring.cloud. weather . ApplicationStarted Application in 3. 438 seconds(JVM running for 3.921)
在控制台也能看到,我们所实现的/hello接口被映射到了com.waylau.spring.cloud.weather.con-troller.HelloController.hello0的方法上。
3.访问程序
在浏览器访问htpt:/ocallost:8080/hello,可以看到界面显示“Hello World! Welcome to visitwaylau.com!”的字样,如图2-3所示。
我们不难发现,原来编写-一个Spring Boot程序就是这么简单!
其他运行程序的方式
有多种运行Spring Boot程序的方式,除了,上面介绍的使用java -jar命令外,还有以下几种方式。
1.以“Java Application”运行
hello-world应用就是- -个平常的Java程序,所以可以直接在IDE里面右击项目,以“Java Ap-plication”方式来运行程序。这种方式在开发时,非常方便调试程序。
2.使用Spring Boot Gradle Plugin插件运行
Spring Boot已经内嵌了Spring Boot Gradle Plugin插件,所以可以使用Spring Boot GradlePlugin插件来运行程序。在命令行执行方式如下。
$ gradle bootRun
或者:
$ gradlew bootRun
如何将项目导入IDE
由于每位开发者对IDE都会有不同的选择,因此本书不会对这部分内容进行详细讲解,在下篇中介绍将项目导入Eclipse来进行开发的方式。
本篇文章给大家介绍的是如何来实现一个Spring Boot版本的“Hello World"应用,喜欢的朋友可以转发关注一下~~~
明天给大家介绍如何搭建开发环境,大家准时来学习哈~~~~~~~