Spring Boot 介绍

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。
该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。
采用 Spring Boot 可以大大的简化你的开发模式,所有你想集成的常用框架,它都有对应的组件支持。
Spring Boot 是一套全新的框架,它来自于 Spring 大家族,因此 Spring 所有具备的功能它都有,而且更容易使用;Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数Spring Boot 应用只需要很少的 Spring 配置。
Spring Boot 开发了很多的应用集成包,支持绝大多数开源软件,让我们以很低的成本去集成其它主流开源软件。

Spring Boot特性

使用 Spring 项目引导页面可以在几秒构建一个项目方便对外输出各种形式的服务,比如:REST API, WebSocket, Web, Streaming, Tasks
非常简洁的安全策略集成
支持关系数据库和非关系数据库
支持运行期内嵌容器,如:Tomcat, Jetty
强大的开发包,支持热启动
自动管理依赖
自带应用监控
支持各种IED,如:IntelliJ IDEA 、NetBeans

热度

Spring Boot 本身发展特别快,自从2014年4月发布 Spring Boot1.0 之后,版本更新非常频繁,16年是1.3.X,到现在 Spring Boot 最新稳定版本为:1.5.8,2.0版本也进入了第5个里程碑。
Spring Boot一经推出就迅速的成为一门热门的技术。

使用Spring Boot的好处

其实就是简单、快速、方便!平时如果我们需要搭建一个spring web项目的时候需要怎么做呢?

1)配置web.xml,加载spring和spring mvc

2)配置数据库连接、配置spring事务

3)配置加载配置文件的读取,开启注解

4)配置日志文件

配置完成之后部署tomcat 调试

现在非常流行微服务,如果我这个项目仅仅只是需要发送一个邮件,如果我的项目仅仅是返回一个接口字段;我都需要这样折腾一遍!

但是如果使用spring boot呢?

很简单,我仅仅只需要非常少的几个配置就可以迅速方便的搭建起来一套web项目或者是构建一个微服务!

使用spring boot可以非常方便、快速搭建项目,使我们不用关心框架之间的兼容性,适用版本等各种问题,我们想使用任何东西,仅仅添加一个配置就可以,所以使用sping boot非常适合构建微服务。

学习路线

结合我们工作经验和项目要求,我设计的快速上手和实用学习路线如下:
一、基本的项目构建提供REST API运行使用
二、SpringBoot的注解和配置(xml,yml)配置解析
三、配置数据库实现增删改查
四、多数据源的配置方案以及多环境(测试内测生产环境)的配置运行
五、整合权限验证(shiro等)
六、整合微服务部署
七、使用Jenkins部署Spring Boot
八、整合Dubbo/Zookeeper
九、尝试其他功能–邮件服务
十、尝试其他功能–定时任务
十一、尝试其他功能–MQ消息服务(rabbitmq)

参考教程链接如下:
https://gitee.com/didispace/SpringBoot-Learning
http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/
https://github.com/waylau/spring-boot-tutorial

本章我们就来学习基本的项目构建提供REST API运行使用。

基本的项目构建运行和使用(最简版)

官方给出最简单的创建方法:

http://projects.spring.io/spring-boot/

新建一个Maven项目:

SpringBoot简介项目创建和运行使用_使用

勾选Create a simple project

SpringBoot简介项目创建和运行使用_运行_02

填写group Id,Artifact Id,packaging选择jar

SpringBoot简介项目创建和运行使用_运行_03

增加jdk和和Spring Boot的依赖包

在pom文件中增加配置后保存等等依赖包下载完成,内容如下:

<!-- 编译版本为JDK 1.8 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!-- Spring Boot 核心jar包 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

最终内容如下:

<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.biologic</groupId>
  <artifactId>23mofang-biologic</artifactId>
  <version>0.0.1-SNAPSHOT</version>


   <!-- 编译版本为JDK 1.8 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!-- Spring Boot 核心jar包 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

创建Package包如下:

SpringBoot简介项目创建和运行使用_运行_04

新建java文件命令为SampleController,内容如下:

package com.biologic.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
public class SampleController {

