SpringBoot全景速学1——基础搭建

2019-03-23  本文已影响0人  千淘萬漉

互联网技术的发展催生了微服务架构来适应快速变化的需求和庞大的用户群体,而Spring Boot 的一系列特性有助于实现微服务架构的落地,目前从所有技术栈来看Springboot是Java领域微服务架构最优落地技术。Spring Boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring Boot整合了所有的框架。主要有三大特性:

学习SpringBoot的核心在于:约定优于配置,而基于此思想设计出来了Spring Boot Starters,它包含了两个核心组件:自动配置代码和提供自动配置模块及其它有用的依赖,这就意味着只要在项目中引入某个 Starter,即默认拥有了该组件的使用能力,除非需要特定的配置,一般情况下只需要很少的配置或者零配置即可使用组件对应的功能。Spring Boot已经整合了主流的开源项目形成了一系列的 Starter,在Github上已整理了出来,可参考:spring-boot-starters完整列表

打包部署

1.多套环境配置

Spring的多环境配置,比如开发环境、测试环境、生产环境,在不同的环境下会有不同的DB、ZK和MQ等配置信息,Spring Boot 支持多配置文件的使用,只需要启动时指定对应的配置文件即可。

<profile>
    <id>dev</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <environment>dev</environment>
    </properties>
    <build>
        <finalName>mySpringBoot</finalName>
    </build>
</profile>

在 Spring Boot 中多环境配置⽂文件名需要满足 application-{profile}.properties 的格式。

2.指定打包方式

Maven 默认会将项目打成 jar 包,也可以显示指出打包方式。

<groupId>com.neo</groupId>
<artifactId>spring-boot-package</artifactId>
<version>1.0.0</version>
<!--指定打包⽅方式-->
<packaging>jar</packaging>

用maven命令打包的时候,在pom文件的同级目录下,执行以下命令

# mvn clean 是清除项⽬目 target ⽬目录下的⽂文件
mvn clean package
# mvn package打包,并跳过测试
mvn clean package -Dmaven.test.skip=true

Linux环境下启动jar包,采用后台守护进程的方式启动

nohup java -jar spring-boot-package-1.0.0.jar &

也可以起在启动的时候读取不同的配置文件:

nohup java -jar spring-boot-package-1.0.0.jar & --spring.profiles.active=prd

当然也可以打war包(虽然可以但是并不推荐),但是过程稍微复杂一点,需要:

一、纯净版的SpringBoot系统搭建与配置

搭建SpringBoot系统可以通过[SPRING INITIALIZR]网站来生成,或者通过IDEA来生成,在没有加入任何组件依赖的时候就是一个纯净版的SpringBoot项目,这时可以按照最佳工程结构来建立各个目录,推荐采用IDE的方式,方便在本地工具集成:

IDEA生成SpringBoot纯净项目

1.工程结构

Spring Boot框架本身并没有对工程结构有特别的要求,但是按照最佳实践的工程结构可以帮助我们减少可能会遇见的坑,尤其是Spring包扫描机制的存在,如果使用最佳实践的工程结构,可以免去不少特殊的配置工作。

myproject
    +-src
        +- main
            +- java
                  +- com.example.myproject
                        +- comm
                        +- model
                        +- repository
                        +- service
                        +- web
                        +- Application.java
            +- resources
                  +- static
                  +- templates
                  +- application.properties
            +- test
    +-pom.xml

2.热部署支持

热部署不会用在生产环境,但对于程序员开发的效率,还是有一定帮助的,所谓的热部署,就是在应用程序在不停止的情况下,实现新的部署。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

IDEA中特有的配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!-- 如果不设置fork,那么不会restart,devtools热部署不会起作用-->
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

IDEA的追加设置,将编译选项设置为自动:

快捷键 Ctrl + Shift + A,在输入框中输Registry,勾选 compile.automake.allow.when.app.running
选框。

3.单元测试

如果只需要运行 hello World,只需要一个 @Test 注解就可以了

public class HelloTest {
    @Test
    public void hello(){
         System.out.println("hello world");
    }
}

测试 Web 请求时,Spring 给出了简单的解决方案,可使用MockMVC 进行Web 测试。

@SpringBootTest
public class HelloTest {
    private MockMvc mockMvc;
    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
    }
    @Test
    public void getHello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/hello?name=yitaiCloud")
                .accept(MediaType.APPLICATION_JSON_UTF8)).andDo(print());
    }
}

二、Web集成

1.web的引入和开发

spring-boot-starter-web是 Spring Boot 对 Web 开发提供支持的组件,主要包括 RESTful,参数校验、使用 Tomcat 作为内嵌容器器等功能。

    <!--web支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

加入了以上依赖以后即可完成了对Web各种功能的支持,可以直接新建Controller,通过HTTP请求Web服务:

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(String name) {
        return "hello world," + name ;
    }
}

2.web的单元测试

Web类的单元测试,一般分为两步:

@SpringBootTest
public class WebControllerTest {

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
    }

    @Test
    public void hello() throws Exception {
        String responseString = mockMvc.perform(MockMvcRequestBuilders.
                        get("/hello?name=Tison")).andReturn()
                        .getResponse().getContentAsString();
        System.out.println("result : "+responseString);
    }
}

可通过“.andReturn().getResponse().getContentAsString(); ”获取请求的返回信息,并将返回信息转换为字符串。

3.数据校验

Spring Boot 的参数校验依赖于Hibernate-Validator来进行,Hibernate Validator 就是 JSR 规范的具体实现,它指定了整套 API,通过标注给对象属性添加约束。其中JSR规范和使用说明可以参考:JSR 303 - Bean Validation 介绍及最佳实践

编写一个WebController类和User类(包含name,age,pass属性),暴露一个saveUser方法,具体实现如下:

    @RequestMapping("/saveUser")
    public void saveUser(@Valid User user, BindingResult result) {
        System.out.println("user:"+user);
        if(result.hasErrors()) {
            List<ObjectError> list = result.getAllErrors();
            for (ObjectError error : list) {
                System.out.println(error.getCode()+ "-" + error.getDefaultMessage());
            }
        }
    }

User类加上JSR校验注解

public class User {
    @NotEmpty(message="姓名不能为空")
    private String name;
    
    @Max(value = 100, message = "年龄不能大于100岁")
    @Min(value= 18 ,message= "必须年满18岁! " )
    private int age;
    
    @NotEmpty(message="密码不能为空")
    @Length(min=6,message="密码长度不能低于6位")
    private String pass;
    //...
}

Mock请求测试:

@SpringBootTest
public class WebControllerTest {
    private MockMvc mockMvc;
    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(new WebController()).build();
    }
    @Test
    public void saveUsers() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/saveUser")
                .param("name","")
                .param("age","666")
                .param("pass","test")
        );
    }
}

可以在IDE控制台看到打印信息:

结果显示均已经触发了校验规则,返回了错误信息。

4.自定义过滤器

过滤器是Web开发中的一个重要功能,通过Filter可实现 URL 级别的权限访问控制、过滤敏感词汇、排除有
XSS 威胁的字符、记录请求日志等,一般自定义Filter可通过两步来完成:

5.Restful风格

RESTful 架构的核心概念是“资源”( Resource),访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。

客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。因此总结Restful架构总结来说就是三点:

Restful风格是目前最流行的 API 设计规范,用于 Web 数据接口的设计,它的大原则容易把握,但是细节不容易做对,SpringBoot 全面持开发 RESTful 程序:

原SpringMVC SpringBoot
@RequestMapping(value = "/xxx",method = RequestMethod.GET) @GetMapping(value="/xxx")
@RequestMapping(value = "/xxx",method = RequestMethod.POST) @PostMapping(value="/xxx")
@RequestMapping(value = "/xxx",method = RequestMethod.PUT) @PutMapping(value="/xxx")
@RequestMapping(value = "/xxx",method = RequestMethod.DELETE) @DeleteMapping(value="/xxx")

souce:理解RESTful架构

三、Swagger

Swagger(丝袜哥)是世界上最流行的 API 表达工具之一,Spring Boot 集成 Swagger 2.X 很简单,需要引入依赖并做基础配置即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>

第二步即可创建Swagger2配置类

@Configuration
@EnableSwagger2
public class Swagger2 {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.example.demo"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2构建RESTful APIs")
                .description("更多Spring Boot相关文章请关注")
                .termsOfServiceUrl("https://www.jianshu.com/u/abcf0e8f851a")
                .contact("yitaicloud")
                .version("1.0")
                .build();
    }
}

至此SpringBoot的配置就结束了,其余皆是在类、方法和Model实体类上进行注解,语法详情可以参考:swagger2注解详细说明swagger2常用注解说明两篇不错的文章。

丰富的源代码参考地址:

source code:https://github.com/ityouknow/spring-boot-leaning/tree/gitbook_column2.0

有关面试合集:

interview:https://www.jianshu.com/p/0b36d8e48c8f

上一篇下一篇

猜你喜欢

热点阅读