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项目:
勾选Create a simple project
填写group Id,Artifact Id,packaging选择jar
增加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包如下:
新建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
Spring Boot自带tomcat,看到控制台Console输出包含了端口等信息如下:
启动成功。
浏览器访问
http://localhost:8080/
如图:
服务器上运行
我们在eclipse中成功运行了Spring Boot项目,但最终是需要发布到服务器上运行的。
先对项目右键maven clean 然后在项目上maven install
生成的jar包在target目录中
把jar包放到linux服务器中(如果有之前的版本,覆盖原版本的jar文件)
cd /data/
sudo mkdir demo
sudo chmod 777 /data/demo
运行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 #实时查看日志
成功运行日志如图:
停止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即可。
<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项目
基本的项目构建运行和使用(定制版)
网上还有一些其他资料使用的是官网定制的官网生成一个基础项目。
生成基础项目
2、选择构建工具Maven Project、Spring Boot版本1.3.6以及一些工程基本信息,点击“Switch to the full version.”java版本选择1.7,可参考下图所示:
3、点击Generate Project下载项目压缩包
4、解压后,使用eclipse,Import -> Existing Maven Projects -> Next ->选择解压后的文件夹-> Finsh,OK done!
项目的结构如下:
如上图所示,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,成功!