最近在跟着程序员DD的Spring boot教程系列学习Spring boot,由于年代原因,Spring boot已经发生了一些变化,所以在这里进行一些补充。
补充的知识大多来自评论区,百度,StackOverFlow
重要提示
阅读本文前请打开程序员DD的Spring boot教程系列
Spring Boot快速入门
- 如果你使用Intellij-idea的话,可以直接通过File-New-Project-Spring Initializr 操作新建项目,会比导入从网站生成的Maven demo更加快捷。
- 在Spring mvc的
@RequestMapping
标签中,可以不添加/,Spring mvc会帮助你默认添加。 - 当前的Spring mvc中,出于支持REST的需求,形如
@RequestMapping(method="RequestMapping.GET")
标签可以简单替换成@GetMapping
标签,POST,PUT,DELETE操作同理。 - 单元测试文档中,形如
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MockServletContext.class)
@WebAppConfiguration
的类标签,需要替换成如下:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
Spring Boot开发Web应用
这里问题不多,只有一个,原例子中的th标签没有添加xmln引用,通过Alt+Enter自动添加即可。
Spring Boot工程结构推荐
没什么问题,没有细分Dao层和Entity层,合并为了Domain层,其实是符合现代开发的。
Spring Boot构建RESTful API与单元测试
这里本身没有问题,需要注意的是,此处的对象是通过HTTP头添加的,也就是基于POST方法直接添加到ModelMap中,此处的测试也是通过这样的形式测试,而下一篇内容的相似代码在这里产生了区别。
Spring Boot中使用Swagger2构建强大的RESTful API文档
这篇能看出来显然大大对Swagger2的理解不太充分,这里详细说一些。
- 对于Swagger2文档里的
@ApiImplicitParam
属性,里面的内容如果是一个uri变量,那么应该加上paramType=path
,才能正确识别。 -
dataType
是一个必须要加的属性,加了这个才能正确显示。 - 如果变量比较简单,其实默认生成的文档已经很强大了。不过最好还是手写
@ApiOperation
属性。 - Swagger2的配置文件中
.apis(RequestHandlerSelectors.basePackage("com.didispace.web"))
需要改为自己的包名,另外,contact()
方法在新版本中已经改为了新形式,请注意改动。 - 本篇中,对象是通过Body添加的,对应的测试方法也要改变,原测试方法中
request = post("/users/")
.param("id", "1")
.param("name", "测试大师")
.param("age", "20");
改为
request = post("/users/").contentType(MediaType.APPLICATION_JSON).content("{\"id\":1,\"name\":\"测试大师\",\"age\":20}");
其他地方也类似。
- 即使不使用swagger-ui库,我们也可以到处为json版本,访问/v2/api-docs就能获取json版本,并且,可以用postman导入该api,进行测试非常方便。
Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅
@Query("from User u where u.name=:name")
需要改成
@Query("select u from User u where u.name=:name")
spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop
create-drop策略测试用用就好,一般选择update策略
- 该篇中没设置hibernate的方言,这是必须要设置的
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
Spring Boot中使用Redis数据库
- 本文中Redis配置均为Spring boot给的默认配置,所以没有特殊改动根本不用写。
- Redis的工厂类RedisConfig,Spring boot有提供默认值,不用写。
- 如果你用的Redis版本大于2.8,那么Redis已经支持了类似jpa的Reporsity方式,不需要像文中一样麻烦。当需要管理自己的组件时,可以使用Redis提供的标签。
这里举例:
User类
@Entity
@RedisHash("user")
public class User{
@Id
@GeneratedValue
@org.springframework.data.annotation.Id
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer age;
//构造函数(空参数和name,age双参数),访问器略
}
只要在类上添加好RedisHash标签,并在key上添加Spring的Id标签,即可。
UserRedisRepository类
public interface UserRedisRepository extends CrudRepository<User,Long> {
}
和jpa的Repository类类似,该接口实现了CRUD操作,并尽可能多的实现了各种查询方式,对于NoSQL而言,这基本满足了所有的需求,毕竟又不支持关系数据库的复杂功能。如果需要自定义,就要实现这个接口自己去写了,写法可以直接参考文档。
可以测试一下
RedisTests类
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class RedisTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private UserRedisRepository userRedisRepository;
@Test
public void testStringRedis() throws Exception{
stringRedisTemplate.opsForValue().set("Cielo","Good Boy");
Assert.assertEquals("Good Boy",stringRedisTemplate.opsForValue().get("Cielo"));
}
@Test
public void testObjectRedis() throws Exception{
User user=new User("Cielo",20);
user.setId(1l);
userRedisRepository.save(user);
Assert.assertEquals(user.getName(),userRedisRepository.findOne(1l).getName());
}
}
这个类测试了spring提供的string类型RedisTemplate和我们自定义的userRedisReposity。
网友评论