一、创建项目
今天给大家讲一个SpringBoot的一个入门案例,让更多人能用起SpringBoot来。假设项目名为MyProject项目,并添加MyProject-Web的子模块。
二、给根项目MyProject的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>
三、为子模块MyProject-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.test.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.test"}) @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: MyTestCompany address: 北京市上地九街数码科技广场XXXX处
七、在resources/config/resource.properties中结构如下:
person.name: Sindrol
八、在constant常量文件夹下ConstantSetting.java中结构如下:
package com.test.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.test.config; import com.test.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.test.domain; import lombok.Data; @Data public class TestEntry { private Integer id; private String name; }
在controller中建一个HelloController控制器,然后内容如下:
package com.test.controller; import com.test.constant.ConstantSetting; import com.test.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节点配置的)