Part2、入门(一)

来源:互联网 发布:苏57战斗机知乎 编辑:程序博客网 时间:2024/06/13 13:10

如果你想spring boot 入门或者一般意义上的spring boot 入门,这个章节是为你准备的。这个章节回答了你一些基础的问题比如what、how和why问题。通过安装文档你将获得spring boot 的一个详细介绍。我下面将建第一个spring boot程序,讨论些核心原则。

8、介绍spring boot
spring boot 使产品等级的spring应用很容易独立的创建。因为我们自以为是的创建了一个spring平台和引用了第第三方jar包,所以你能开始的时候不必很忙乱。绝大多数spring boot 程序需要一些配置。

你可以用spring boot 创建一个java应用,可以用java -jar或者打成一个传统的war包来部署。(这里注意spring boot 是可以打成jar包并用 java -jar命令来运行,这里是因为spring boot 集成了tomcat在里面),我们也提供一个命令行工具来运行“”spring 脚本“”。
我们主要的目标是:

  • 为所有的spring 开发提供一个更快更宽泛理解的入门体验;
  • 开箱即用,但是也会与默认的配置需求背离;
  • 对于一些一般性大工程提供了一些列的非功能特点(列如:嵌入式容器、安全、实时监控、健康监测、外部配置)
  • 绝对无代码生成和无xml文件配置。

9、系统环境要求
默认情况下,spring boot1.4.3.release要求java 7和spring framework 4.3.5.release或者以上。你也可以在java 6下面使用spring boot但是要有额外配置。详情见:章节8.11.11。明确的的构建项目支持是maven3.2+。

注意:尽管我们能在java7或者6下面使用spring boot,但是我们推荐尽可能使用java。

下面的嵌入式servlet容器的都是支持开箱即用的
这里写图片描述
你可以可以把spring boot 程序部署在任何一个server3.0+的容器上。

10、安装spring boot
spring boot可以用一个经典开发工具或者用一个命令行来安装。不管怎样,你需要jdk1.6或者更高的版本。在安装与之前可以用java -version来检测一下当前java版本。
如果你是一个java开发新手,或者你只想体验一下spring boot 开发,你可以第一次尝试用spring boot cli,要不是可以用经典开发工具安装介绍文档。

10.1、为java开发的安装介绍
你能用spring boot同样的方式可以作为java标准库。简单的包含一些spring-boot-*.jar文件在你的classpath下面。spring-boot不要求任何工具集成,所以你能用任何IDE或者文本编辑器。spring-boot没有特别的之处,所以你能像其他java程序一下run它,debug它。
虽热你可以复制jar包来使用它,但是我们推荐你用支持依赖的工具自动构建工具(如:maven、gradle)来使用spring-boot。

10.1.1、maven安装
spring-boot兼容apache maven3.2以上。如果你还没有安装可以去安装。

spring boot依赖要用 org.springframework.boot作为groupid。通常你的maven pom文件将继承spring-boot-starter-parent工程,并且声明一个或者多个“”starters“”依赖。
下面是一个一般的pom文件:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.example</groupId>    <artifactId>myproject</artifactId>    <version>0.0.1-SNAPSHOT</version>    <!-- Inherit defaults from Spring Boot -->    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.4.3.RELEASE</version>    </parent>    <!-- Add typical dependencies for a web application -->    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>    </dependencies>    <!-- Package as an executable jar -->    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build></project>

spring-boot-starter-parent所有的情况。有时你可能继承一个不同父类pom,或者你可能不喜欢我们的默认设置。那你可以看一下章节13.2.2,可以使用一个import范围的。
简单来讲spring-boot提供了2种方式给我们有种继承、一种导入。

10.3、升级早期的spring-boot版本
如果你升级早期的spring boot发布版本,你可以检查一下“”release notes“”在wiki,你能找到升级介绍并且里面有一些新的和值得注意的特性在每个版本里面。
升级一个已经存在CLI安装要用一个合适的打包管理命令(例如:brew upgrade),如果你是手动安装CLI的,按照标准介绍,推荐你更新PATH环境变量的,将旧的引用删除。

11、开发你的第一个spring boot 程序
我们能用java开发一个hello worldweb程序,它能突出spring boot 的主要特征。下面我们用maven 去构建这个程序,因为绝大多数IED都支持它。
在开始之前要检查一下java和maven的安装环境。
使用java -version 和mvn -v

11.1、创建一个pom

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.example</groupId>    <artifactId>myproject</artifactId>    <version>0.0.1-SNAPSHOT</version>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.4.3.RELEASE</version>    </parent>    <!-- Additional lines to be added here... --></project>

11.2、增加一个classpath依赖
spring boot 提供了大量的“”starters“”去增加jar包到你的classpath下面。我们的一个简单的程序已经使用spring-boot-starter-parent在parent里面。spring-boot-starter-parent是一个特别的启动器,它提供了一个有用的maven默认依赖。它也提供了一个依赖管理所以你可以省略version标签,他是一个“”blessed“”依赖。

