• 程序员DD 《Spring boot教程系列》补充


    最近在跟着程序员DD的Spring boot教程系列学习Spring boot,由于年代原因,Spring boot已经发生了一些变化,所以在这里进行一些补充。

    补充的知识大多来自评论区,百度,StackOverFlow

    重要提示

    阅读本文前请打开程序员DD的Spring boot教程系列

    Spring Boot快速入门

    1. 如果你使用Intellij-idea的话,可以直接通过File-New-Project-Spring Initializr 操作新建项目,会比导入从网站生成的Maven demo更加快捷。
    2. 在Spring mvc的@RequestMapping标签中,可以不添加/,Spring mvc会帮助你默认添加。
    3. 当前的Spring mvc中,出于支持REST的需求,形如@RequestMapping(method="RequestMapping.GET")标签可以简单替换成@GetMapping标签,POST,PUT,DELETE操作同理。
    4. 单元测试文档中,形如
    @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。

    这篇中格式相关内容有一些欠缺,这里详细说一些。

    1. 对于Swagger2文档里的@ApiImplicitParam属性,里面的内容如果是一个uri变量,那么应该加上paramType=path,才能正确识别。
    2. dataType是一个必须要加的属性,加了这个才能正确显示。
    3. 如果变量比较简单,其实默认生成的文档已经很强大了。不过最好还是手写@ApiOperation属性。
    4. Swagger2的配置文件中.apis(RequestHandlerSelectors.basePackage("com.didispace.web"))需要改为自己的包名,另外,contact()方法在新版本中已经改为了新形式,请注意改动。
    5. 本篇中,对象是通过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}");
    

    其他地方也类似。

    1. 即使不使用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数据库

    1. 本文中Redis配置均为Spring boot给的默认配置,所以没有特殊改动根本不用写。
    2. Redis的工厂类RedisConfig,Spring boot有提供默认值,不用写。
    3. 如果你用的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的一些用途,可以看看这个例子:

    使用AOP 实现Redis缓存注解,支持SPEL

    Spring Boot中的事务管理

    这里面有一个问题,DD大大对@Rollback这个注解没有详细说明,我在评论里看到几个网友都表示有疑问,我自己研究了下,在评论里进行了回复,也贴到这里:

    实际上,@Rollback标签是需要配合@Transcational标签共同使用的,你可以理解为在Junit下对于加了Transactional标签的方法,会默认视为@Rollback(true),如果让这个方法不回滚,那么就要手动设置@Rollback(false)

  • 相关阅读:
    UITableViewCell分隔线
    Swift:Debug和Release状态下错误输出
    开发中遇到的那些坑
    code sign error 1
    Xcode头文件加锁
    UIPageControl显示图片
    关于RTKLIB资料整理和学习
    I2C中24C02从地址设置
    从库函数操作RCC的流程来理解偏移变量
    对于STM32别名区的理解 (转载)
  • 原文地址:https://www.cnblogs.com/cielosun/p/7308324.html
Copyright © 2020-2023  润新知