使用SpringBoot入门案例

使用SpringBoot入门案例

一、创建项目

二、给根项目UnicomCmp的pom.xml,加入parent节点(spring-boot-starter-parent)

    <!--Add Spring boot Parent-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
    </parent>

三、为子模块UnicomCmp-Web的pom.xml添加下列依赖

    <dependencies>
        <!--SpringBoot核心模块,包括自动配置支持、日志和YAML-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--Web模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--测试模块,包括JUnit、Hamcrest、Mockito-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--加载yml配置文件使用。-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
        <!--自动Get、Set-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

四、添加项目包,整理项目结构

说明,子模块的pom中加入的依赖项:spring-boot-starter-test、spring-boot-configuration-
processor、lombok不是必需的。因为演示例子中,加入了对yml配置转换为封装实体的样例。所以加入了spring-boot-
configuration-processor、lombok。

五、在build包下加入ApplicationServer.java的结构如下:

package com.yungoal.build;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;


@ComponentScan({"com.yungoal"})
@SpringBootApplication
@PropertySource({"classpath:config/resource.properties"})
public class ApplicationServer {
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(ApplicationServer.class);
        application.setBannerMode(Banner.Mode.OFF);//关闭启动时的Banner展示
        application.run(args);

        //等价用法
        //SpringApplication.run(ApplicationServer.class, args);
    }
}

六、在resources/application.yml中结构如下:

server:
  address: 0.0.0.0
  port: 8080
  servlet:
    context-path: /app
  tomcat:
    uri-encoding: utf-8


constant:
  company: Yungoal
  address: 北京市上地九街数码科技广场

七、在resources/config/resource.properties中结构如下:

person.name: Sindrol

八、在constant常量文件夹下ConstantSetting.java中结构如下:

package com.yungoal.constant;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@ConfigurationProperties(prefix = "constant")
public class ConstantSetting {
    private String company;
    private String address;
}

注意,这里使用的@ConfigurationProperties用来标注一个类,上文中将yml中前缀为constant的值映射到此实体中,它需要spring-
boot-configuration-processor包依赖。@Data 是为实体类自动生成get、set。

九、在config夹中ApplicationConfig.java类中,内容如下:

package com.yungoal.config;

import com.yungoal.constant.ConstantSetting;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
    public ApplicationConfig() {
        System.out.println("ApplicationConfig inited ...");
    }

    @Bean
    public ConstantSetting constantSetting() {
        return new ConstantSetting();
    }
}

说明:@Configuration表示一个Spring的xml配置文件。@Bean表示Spring的配置文件中的Bean配置。

十、简单调用

在domain中添加一实体:TestEntry.java,内容如下:

package com.yungoal.domain;

import lombok.Data;

@Data
public class TestEntry {
    private Integer id;
    private String name;
}

在controller中建一个HelloController控制器,然后内容如下:

package com.yungoal.controller;

import com.yungoal.constant.ConstantSetting;
import com.yungoal.domain.TestEntry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.lang.Nullable;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.annotation.RequestScope;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.ref.ReferenceQueue;
import java.nio.file.Files;
import java.util.List;

@RestController
public class HelloController {

    /*
     * 在ApplicationServer中使用了PropertySource配置了properties源后,从相应的源如resource.properties中加载值。
     * */
    @Value("${person.name}")
    private String name;

    /*
     *  Autowired区别于Resource的不同处在于,Autowired是按类别导入,如果想指定名称,可以配合Qualifier使用。
     * */
    // @Autowired
    // @Qualifier("constantSetting")
    @Resource
    private ConstantSetting constantSetting;

    /*
     * 最简单的使用
     * */
    @RequestMapping("/hello")
    public String hello() {
        return "hello " + name + " !" + " from company " + constantSetting.getCompany();
    }

    /*
     * 系统自动直接将实体序列化为JSON返回。
     * */
    @RequestMapping("/constant")
    @ResponseBody //相当于把结果JSON处理后返回。
    public ConstantSetting constant() {
        return constantSetting;
    }

    /*
     * 当使用Post请求,Content-Type=application/json调用测试: {"id":1,"name":"Sindrol"}
     * */
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    @ResponseBody
    public TestEntry constant(@RequestBody TestEntry test) {
        return test;
    }

    /*
     * 当使用Get请求
     * */
    @GetMapping(value = "/test")
    @ResponseBody
    public TestEntry constant(@RequestParam int id, @RequestParam String name) {
        TestEntry test = new TestEntry();
        test.setId(id);
        test.setName(name);
        return test;
    }

    /*
     * 当使用Get请求,并设置响应状态
     * */
    @GetMapping(value = "/request")
    @ResponseBody
    public TestEntry request(HttpServletRequest request, HttpServletResponse response, @RequestParam int id, @RequestParam String name) {
        response.setStatus(500);
        TestEntry test = new TestEntry();
        test.setId(id);
        test.setName(name);
        return test;
    }

    /*
     * 当使用Post请求表单类型,传送的值可空
     * */
    @PostMapping(value = "/form")
    @ResponseBody
    public TestEntry form(@Nullable @RequestParam("id") Integer id, @Nullable @RequestParam("name") String name) {
        TestEntry test = new TestEntry();
        test.setId(id);
        test.setName(name);
        return test;
    }

    /*
     * 当使用Post请求form-data表单类型,注意在使用PostMan测试时,不要添加Content-Type头,会影响上传时真正使用的Content-Type的
     * */
    @PostMapping(value = "/file")
    public String form(@RequestParam("filename") MultipartFile file) {
        return "fileName:" + file.getOriginalFilename() + " fileSize:" + file.getSize() + " contentType:" + file.getContentType();
    }
}

十一、运行ApplicationServer.java中的Main函数,并在浏览器中访问 http://127.0.0.1:8080/app/hello
即可看到下列效果:(中间的app虚拟应用名称是在application.yml中的server.servlet.context-path节点配置的)


使用SpringBoot入门案例
https://www.dearcloud.cn/2018/09/06/20200310-cnblogs-old-posts/20180906-使用SpringBoot入门案例/
作者
宋兴柱
发布于
2018年9月6日
许可协议