程序员DD 《Spring boot教程系列》补充
最近在跟着程序员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的使用,程序员DD大大提供了一种更优雅的方法,请参考这篇:
简化Swagger使用的自制Starter:spring-boot-starter-swagger,欢迎使用和吐槽
使用非常简单,通过yml统一配置也更加方便一些。这个配置方式集成了swagger2和swagger-ui。
这篇中格式相关内容有一些欠缺,这里详细说一些。
- 对于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策略
3. 该篇中没设置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类
@RedisHash("user")
public class User{
@Id
private Long id;
private String name;
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。
中间多篇幅没有问题,略过。
需要注意的是,如果Redis和Hibernate的Repository同时作用于一个实体上时,会产生错误导致Hibernate的Repository不可用。
以及,Redis在Spring中和jpa一样支持事务,只要在相应方法上加上事务标记即可。
Spring boot中使用log4j记录日志
log4j已经旧了,而且Spring-boot原生集成了logback,后续将在此处补充logback配置信息。
Spring Boot中使用AOP统一处理Web请求日志
Spring的最主要特性之一,终于和大家见面了。
在写这篇的补充前,希望大家能理解其中一些写法的意思,DD给出的比较基础了,但是还不够全面。
这篇可以看看Spring之AOP注解配置详解
以及,aop是基于Spring的扫描去工作的而不是Spring-mvc,因此同时使用aop和web时,需要在pom.xml中先引入aop包才可以。这里简直大坑。
最后,关于aop的一些用途,可以看看这个例子:
Spring Boot中的事务管理
这里面有一个问题,DD大大对@Rollback这个注解没有详细说明,我在评论里看到几个网友都表示有疑问,我自己研究了下,在评论里进行了回复,也贴到这里:
实际上,@Rollback
标签是需要配合@Transcational
标签共同使用的,你可以理解为在Junit下对于加了Transactional标签的方法,会默认视为@Rollback(true)
,如果让这个方法不回滚,那么就要手动设置@Rollback(false)
。
程序员DD 《Spring boot教程系列》补充的更多相关文章
- (转)Spring Boot干货系列:(四)开发Web应用之Thymeleaf篇
转:http://tengj.top/2017/03/13/springboot4/ 前言 Web开发是我们平时开发中至关重要的,这里就来介绍一下Spring Boot对Web开发的支持. 正文 Sp ...
- Spring Boot干货系列:(十二)Spring Boot使用单元测试(转)
前言这次来介绍下Spring Boot中对单元测试的整合使用,本篇会通过以下4点来介绍,基本满足日常需求 Service层单元测试 Controller层单元测试 新断言assertThat使用 单元 ...
- 【转】Spring Boot干货系列:(一)优雅的入门篇
转自Spring Boot干货系列:(一)优雅的入门篇 前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社区中热度一直很高,所以决定花时间来了解和学习,为自己做 ...
- 【转】Spring Boot干货系列:(二)配置文件解析
转自:Spring Boot干货系列:(二)配置文件解析 前言 上一篇介绍了Spring Boot的入门,知道了Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此 ...
- 【转】Spring Boot干货系列:常用属性汇总
转自Spring Boot干货系列:常用属性汇总 附录A.常用应用程序属性 摘自:http://docs.spring.io/spring-boot/docs/current/reference/ht ...
- Spring Boot干货系列:(一)优雅的入门篇
Spring Boot干货系列:(一)优雅的入门篇 2017-02-26 嘟嘟MD 嘟爷java超神学堂 前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社 ...
- Spring Boot教程(十六)属性配置文件详解(1)
相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...
- 【转】Spring Boot干货系列:(三)启动原理解析
前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开Sprin ...
- Spring Boot干货系列:(八)数据存储篇-SQL关系型数据库之JdbcTemplate的使用
Spring Boot干货系列:(八)数据存储篇-SQL关系型数据库之JdbcTemplate的使用 原创 2017-04-13 嘟嘟MD 嘟爷java超神学堂 前言 前面几章介绍了一些基础,但都是静 ...
随机推荐
- SQL2008清除数据库日志脚本
--数据库名称sjjhzx,日志文件名称ksoa_zuizhong_Log' USE sjjhzx GO ALTER DATABASE sjjhzx SET RECOVERY SIMPLE ...
- JavaScript进阶(七)JS截取字符串substr 和 substring方法的区别
JS截取字符串substr 和 substring方法的区别 substr方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参 ...
- 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践
对于公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 在首届阿里巴巴在线峰会上,阿里巴巴中间件技术部专家魏鹏为大家带来了题为<基于Java容 ...
- Hbase replication操作
1.修改hbase-site.xml文件 <property> <name>hbase.replication</name> <value>true ...
- 根据Facebook内存的管理使用,浅谈在iOS上自动检测内存泄漏问题
分装库下载:https://github.com/facebook/FBMemoryProfiler FBMemoryProfiler类库使用教程:http://ifujun.com/fbmemory ...
- linux下32位汇编调用规则
传递给系统调用的参数必须安装参数顺序一次放到寄存器中,当系统调用完成后,返回值放在eax中: 当系统调用参数<=5个时: eax中存放系统调用的功能号,传递给系统调用的参数顺序依次放到寄存器:e ...
- javac编译同一个包内的java文件
问题描述:包a.b.c里有d.java e.java f.java三个文件,其中d中包含main. 错误: 第一种:javac d.java 报错:里面用到其他类,找不到 第二种:javac *.ja ...
- rails将类常量重构到数据库对应的表中之二
在博文之一中我们将Order中的常量重构到了数据库的表中,也做了一些测试,貌似一切都很完美.可是...梦魔还未开始啊!我们少做了一步测试,就是rake test! 结果惨不忍睹,所有测试都是E,全部出 ...
- linux下让irb实现代码自动补全的功能
我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:requir ...
- WebService学习--(二)webservice相关介绍
一.WebService是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实际 ...