springboot学习(一)——helloworld

如下内容,若有问题,烦请指出,谢谢html

springboot出来也好久了,之前零散地学习了很多,不过很长时间了都没有在实际中使用过了,忘了很多,所以要最近准备抽时间系统的学习积累下springboot,给本身留个根。java

由于之前学过一些,这里就主要根据官方文档来学习了,可能会根据本身的理解来选择一些知识点的学习顺序。官方文档地址:https://docs.spring.io/spring-boot/docs/1.5.8.RELEASE/reference/htmlsingle/git

官方文档有十个大章节,第一章是综述,就不用太细看了,这里直接从第二章开始,也是介绍hello world的地方。
一开始就介绍了spring的四个目标:github

  • 更快地开发spring程序
  • 提供默认配置,开箱即用
  • 提供大量插件(主要是各类starter)
  • 避免代码生成以及xml配置
    上面这四个也是普通spring程序的弊病,简单来讲就是入门门槛高了,spring的各类配置是很重要的,可是项目搭建后就不多管,而后新启动一个项目又要花很长时间去配置,配置得仍是跟原来的差很少。

系统要求就是jdk1.7/servlet3.0及以上,1.6版本如何使用能够看很文档后面的说明。官方内嵌支持三种servlet容器,最多见的tomcat,而后是jetty以及undertow(jboss默认的),tomcat是默认的,如何servlet容器替换后面会有内容讲解。web

第10小章是讲解如何生成springboot的基础项目,这个是给缺乏基础的初学者看的,能够不用太关注,若是想生成,能够直接用https://start.spring.io/ 这个。spring

11小章开始正篇。
基础的helloworld很简单,先配置maven文件,强烈建议使用springboot提供的parent,不要本身一个个去单独依赖,这个parent自己写的比较好,能够做为不少项目的参考。若是你有必定的基础,能够不照着官方的started文档的代码来写,自己这段代码也比较少比较简单。这里我构造的项目结果以下,由于后续就主要用这个项目来学习springboot,所以就取名main,包名也尽可能作到规范
数据库

具体代码以下
pom.xmlapache

<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>pr.study.springboot</groupId>
  <artifactId>main</artifactId>
  <version>1.0.0</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.8.RELEASE</version>
  </parent>

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

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

Main,java浏览器

package pr.study.springboot;

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

@SpringBootApplication
public class Main {

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

HelloWorldController.classtomcat

package pr.study.springboot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

几点说明:
一、由于springboot-parent中的dependencies是使用dependencyManagement的形式,这种形式的依赖不会强制继承,必须在子pom中显式声明才会继承,可是不用声明版本,声明了版本会提示一个warning。

二、继承spring-boot-maven-plugin是为了利用springboot的fat-jar打包功能,和dependency同样,也是使用Management的形式,须要显式声明才会依赖。

三、Main.class咱们编写的代码的启动入口类,使用spring-boot-maven-plugin打包成jar并用java -jar启动时,这个类并非真正应用程序入口类Main-Class。

四、官方的代码中controller和main函数写在一个类中,所以能够不须要SpringBootApplication这个注解,写在不一样的类中就须要这个注解,不然扫描不到controller。经过源码能够知道@SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan,它具备ComponentScan的做用,所以不须要像spring程序那样显式指定包扫描.

五、@EnableAutoConfiguration,这个注解后面表明的一系列功能是springboot的核心之一,自动配置,这个注解解决了不少配置问题。他的基本原理就是经过你的maven依赖来猜出你须要注入那些bean,它会帮你启动相关配置并注入这个bean。这里咱们依赖了spring-boot-starter-web,它就会帮咱们开启springmvc相关的配置并自动注入相关的必须的bean。由于会自动配置并注入,因此springboot程序的依赖管理很重要没用的依赖尽可能都去掉,特别是那些数据库相关的依赖。关于springboot的自动配置,这个是重点之一,后面细说。

六、@RestController = @Controller + @@ResponseBody,也是一个复合注解,减小代码量,相似的还有@GetMapping、@PostMapping等等。

上面这六点,1-3能够经过maven相关的知识更进一步了解,具体就是maven依赖管理以及maven打包,本人没有系统的学习,知识简单了解,因此这里就不细说了。4-6在后续的springboot学习中会慢慢学习到。

运行程序能够直接在Main上运行java application做为普通java程序运行,这时候Main中的main函数就是真正的启动函数。这里是使用嵌入式tomcat做为servlet容器来运行servlet程序,因此并不须要咱们部署到tomcat。

红色标记的就是已经扫描到了并初始化成功了HelloWorldController。

打开浏览器请求 http://localhost:8080/hello 能够看到运行结果

若是运行出现这种问题

The Bean Validation API is on the classpath but no implementation could be found

那么请删除下springboot相关的本地jar包,有时候jar包下载会抽风。自己springmvc里面是依赖有hibernate-validator做为参数校验的(@Valid @Validated使用),是不该该出现这个问题的。

若是你想打包部署,由于引用了spring-boot-maven-plugin,因此直接运行 mvn clean package就能够打包,最后打包的target是一个fat-jar,也就是包含了全部依赖的可运行jar包。
打包好后,在路径下命令行输入 java -jar main-1.0.0.jar 就能够启动

你能够把 java -jar main-1.0.0.jar 写到脚本文件sh or bat中,这样就能够做为一个简单的启动脚本,而后和jar一块儿发送到目标机器上,运行启动脚本启动程序,这样就差很少就算是完成了一次简单的springboot程序的部署发布。

把这个打包好的jar解压下,简单看下结构

BOOT-INF是应用程序的主体,classes下面的就是咱们的写的代码,lib里面的就是是咱们的程序依赖的jar包
META-INF是一些基础数据,其中比较重要的就是MANIFEST.MF

Manifest-Version: 1.0
Implementation-Title: main
Implementation-Version: 1.0.0
Archiver-Version: Plexus Archiver
Built-By: pengrui
Implementation-Vendor-Id: pr.study.springboot
Spring-Boot-Version: 1.5.8.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: pr.study.springboot.Main
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.9
Build-Jdk: 1.8.0_111
Implementation-URL: http://projects.spring.io/spring-boot/main/

这个文件描述了jar的基本结构

  • Main-Class:经过java -jar 启动时应用程序启动的真正主类,java程序能够有多个main函数,可是这个类中的main函数的第一个启动的函数
  • Start-Class:咱们的springboot程序启动的类,直接运行main方法时,这个类中的main函数最早运行,经过 java -jar 运行时,这个类中main并非最早运行的,只是从这个类开始,咱们的写的那部分代码才开始运行
  • Spring-Boot-Classes:咱们写的代码存放的路径
  • Spring-Boot-Lib:咱们的依赖包存放的路径
    关于JarLauncher以及org.springframework.boot.loader.*里面的内容,我尚未研究过,这个后续再细说。

到这里,一个简单的springboot程序的编码、本地测试运行、打包、启动就都简单过了一遍,后面再一个个补充丰满。

代码相关: https://gitee.com/page12/study-springboot https://github.com/page12/study-springboot

相关文章
相关标签/搜索