最近打算把现有的系统重构成微服务。趁此机会,把springboot和springCloud两个系列的博客给写了。
根据以往的经历,系列的开篇不必粘一大堆对入门者来说看不懂的文字介绍,没有什么比一个例子更能说明“这是个什么东西”以及有啥用处、好处。
今天也不例外。今年有今年的新目标,快过年了,祝愿大家心想事成。
一个springboot项目示例
首先我们的环境版本如下:
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: D:\IDE\apache-maven-3.3.9
Java version: 1.8.0_112, vendor: Oracle Corporation
Java home: D:\Java\jdk1.8.0_112\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
(本文出自oschina博主HappyBKs的博文:https://my.oschina.net/happyBKs/blog/1621031)
下面我们用IDEA来构建一个springboot项目。
选择jdk版本,并指定springboot初始化的服务URL。选择默认的就好。你可以打开这个连接看看
https://start.spring.io/
其实它是一个在线的构建springboot的服务,自己可以通过向导创建一个初始化好的springboot项目。
这里我们用IDE中的向导即可。点击下一步:
点击下一步,选择web下的web
保存路径中最好不要出现中文和空格等。
关于maven的镜像,可以使用阿里云的那个。
完成建立项目后,可以将三个不需要的文件删除:
项目中已经帮我们配置好了基本的maven pom。这里包括:指定parent版本,指定项目编码,建立springboot及其springboot-test的依赖,并且给项目build一个springboot的maven插件。
<?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.happybks</groupId>
<artifactId>pets</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>pets</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
springboot的项目程序启动的入口,需要在类上加入@SpringBootApplication注解
项目默认一个为我们建立好了一个启动类,并注解了org.springframework.boot.autoconfigure.SpringBootApplication
package com.happybks.pets;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PetsApplication {
public static void main(String[] args) {
SpringApplication.run(PetsApplication.class, args);
}
}
另外,resouces文件夹下还有springboot的配置文件,初始为空。
test文件夹下有springboot的测试类。
package com.happybks.pets;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PetsApplicationTests {
@Test
public void contextLoads() {
}
}
然后我们启动服务:
控制台打印出:说明springboot启动OK了。
D:\Java\jdk1.8.0_112\bin\java -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=62619 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\lib\idea_rt.jar=62620:D:\Program Files\JetBrains\IntelliJ IDEA 2017.3\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_112\jre\lib\charsets.jar;D:\Java\jdk1.8.0_112\jre\lib\deploy.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_112\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_112\jre\lib\javaws.jar;D:\Java\jdk1.8.0_112\jre\lib\jce.jar;D:\Java\jdk1.8.0_112\jre\lib\jfr.jar;D:\Java\jdk1.8.0_112\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_112\jre\lib\jsse.jar;D:\Java\jdk1.8.0_112\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_112\jre\lib\plugin.jar;D:\Java\jdk1.8.0_112\jre\lib\resources.jar;D:\Java\jdk1.8.0_112\jre\lib\rt.jar;F:\Users\Neil\IdeaProjects\pets\target\classes;C:\Users\Neil\.m2\repository\org\springframework\boot\spring-boot-starter-web\1.5.10.RELEASE\spring-boot-starter-web-1.5.10.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\boot\spring-boot-starter\1.5.10.RELEASE\spring-boot-starter-1.5.10.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\boot\spring-boot\1.5.10.RELEASE\spring-boot-1.5.10.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\1.5.10.RELEASE\spring-boot-autoconfigure-1.5.10.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\boot\spring-boot-starter-logging\1.5.10.RELEASE\spring-boot-starter-logging-1.5.10.RELEASE.jar;C:\Users\Neil\.m2\repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;C:\Users\Neil\.m2\repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;C:\Users\Neil\.m2\repository\org\slf4j\jcl-over-slf4j\1.7.25\jcl-over-slf4j-1.7.25.jar;C:\Users\Neil\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\Neil\.m2\repository\org\slf4j\log4j-over-slf4j\1.7.25\log4j-over-slf4j-1.7.25.jar;C:\Users\Neil\.m2\repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;C:\Users\Neil\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\1.5.10.RELEASE\spring-boot-starter-tomcat-1.5.10.RELEASE.jar;C:\Users\Neil\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.27\tomcat-embed-core-8.5.27.jar;C:\Users\Neil\.m2\repository\org\apache\tomcat\tomcat-annotations-api\8.5.27\tomcat-annotations-api-8.5.27.jar;C:\Users\Neil\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.27\tomcat-embed-el-8.5.27.jar;C:\Users\Neil\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.27\tomcat-embed-websocket-8.5.27.jar;C:\Users\Neil\.m2\repository\org\hibernate\hibernate-validator\5.3.6.Final\hibernate-validator-5.3.6.Final.jar;C:\Users\Neil\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\Neil\.m2\repository\org\jboss\logging\jboss-logging\3.3.1.Final\jboss-logging-3.3.1.Final.jar;C:\Users\Neil\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\Neil\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.8.10\jackson-databind-2.8.10.jar;C:\Users\Neil\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;C:\Users\Neil\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.8.10\jackson-core-2.8.10.jar;C:\Users\Neil\.m2\repository\org\springframework\spring-web\4.3.14.RELEASE\spring-web-4.3.14.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\spring-aop\4.3.14.RELEASE\spring-aop-4.3.14.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\spring-beans\4.3.14.RELEASE\spring-beans-4.3.14.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\spring-context\4.3.14.RELEASE\spring-context-4.3.14.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\spring-webmvc\4.3.14.RELEASE\spring-webmvc-4.3.14.RELEASE.jar;C:\Users\Neil\.m2\repository\org\springframework\spring-expression\4.3.14.RELEASE\spring-expression-4.3.14.RELEASE.jar;C:\Users\Neil\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\Neil\.m2\repository\org\springframework\spring-core\4.3.14.RELEASE\spring-core-4.3.14.RELEASE.jar com.happybks.pets.PetsApplication
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.10.RELEASE)
2018-02-10 15:51:06.115 INFO 48676 --- [ main] com.happybks.pets.PetsApplication : Starting PetsApplication on MSI with PID 48676 (F:\Users\Neil\IdeaProjects\pets\target\classes started by Neil in F:\Users\Neil\IdeaProjects\pets)
2018-02-10 15:51:06.126 INFO 48676 --- [ main] com.happybks.pets.PetsApplication : No active profile set, falling back to default profiles: default
2018-02-10 15:51:06.171 INFO 48676 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@50de0926: startup date [Sat Feb 10 15:51:06 GMT+08:00 2018]; root of context hierarchy
2018-02-10 15:51:07.107 INFO 48676 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-02-10 15:51:07.125 INFO 48676 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2018-02-10 15:51:07.126 INFO 48676 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.27
2018-02-10 15:51:07.212 INFO 48676 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2018-02-10 15:51:07.213 INFO 48676 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1055 ms
2018-02-10 15:51:07.308 INFO 48676 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2018-02-10 15:51:07.311 INFO 48676 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-02-10 15:51:07.311 INFO 48676 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-02-10 15:51:07.311 INFO 48676 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-02-10 15:51:07.311 INFO 48676 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2018-02-10 15:51:07.549 INFO 48676 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@50de0926: startup date [Sat Feb 10 15:51:06 GMT+08:00 2018]; root of context hierarchy
2018-02-10 15:51:07.592 INFO 48676 --- [ 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)
2018-02-10 15:51:07.593 INFO 48676 --- [ 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)
2018-02-10 15:51:07.614 INFO 48676 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-02-10 15:51:07.614 INFO 48676 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-02-10 15:51:07.637 INFO 48676 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-02-10 15:51:07.727 INFO 48676 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-02-10 15:51:07.784 INFO 48676 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-02-10 15:51:07.789 INFO 48676 --- [ main] com.happybks.pets.PetsApplication : Started PetsApplication in 2.116 seconds (JVM running for 4.683)
注意,这里默认已经有了一个内嵌的tomcat服务,不需要我们再另外配置server。
2018-02-10 15:51:07.784 INFO 48676 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
这个时候web服务已经启动,但是没有内容:
我们来添加一个controller。
package com.happybks.pets;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloHappyBKsController {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String sayHello(){
return "Hello! I am HappyBKs, from Oschina! ";
}
}
重启服务:访问http://localhost:8080/hello
springBoot的三种启动方式
(1)使用IDEA启动
以上是springboot的一种启动方式,即在IDE开发工具IDEA中启动。
(2)使用mvn启动
下面介绍另一个启动方式:使用mvn启动springboot
首先,请进入到项目目录下
然后输入:mvn spring-boot:run
然后一会看到一大堆mvn下载springboot各种组件的刷屏。最后当你再次看到springboot的LOGO出现,并加载了项目的控制器等类后,springboot就成功启动了
注意,这里可以看到tomcat相关的配置及端口:
(3)mvn install编译生成出项目的jar,然后运行jar
载项目目录下,使用mvn install进行编译
然后又是一大堆下载。
之后,我们可以看到,在项目target文件夹下,生成了一个pets-0.0.1-SNAPSHOT.jar
我们运行这个jar包:
springboot依然可以启动: