美文网首页
SpringBoot全景速学1——基础搭建

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

作者: 千淘萬漉 | 来源:发表于2019-03-23 17:01 被阅读0次

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

  • 开发和配置简单,极大简化原Spring配置,丰富的 Starters轻轻松松集成各种开源组件和解决方案。
  • 部署简单,内嵌启动容器,结合 Jenkins、Docker 自动化运维非常容易实现。
  • 监控简单,自带监控组件,结合Actuator和Admin轻松监控服务各项状态。

学习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 的格式。

  • 开发过程中在application.properties 文件中通过 spring.profiles.active 属性来设置,其值对应 {profile}
  • 生产中使用 --spring.profiles.active=dev 参数来控制加载某个配置⽂文件。

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包(虽然可以但是并不推荐),但是过程稍微复杂一点,需要:

  • 1.pakage打包选项改为war形式
  • 2.打包时pom选项排除tomcat
  • 3.在项目的启动类中继承SpringBootServletInitializer并重写configure()方法。

一、纯净版的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
  • com.example.myproject目录下:
    Application.java,建议放到根目录下面,是项目的启动类,Spring Boot 项目只能有一个 main() 方法;
    comm 目录建议放置公共的类,如全局的配置文件、工具类等;
    model 目录主要用于实体(Entity)与数据访问层(Repository);
    repository 层主要是数据库访问层代码;
    service 层主要是业务类代码;
    web 层负责页面访问控制

  • resources 目录下:
    static目录存放 web 访问的静态资源,如 js、css、图⽚片等;
    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());
    }
}
  • @Before 注解表示在测试启动的时候优先执行,用作资源初始化。
  • 类上添加 @SpringBootTest,系统会动加载 Spring Boot 容器,使用print()会将请求和相应的过程都打印出来。
  • 如果觉得print方法结果太繁杂,可注释print方法,而采用.andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("是否匹配")));,查看输出结果是否包含括号中的匹配字符串。

二、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 ;
    }
}
  • @RestController 注解相当于 @ResponseBody + @Controller 合在一起的作用,如果 Web 层的类上
    使用 @RestController 注解,就代表这个类中所有的方法都会以 JSON 的形式返回结果。
  • @RequestMapping有name属性和method属性,name指定url路径,method则指定Get还是Post。
  • 请求传参时,无论是传入String还是DTO对象信息,都能被自动JSON解析填充。

2.web的单元测试

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

  • 前置加载类资源,实例化对象
  • Mock模拟发送请求,并打印结果。
@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可通过两步来完成:

  • 实现 Filter接口,实现其中的 doFilter()方法;
  • 添加 @Configuration 注解,将自定义 Filter 加入过滤链;

5.Restful风格

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

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

  • 每一个URI代表一种资源;
  • 客户端和服务器之间,传递这种资源的某种表现层;
  • 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

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

相关文章

网友评论

      本文标题:SpringBoot全景速学1——基础搭建

      本文链接:https://www.haomeiwen.com/subject/fyyjvqtx.html