当你开发一个特别类型的应用程序的时候,你很可能需要其他的“”starter“”来提供这些依赖。我们可以用mvn dependency:tree来查看我们当前有的依赖。
通过这个命名我们发现spring-boot-starter-parent自身并没有提供依赖。下面我们在pom里面添加spring-boot-starter-web依赖,在parent的下面。

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

这个时候在用mvn dependency:tree看看当前依赖,我们会发现这个时候就会有很多依赖,包括tomcat web 服务器。

11.3、写代码
为了完成应用我们要创建一个单一的jajva文件,maven默认编辑src/main/java下面的源文件,所以你要创建这样一个目录结构,然后增加一个java文件src/main/java/Example.java

import org.springframework.boot.*;import org.springframework.boot.autoconfigure.*;import org.springframework.stereotype.*;import org.springframework.web.bind.annotation.*;@RestController@EnableAutoConfigurationpublic class Example {    @RequestMapping("/")    String home() {        return "Hello World!";    }    public static void main(String[] args) throws Exception {        SpringApplication.run(Example.class, args);    }}

尽管没有很代码在这儿,但是有很多东西在工作,让我们过一下这些重要的代码吧。

11.3.1、 @RestController and @RequestMapping 注解
我们列中的第一个注解类是@RestController。它为学习spring的提供了一些建议,它是扮演着一个特别的角色。当处理进入web的请求的时候,spring将认为他是一个web @Controller。

@RequestMapping注解提供了一个路由信息。它将告诉spring路径是”/”的任何HTTP请求都会被映射成hone() 方法。@RestController注解告诉spring渲染成结果字符串直接返回给调用者。

@RestController @RequestMapping 都是属于spring mvc 注解。

11.3.2、@EnableAutoConfiguration 注解
第二个类级别的注解是@EnableAutoConfiguration。这个注解告诉spring boot 基于你添加的依赖去猜测你想怎么配置spring。自从spring-boot-starter-web添加了tomcat和spring mvc,自动配置会假设你将会开发一个web应用并设置相应的spring配置。

启动器和自动配置
通过启动器自动配置被设计工作,但是两者没有直接关联。你可以自由选择启动器以外的依赖jar包,spring boot 仍然会尽其所能自动配置应用程序。

11.3.3、mian方法
我们应用程序的最后一部分是mian方法。它是一个标准方法,遵循java公约的应用程序入口。我们的主程序被spring boot的SpringApplication类代表运行。SpringApplication将引导我们应用程序,启动spring,依次自动配置tomcat web 服务器。我们需要把Example.class作为参数传给run方法告诉SpringApplication它是spring的首要组件。通过暴露命令行参数args数组也被传。

11.4、运行列子
此时此刻我们的程序应该可以运行了。自从我们用spring-boot-starter-parentpom我们就有了一个有用目标以致我们能用来开始我们的应用程序。mvn spring-boot:run在跟目录用这个命令启动。