     @RequestMapping("/")
        @ResponseBody
        String home() {
            return "Hello World!";
        }

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

}

启动项目和访问api

对着右键run as运行java application

SpringBoot简介项目创建和运行使用_运行_05

Spring Boot自带tomcat,看到控制台Console输出包含了端口等信息如下:

SpringBoot简介项目创建和运行使用_使用_06

启动成功。

浏览器访问

http://localhost:8080/

如图:

SpringBoot简介项目创建和运行使用_运行_07

服务器上运行

我们在eclipse中成功运行了Spring Boot项目,但最终是需要发布到服务器上运行的。

先对项目右键maven clean 然后在项目上maven install

SpringBoot简介项目创建和运行使用_创建_08


生成的jar包在target目录中

SpringBoot简介项目创建和运行使用_SpringBoot_09

把jar包放到linux服务器中(如果有之前的版本,覆盖原版本的jar文件)

cd /data/
sudo mkdir demo
sudo chmod 777 /data/demo

SpringBoot简介项目创建和运行使用_简介_10

运行Spring Boot项目需要java的环境 如下:

[zzq@host3 ~]$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
[zzq@host3 ~]$

如果没有,可参考链接安装:
linux软件(一)—CentOS安装jdk

授予执行权限,使用nohup让Spring Boot程序后台运行命令如下:

sudo chmod a+x xxxx.jar
nohup java -jar xxxx.jar & 
或者 指定控制台输出的文件名
nohup java -jar xxxx.jar >> catalina.out 2>&1 &

需要注意的是不能单独使用&进行后台运行
例如

java -jar xxxx.jar >> catalina.out 2>&1 &

这种方式会让程序看起来已经后台运行,其实还是依赖ssh窗口,ssh窗口一关闭则服务停止,所以启动springboot服务一定要使用nohup。

nohup会输出日志文件,日志文件可以自定义文件名,默认为nohup.out

查看日志

cat nohup.out  #全量输出nohup.out是文件名称
tail -f -n 200 nohup.out #实时查看日志

成功运行日志如图:

SpringBoot简介项目创建和运行使用_使用_11

停止Spring Boot的方法
查看java进程的命令

ps -ef | grep java

杀死进程

kill -9 进程号

可能遇到的问题

biologic-0.0.1-SNAPSHOT.jar中没有主清单属性
如果按照定制版获取Srping Boot项目是不会有这个问题的,但是简版的会缺乏主入口。
以定制SpringBoot为例,jar包中包含了三个文件夹:BOOT-INF,META-INF,org,可以把jar包解压到文件夹下查看,其中META-INF文件夹下有一个MANIFEST.MF文件,该文件指明了程序的入口以及版本信息等内容,如下

Manifest-Version: 1.0  
Implementation-Title: spring-xxx-xxx  
Implementation-Version: 0.0.1-SNAPSHOT  
Archiver-Version: Plexus Archiver  
Built-By: XXXX  
Implementation-Vendor-Id: com.huyikang.practice  
Spring-Boot-Version: 1.5.9.RELEASE  
Implementation-Vendor: Pivotal Software, Inc.  
Main-Class: org.springframework.boot.loader.JarLauncher  
Start-Class: com.biologic.api 
Spring-Boot-Classes: BOOT-INF/classes/  
Spring-Boot-Lib: BOOT-INF/lib/  
Created-By: Apache Maven 3.5.2  
Build-Jdk: 1.8.0_151  
Implementation-URL: http://maven.apache.org

Main-Class代表了Spring Boot中启动jar包的程序
Start-Class属性就代表了Spring Boot程序的入口类,这个类中应该有一个main方法
Spring-Boot-Classes代表了类的路径,所有编译后的class文件,以及配置文件,都存储在该路径下
Spring-Boot-Lib表示依赖的jar包存储的位置
这些值都是SpringBoot打包插件会默认生成的,如果没有这些属性,SpringBoot程序自然不能运行,就会报错:jar中没有主清单属性,也就是说没有按照SpringBoot的要求,生成这些必须的属性。

解决方法

