一 Spring-boot测试
1. 使用Spring-boott提供的测试功能需要添加以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
2. 接下来添加实体类,并为实体类添加以下注解
-
@Component
-
@ConfigurationProperties(prefix = “book”),从application.properties文件中匹配book。(yml文件也能匹配到)
package io.zhangjia.entity; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "book") public class Book { private String name; private Double price; public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } @Override public String toString() { return "Book{" + "name='" + name + '\'' + ", price=" + price + '}'; } }
3. 在test文件下,新建和项目同样的包名,并添加测试类
package io.zhangjia; import io.zhangjia.entity.Book; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBoot01ApplicationTest { @Autowired private Book book; @ Test //注意,@和Test中间并无空格,为避免编辑器bug,所以添加了空格显示 public void test() { System.out.println(book); } }
SpringBoot的测试类不需要通过getBean方式去获取对象,可以直接使用@Autowired注解将需要的类对象注入。
(注意:必须提供setter方法,否则值为NULL)
4. 在spring中,我们如果想为Book类对象赋值需要在spring的配置文件中通过属性注入来完成属性赋值,而SpringBoot可以直接在application.properties中,使用book去点属性即可为Book类的简单属性赋值:
book.name=嘎嘎 book.price=9.9
5. 此时运行SpringBoot01ApplicationTest,控制台输出:
Book{name='嘎嘎', price=9.9}
如果控制台中Book的属性显示中文乱码,请参考本站《Spring-boot简单使用》一文中的解决方法。
二. 使用application.yml
除了使用application.properties配置项目外,我们还可以使用application.yml来配置项目,我们可以来简单比较下两者语法上的不同:
application.properties语法:
server.port=8888 server.servlet.context-path=/sb book.name=嘎嘎 book.price=9.9
application.yml语法:
server: port: 8888 #注意,:和8888中间必须有空格 servlet: context-path: /sb #yaml支持松散绑定,写成驼峰命名法也可以:contextPath book: name: 嘎嘎嘎 price: 19.9
注意,冒号后面需要添加空格,以name为例,如果写成name:嘎嘎嘎,则程序会报错,另外name和price前面的缩进也应保持一致,比如name前面有10个空格,那么price后面也必须有十个空格,且如果name包含其他属性,则该属性缩进应大于10个空格。
三. 复杂类型
在上面的Book类中,我们的name和price都是简单类型,如果使用List或者map等复杂类型,可以使用以下赋值方法,首先修改实体类,添加List和Map:
@Component @ConfigurationProperties(prefix = "book") public class Book { private String name; private Double price; private List<String> chapter;//章节 private Map<String,Object> catalog;//目录 List<Map<String,Object>> lsmo; //getter,setter }
接下来就可以在application.yml中为list和map赋值
(注意:- 和 : 后面都需要添加空格)
book: name: 嘎嘎嘎 price: 19.9 chapter: Spring,SpringMVC,Mybatis catalog: c1: 第1页 c2: 第20页 c3: 第30页 lsmo: - v1: 第1页 v2: 第2页 v3: 第3页 - z1: 第1页 z2: 第2页 z3: 第3页
注意, List<Map<String,Object>>中的map的key不能使用中文。除此之外,List和map还有以下写法:
book: chapter: - Spring - SpringMVC - Mybatis catalog:{c1: 第1页,c2: 第20页, c3: 第30页}
四. 使用其他配置文件
我们一般称application.properties为主配置文件,除了主配置文件外,我们还可以创建其他配置文件,首先注释掉主配置文件的book相关的代码,然创建一个book.properties文件,来为book类的属性赋值:
book.name=java开发 book.price=10.1
此时执行测试类,还不能取到正确的属性值,我们需要为Book类,添加以下注解:
-
@PropertySource(“classpath:book.properties”):指明book.properties的路径
@Component //去主配置文件中去查找 @ConfigurationProperties(prefix = "book") //如果主配置文件中没有找到,则去book.properties中查找 @PropertySource("classpath:book.properties") public class Book { private String name; private Double price; private List<String> chapter;//章节 private Map<String,Object> catalog;//目录 .... }
使用@ConfigurationProperties和@PropertySource注解,可以映射整个配置文件。
如果使用了@ConfigurationProperties来为属性赋值,那么要提供setter方法,如果使用@Value来为属性赋值,那么不用提供setter方法
六. 创建SpringBoot项目
1. 首先点击File—>new—>project,选择Spring Initializr,然后点击下一步
2. 输入Group和Artifact:
3. 选择Web,并勾选Spring web Starter,点击next后,再点击finish即可创建完成
4. 此时我们的项目目录结构如下图,可以看到,之前需要我们一个一个手动创建的包和各类文件,IDEA都已经帮我们一键生成,并添加了相应的注解
七. 配置类
在上面的章节中,我们都是使用各类配置文件来对Book的属性进行赋值,除了使用配置文件外,我们还可以直接将Book类作为一个注解类来使用,这个配置类就相当于一个配置文件,只不过是以类的方式呈现。
1. 首先将上文中的Book类复制到本项目中,并将Book类的所有注解全部删除,然后在项目中新建config包,并添加ApplicationConfig.java,内容如下:
package io.zhangjia.springboot2.config; import io.zhangjia.springboot2.entity.Book; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration //添加此注解,代表这个是一个注解类 public class ApplicationConfig { @Bean //此注解的功能相当于之前Spring文件中的bean标签 public Book book(){ //方法名相当于之前Spring文件中的bean标签的Id属性 Book book = new Book(); book.setName("SpringBoot开发"); book.setPrice(19.9); return book; } }
2. 接下来回到测试类,进行测试:
package io.zhangjia.springboot2; import io.zhangjia.springboot2.entity.Book; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class Springboot2ApplicationTests { @Autowired private Book book; @ Test //注意,@和Test中间并无空格,为避免编辑器bug,所以添加了空格显示 public void contextLoads() { System.out.println(book); } }
控制台输出:Book{name='SpringBoot开发', price=19.9},一切正常。
看到这里大家可能会有疑问,我们将Book类作为注解类有啥用呢?确实没啥用,这里只是以此为例演示配置类的使用方法,比如我们之前SpringMVC中配置的拦截器,就可以将其作为配置类来处理。
请登录之后再进行评论