美文网首页
Spring Boot - 初探

Spring Boot - 初探

作者: yuanzicheng | 来源:发表于2017-07-30 22:18 被阅读32次

    在以往以及当前的Java开发工作中,Spring这个一站式框架发挥了重要的作用。

    然而,当我们的项目越来越复杂的时候,铺天盖地的xml配置让我们无比烦躁,配置稍有不慎就会引起极大麻烦。究其原因,为什么要使用xml文件读取配置呢,只能说这是框架本身的一种约定,要使用框架(或者其它规范,比如Servlet)就必须遵循它的约定。那么既然是约定,为什么不把约定变得更为简洁呢,Spring Boot的出现解决了这个问题。

    Spring Boot舍弃了以往基于xml方式的配置方式,我们可以采用.properties、.yml等方式快速配置需要的项。当然这只是Spring Boot的众多特点之一。

    Features

    • 创建独立的Spring应用程序
    • 内嵌Tomcat、Jetty或Undertow(无需部署.war文件)
    • 提供自有的'starter'以简化Maven/Gradle依赖配置
    • 尽可能地自动配置Spring
    • 提供为生产准备的功能,如metrics,health checks,externalized configuration
    • 绝对无代码生成,无需xml配置

    快速开始

    http://start.spring.io提供了一键构建及下载功能,得到的项目结构如下:

    .
    ├── build.gradle
    ├── gradle
    │   └── wrapper
    │       ├── gradle-wrapper.jar
    │       └── gradle-wrapper.properties
    ├── gradlew
    ├── gradlew.bat
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── example
        │   │           └── demo
        │   │               └── DemoApplication.java
        │   └── resources
        │       └── application.properties
        └── test
            └── java
                └── com
                    └── example
                        └── demo
                            └── DemoApplicationTests.java
    
    14 directories, 8 files
    

    build.gradle配置如下,其中spring-boot-starter-web提供了web项目的依赖(如果是非web项目,则不需要此依赖)

    buildscript {
        ext {
            springBootVersion = '1.5.6.RELEASE'
        }
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        }
    }
    
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'org.springframework.boot'
    
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = 1.8
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        compile('org.springframework.boot:spring-boot-starter')
        compile('org.springframework.boot:spring-boot-starter-web')
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
    

    DemoApplication.java是程序的入口,仅需要加上@SpringBootApplication注解,并在mian方法中执行

    SpringApplication.run(DemoApplication.class, args);
    

    Spring Boot自动执行初始化;

    如果是web项目,只需要添加spring-boot-starter-web依赖,并在类上加上@Controller@RestController注解即可,无需任何配置(Spring Boot已经提供了默认配置,除非你不想使用默认配置)

    package com.example.demo.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @RequestMapping("/hello")
        public String hello(){
            return "Hello Spring Boot";
        }
    }
    

    如果是非web项目,启动时需要执行代码的话需要实现CommandLineRunner接口,否则只能执行静态方法

    @SpringBootApplication
    public class SpringbootApplication implements CommandLineRunner{
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootApplication.class, args);
        }
    
        @Override
        public void run(String... args) throws Exception {
            test();
        }
    
        public void test(){
            System.out.println("test");
        }
    }
    

    启动

    使用Gradle构建的Spring Boot项目打包、启动都非常简单

    $ gradle build
    

    还可以使用-x test参数跳过junit单元测试

    $ gradle build -x test
    

    通过gradle build生成jar后,就可以使用java -jar来运行了

    $ java -jar build/libs/demo-0.0.1-SNAPSHOT.jar
    

    如果启动时需要设置JVM参数

    java -Xms512m -Xmn512m -Xmx2g -jar build/libs/demo-0.0.1-SNAPSHOT.jar
    

    以java -jar方式启动应用是在交互模式下运行的,退出命令行应用就会中止,如果希望以后台方式运行应用程序,可以使用nohup命令执行(MacOS及Linux环境下),并加上&
    nohup命令会将输出重定向到当前目录的nohup.out文件中,如果当前目录的nohup.out文件没有创建或者写入权限,则会输出重定向到~/nohup.out。

    $ nohup java -jar bulid/lib/demo-0.0.1-SNAPSHOT.jar &
    

    还可以使用bootRun一键启动

    $ gradle bootRun
    

    停止

    关于如何优雅地停止Spring Boot应用,可以参考下面这篇文章。
    SpringBoot 实战 之 优雅终止服务

    单元测试

    常规的单元测试比较简单,这里演示下MVC的测试,使用MockMvc来模拟请求,将期望的返回结果与实际放回结果比较。

    import static org.hamcrest.core.IsEqual.equalTo;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SpringbootApplicationTests {
    
        private MockMvc mvc;
    
        @Before
        public void init() throws Exception {
            mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
        }
    
        @Test
        public void getHello() throws Exception {
            mvc.perform(MockMvcRequestBuilders.get("/hello")
                .accept(MediaType.APPLICATION_JSON))
                    .andExpect(status().isOk())
                        .andExpect(content().string(equalTo("Hello Spring Boot")));
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Spring Boot - 初探

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