[INFO] Scanning for projects...[INFO][INFO] ------------------------------------------------------------------------[INFO] Building chapter1-1-2 1.0-SNAPSHOT[INFO] ------------------------------------------------------------------------[INFO][INFO] >>> spring-boot-maven-plugin:1.4.3.RELEASE:run (default-cli) @ chapter1-1-2 >>>[INFO][INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ chapter1-1-2 ---[INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] Copying 0 resource[INFO] Copying 0 resource[INFO][INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ chapter1-1-2 ---[INFO] Changes detected - recompiling the module![INFO] Compiling 1 source file to E:\worksapce\spring-cloud\chapter1-1-2\target\classes[INFO][INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ chapter1-1-2 ---[INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] skip non existing resourceDirectory E:\worksapce\spring-cloud\chapter1-1-2\src\test\resources[INFO][INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ chapter1-1-2 ---[INFO] Nothing to compile - all classes are up to date[INFO][INFO] <<< spring-boot-maven-plugin:1.4.3.RELEASE:run (default-cli) @ chapter1-1-2 <<<[INFO][INFO] --- spring-boot-maven-plugin:1.4.3.RELEASE:run (default-cli) @ chapter1-1-2 ---  .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )  '  |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot ::        (v1.4.3.RELEASE)2017-01-20 16:46:55.272  INFO 13352 --- [           main] Example                                  : Starting Example on trr-PC with PID 13352 (E:\worksapce\spring-cloud\chapter1-1-2\target\classes started by Administrator in E:\worksapce\spring-cloud\chapter1-1-2)2017-01-20 16:46:55.280  INFO 13352 --- [           main] Example                                  : No active profile set, falling back to default profiles: default2017-01-20 16:46:55.396  INFO 13352 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1aac452: startup date [Fri Jan 20 16:46:55 CST 2017]; root of context hierarchy2017-01-20 16:46:58.429  INFO 13352 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)2017-01-20 16:46:58.446  INFO 13352 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat2017-01-20 16:46:58.449  INFO 13352 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.62017-01-20 16:46:58.592  INFO 13352 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext2017-01-20 16:46:58.593  INFO 13352 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3199 ms2017-01-20 16:46:58.843  INFO 13352 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]2017-01-20 16:46:58.849  INFO 13352 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]2017-01-20 16:46:58.850  INFO 13352 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]2017-01-20 16:46:58.850  INFO 13352 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]2017-01-20 16:46:58.850  INFO 13352 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]2017-01-20 16:46:59.306  INFO 13352 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1aac452: startup date [Fri Jan 20 16:46:55 CST 2017]; root of context hierarchy2017-01-20 16:46:59.565  INFO 13352 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto java.lang.String Example.home()2017-01-20 16:46:59.571  INFO 13352 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)2017-01-20 16:46:59.572  INFO 13352 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)2017-01-20 16:46:59.632  INFO 13352 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2017-01-20 16:46:59.632  INFO 13352 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2017-01-20 16:46:59.717  INFO 13352 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]2017-01-20 16:46:59.981  INFO 13352 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup2017-01-20 16:47:00.068  INFO 13352 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)2017-01-20 16:47:00.078  INFO 13352 --- [           main] Example                                  : Started Example in 6.191 seconds (JVM running for 14.742)

这是我按照文档上启动之后的的结果。

退出使用 ctrl-c组合键。

11.5、创建一个可执行的jar包

下面去完成我们的例子,通过创建一个完全独立可执行的jar文件,它是在可以在生产上运行的。可执行的jar包有时称作’fat jars’。可执行的jar包是档案文件,它包含了除了你编译的类文件还有运行时所需要的依赖jar包。

可执行的jar和java
java不提供任何标准方法去加载这些嵌套在jar里面的jar文件(即这些jar文件它们本身就就包含一个jar文件)。如果你想发布一个独立的应用程序这可能是有问题的。
为了解决了这个问题,许多开发者使用’uber’jar。一个uber jar简单的打包所有的类,从所有的jar变成一个单一的文档文件。这种方法的问题是你很难看到你的应用中实际使用了那个库。如果在不同的jar中有相同的文件名称这也将会有问题。
spring boot 采用一个不同于uber的方法,让你去实际上直接去使用的嵌套的jar。

为了去创建一个可执行的jar,我们需要把spring-boot-maven-plugin增加到pom.xml中。在dependencies下面插入下面的内容

<build>    <plugins>        <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>        </plugin>    </plugins></build>

spring-boot-starter-parent包含了<executions>配置去绑定repackage目标。如果你不想去使用父pom的配置可以自已声明配置。
保存你的pom文件,从命令行运行mvn package

[INFO] Scanning for projects...[INFO][INFO] ------------------------------------------------------------------------[INFO] Building chapter1-1-2 1.0-SNAPSHOT[INFO] ------------------------------------------------------------------------[INFO][INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ chapter1-1-2 ---[INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] Copying 0 resource[INFO] Copying 0 resource[INFO][INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ chapter1-1-2 ---[INFO] Nothing to compile - all classes are up to date[INFO][INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ chapter1-1-2 ---[INFO] Using 'UTF-8' encoding to copy filtered resources.[INFO] skip non existing resourceDirectory E:\worksapce\spring-cloud\chapter1-1-2\src\test\resources[INFO][INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ chapter1-1-2 ---[INFO] Nothing to compile - all classes are up to date[INFO][INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ chapter1-1-2 ---[INFO] No tests to run.[INFO][INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ chapter1-1-2 ---[INFO] Building jar: E:\worksapce\spring-cloud\chapter1-1-2\target\chapter1-1-2-1.0-SNAPSHOT.jar[INFO][INFO] --- spring-boot-maven-plugin:1.4.3.RELEASE:repackage (default) @ chapter1-1-2 ---[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 21.841s[INFO] Finished at: Sun Jan 22 14:34:20 CST 2017[INFO] Final Memory: 11M/27M

以上是我工程打包结果。
这个时候我们到target目录下面可以看到jar文件。

2017/01/22  14:34    <DIR>          .2017/01/22  14:34    <DIR>          ..2017/01/22  14:34        14,201,687 chapter1-1-2-1.0-SNAPSHOT.jar2017/01/22  14:34             2,490 chapter1-1-2-1.0-SNAPSHOT.jar.original2017/01/20  16:46    <DIR>          classes2017/01/20  16:35    <DIR>          generated-sources2017/01/18  16:54    <DIR>          maven-archiver2017/01/18  16:54    <DIR>          maven-status               2 个文件     14,204,177 字节                                                                                                                                                                                         6 个目录 80,788,738,048 可用字节        

如果想看里面的目录结构可以用jar -tvf看看。
我们也看到下面有那个相似地jar文件在这个target目录下面。在sring boot重新打包之前由maven来创建的这个jar.original。
去运行这个应用,用java -jar命令。

12、下一个读什么
希望本章节为您提供的一些spring boot基础,让您用您的方式来编写您的应用。如果您是一个任务导向型的开发者,你可以跳过spring.io,check出一些‘我用spring怎么做的’开始指南,我们也有参开指南how-to参考文档。

spring boot git库里面也有一堆的你能运行的示列。这些示列与代码的其余部分无关(你不用去生成其余部分去运行)。

下面的逻辑步骤是读第三部分’使用spring boot’。如果你不耐烦,你可以直接跳过去,去读spring boot特性。

0 0
原创粉丝点击