在pom中添加一个SpringBoot的构建的插件,然后重新运行

mvn install即可。

SpringBoot简介项目创建和运行使用_简介_12

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

在运行mvn install的时候,自动生成这些主清单属性,运行java -jar xxx.jar时会根据主清单属性找到启动类,从而启动程序。

完整pom如下:

<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.biologic</groupId>
  <artifactId>23mofang-biologic</artifactId>
  <version>0.0.1-SNAPSHOT</version>


   <!-- 编译版本为JDK 1.8 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!-- Spring Boot 核心jar包 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.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>

服务器启动停止脚本化

下面几个脚本仅供参考,请根据自己需要做调整
start.sh

#!/bin/sh

rm -f tpid

APP_NAME=client-1.0-SNAPSHOT
APP_JAR=$APP_NAME".jar"

##nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件。这里指定输出文件在为./client-1.0-SNAPSHOT.log
nohup java -jar $APP_JAR > $APP_NAME".log" 2>&1 &

echo $! > $APP_NAME".tpid"

echo $APP_NAME Start Success!

stop.sh

#!/bin/sh
APP_NAME=client-1.0-SNAPSHOT

tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Stopping' $APP_NAME '...'
    kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Kill' $APP_NAME 'Process!'
    kill -9 $tpid
else
    echo $APP_NAME 'Stoped Success!'
fi

kill.sh

#!/bin/sh
APP_NAME=client-1.0-SNAPSHOT

tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Kill Process!'
    kill -9 $tpid
else
    echo $APP_NAME 'is not running!'
fi

授予执行权限

chmod +x start.sh
chmod +x stop.sh
chmod +x kill.sh

只要修改变量 $APP_NAME 就可以用这种方式运行jar项目

基本的项目构建运行和使用(定制版)

网上还有一些其他资料使用的是官网定制的官网生成一个基础项目。

生成基础项目

1、访问http://start.spring.io/

2、选择构建工具Maven Project、Spring Boot版本1.3.6以及一些工程基本信息,点击“Switch to the full version.”java版本选择1.7,可参考下图所示:

SpringBoot简介项目创建和运行使用_创建_13

3、点击Generate Project下载项目压缩包

4、解压后,使用eclipse,Import -> Existing Maven Projects -> Next ->选择解压后的文件夹-> Finsh,OK done!

项目的结构如下:

SpringBoot简介项目创建和运行使用_创建_14

如上图所示,Spring Boot的基础结构共三个文件:

l src/main/java 程序开发以及主程序入口
l src/main/resources 配置文件
l src/test/java 测试程序
另外,spingboot建议的目录结果如下:

root package结构:com.example.myproject

com
  +- example
    +- myproject
      +- Application.java
      |
      +- domain
      |  +- Customer.java
      |  +- CustomerRepository.java
      |
      +- service
      |  +- CustomerService.java
      |
      +- controller
      |  +- CustomerController.java
      |

1、Application.java 建议放到跟目录下面,主要用于做一些框架配置

2、domain 目录主要用于实体(Entity)与数据访问层(Repository)

3、service 层主要是业务类代码

4、controller 负责页面访问控制

采用默认配置可以省去很多配置,当然也可以根据自己的喜欢来进行更改

最后,启动Application main方法,至此一个java项目搭建好了!

但是如果我们要实现REST API,还需要引入web模块。

引入web模块

1、pom.xml中添加支持web的模块:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 ```
pom.xml文件中默认有两个模块:
spring-boot-starter:核心模块,包括自动配置支持、日志和YAML;
spring-boot-starter-test:测试模块,包括JUnit、Hamcrest、Mockito。


org.springframework.boot 
 spring-boot-starter <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>2、编写controller内容@RestController 
 public class HelloWorldController { 
 @RequestMapping(“/hello”) 
 public String index() { 
 return “Hello World”; 
 } 
 } 
 “`


@RestController的意思就是controller里面的方法都以json格式输出,不用再写什么jackjson配置的了!

3、启动主程序,打开浏览器访问http://localhost:8080/hello ,可以看到页面输出Hello World,成功!