SpringBoot(一)从零开始一个简单的springboot WEB应用
为什么写
之所以开始这个系列博客的写作,一个是因为目前公司处于整合阶段,而我们部门处于被裁员状态,没什么事,借此机会好好了解一下微服务相关的技术,之前对SpringBoot有了解,但是并未到精通的状态,所以想从最基础的写起,遇到经典的代码也会深入的分析一下,以提升自己
之前也没怎么写过博客,不知道该怎么组织整体的架构,索性就边看SpringBoot的文档编写,根据官方的节奏来一步步深入,所以有的东西可能是直接从官方文档上翻译过来的,嘻嘻~
SpringBoot版本:v2.1.3.RELEASE
依赖管理:maven
JDK版本:1.8
Spring Boot 让你很容易创建一个基于Spring的生产级的独立应用
SpringBoot的特性 1
1、创建一个独立的Spring应用
2、内嵌Tomcat、Jetty 等运行容器
3、提供一系列的启动器来简化Spring配置
4、可以自动配置Spring或者其他第三方库
5、提供生产级的特性例如metrics,health checks 和一些扩展配置
6、绝对没有对XML配置的依赖和代码生成
HelloWorld
<!-- 继承springboot的一些基本配置 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
package com.xhulife.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
然后就可以运行啦:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
.... some log here
2019-03-26 10:36:58.109 INFO 1581 --- [ main] com.xhulife.helloworld.Application : Started Application in 16.534 seconds (JVM running for 22.249)
访问http://lcoalhost:8080
如果能得到如下页面,那就证明成功啦
然后来一步步解释上面的代码的意义
spring-boot-starter-parent
节点:这是SpringBoot的基础配置,里面定义了很多杂项配置,比如编码、java的版本,其实这个节点又继承了spring-boot-dependencies
这个pom,里面定义了所有spring自身或者可能使用到的包的版本信息,所以可能在后续我们添加其他依赖包之后都不需要再写依赖的库的版本
spring-boot-starter-web
节点:这是创建一个SpringBoot Web应用的启动器,在Pom中包含这个依赖,SpringBoot就理解为你需要创建一个Web应用,并自动为你配置一个直接可用的Web容器,就可以直接使用之前了解的SpringMVC的知识,直接在这个应用上开始写。很是方便
@SpringBootApplication
这个注解其实是一个组合注解,包含了三个注解 @Configuration
表明这是一个配置类 @EnableAutoConfiguration
开启自动配置,如果没有这个注解,SpringBoot就不会再通过你的依赖再自动帮你配置了,具体机制后面再说 @ComponentScan
这个应该很熟悉,开启组件扫描,默认是扫描当前类所在包以及其子包下的类,所以当你需要托管给Spring的Bean 不在@ComponentScan
注解类的当前包或者子包下的时候,需要手动指定组件扫描的basePackages
,否则Spring无法管理相应的Bean
SpringApplication.run()
: 就把这个方法当成是一个Spring应用的启动器,毕竟Java约定就是所有的Java程序都是应该从一个main方法作为入口的。因为我们的应用是基于Spring的,我们的一切应该交给spring去管理。整个main方法 可以理解成为:以Application
为主要配置类,将外部参数args[]
传递给Spring 运行一个Spring的应用
对外提供一个接口
我们新建一个类:com.xhulife.helloworld.hello.HelloController
,注意Application
所在的包和当前包的关系,组件扫描必须能扫描到com.xhulife.helloworld.hello.HelloController
才行
package com.xhulife.helloworld.hello;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/say-hello")
public String sayHello(String name){
return "hello "+ name;
}
}
访问http://localhost:8080/say-hello?name=world
就可以得到 hello world
打包
SpringBoot是提供内嵌的Tomcat的,所以,只需要将代码打包成jar包即可。要打包SpringBoot应用,它提供maven的打包插件,需要在pom中添加如下插件:
<!-- Package as an executable jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
在对应模块的pom.xml路径下执行 mvn package
即可打包成可运行的jar,默认的路径为:target/ hello-world-2.1.3.RELEASE.jar
,这样就可以用java的命令执行这个jar包
xhulife$ java -jar target/hello-world-2.1.3.RELEASE.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
...some log here
2019-03-26 13:12:31.753 INFO 2767 --- [ main] com.xhulife.helloworld.Application : Started Application in 16.764 seconds (JVM running for 17.143)
同样访问http://localhost:8080/say-hello
可以得到hello world
打包war
有的时候,SpringBoot吸引了我们,但是公司的服务的部署不支持Jar包部署或者其他原因,我们就需要把SpringBoot应用打包成War包了,只需要做一些小的改动就可以了,首先肯定是改造pom,因为SpringBoot提供了内嵌的Tomcat,如果要打成War包运行的话,肯定是放到Tomcat等服务下去运行,这些服务本身就已经提供了Tomcat运行所需的包了,我们需要把这些包定义为provided
,让maven在打包的时候不要把这些包打到war包里面去。为什么是provided 而不是直接排除呢?我们开发调试的时候还可以用嘛,毕竟SpringBoot 的启动方式对于开发和调试还是比较方便的。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
第二个改造点就是声明打包方式了,需要添加一个packaging
节点到project
节点下
<packaging>war</packaging>
还有一个需要改造的地方就是我们的SpringBoot入口类了,因为不是以Jar的方式运行,那我们的Application
类的main方法是指定不会执行了,那么久需要提供给外部的tomcat另外的入口了,这个时候我们需要让Applicatoin
类继承SpringBootServletInitializer
并重写configure
方法,其他不用做更改
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
好啦,现在可以开始打包了 mvn package
走起,生成的war包 依旧是在target/hello-world-2.1.3.RELEASE.war
未解决问题:war包打包之后并未生成web.xml 而Tomcat能够加载并且正确运行。这个还没有找到原因
源码:https://github.com/xhulife/spring-boot-series.git