目前为止 WorkManager 系列已经讨论过: Android Jetpack WorkManager | Android 中文教学视频 在这篇文章中,我们将讨论: 在 Kotlin 中如何使用 WorkManager... Kotlin 编写的并使用了 KTX 库 (Kotlin Extensions)。...现在您可以非常容易的对 Worker 类进行测试,并且 WorkManager 在 Kotlin 中的整体使用体验也非常棒。...如果您还没有在项目中使用 CoroutineWorker 以及 workmanager-runtime-ktx 中包含的其他扩展,强烈建议您在项目中使用它们。...当使用 Kotlin 进行开发 (已经成为我的日常) 时,这是我使用 WorkManager 的首选方式。
'io.reactivex.rxjava2:rxandroid:2.0.2' implementation 'io.reactivex.rxjava2:rxjava:2.1.10' Github地址 使用...延迟执行 Kotlin Observable.timer(1000, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread...()) .subscribe { } 多线程 常用的方式是分线程中处理数据,主线程中使用数据生成页面 Kotlin Observable .create<List<TreeItemModel
接触过Kotlin之后,我们会利用其扩展方法特性创建很多便捷的方法来实现更好更快的编码。比如我们对于RxJava进行一些简单的扩展方法实现。...有关,可不可以同一称为RxUtil呢,这样使用起来也很方面。...Any> List.toObservable(): Observable> { return Observable.fromArray(this) } 修改后,就可以在Java...中完全使用RxUtil调用了。.../app/build/tmp/kotlin-classes/debug/com/example/jvmannotationsample/RxUtil__SingleExtKt.class 使用javap
JvmName注解是Kotlin提供的一个可以变更编译器输出的注解,这里简单的介绍一下其使用规则。...代码中,可以这样调用 1 2 3 public static void testJvmNameOnMethod() { OnMethodSampleKt.isOK(""); } 但是,我们在Kotlin...代码中,还是只能使用isValid而不是isOK 1 2 3 4 fun testJvmNameOnMethod() { "".isValid() // "".isOK() unresolved...所以,对应的解决方法 修改两个的方法名称,比如List.filterValid()修改成List.filterValidString()等 第二种就是使用@JvmName...; OnPropertiesSampleKt.x(); } 在Kotlin中对应的调用 1 2 3 4 fun testJvmNameOnProperty() { x
本篇着重介绍一下几种常用的序列化方式 最近在做一个项目,由于并发量大,大量使用到了RedisTemplate来操作Redis。但使用过程中,遇到了不少的坑,各种翻看源码来跟踪,也总结出了不少的经验。...但是有时候,我们的Redis会在一个项目的多个project中共用,这样如果同一个可以缓存的对象在不同的project中要使用两个不同的key来分别缓存,既麻烦,又浪费。...但是,但是,但是:在实际的使用中,我们希望职责单一和高内聚的,所以并不希望我们存在的对象,其它服务可以直接访问,那样就非常不好控制了,因此此种方式也不建议使用~ GenericJackson2JsonRedisSerializer...所以其实我们就可以使用一个全局通用的序列化方式了。使用起来和JdkSerializationRedisSerializer基本一样。...解决方案 既然你需要GenericJackson2JsonRedisSerializer它的通用性,那么你就得接受他只能处理Object类型。 因此在使用的时候遇上这种情况,需要稍加注意了。
在《SpringBoot视频教程全家桶》系列教程中,我们分别讲解了StringRedisTemplate和RedisTemplate的使用和区别。...是因为他同时使用了StringRedisTemplate和RedisTemplate在Redis中存储和读取数据。它们最重要的一个区别就是默认采用的序列化方式不同(在课程中已经讲到)。...解决方案 那么,如果在生产环境中想通用StringRedisTemplate和RedisTemplate进行字符串的处理该怎么办?...注意此处使用的是Junit5。 这样就解决问题了吗?没有。因为RedisTemplate的Value也是采用默认的序列化类,也要进行统一修改。...(RedisSerializer.string()); } 小结 经过上述步骤,关于SpringBoot中混合使用StringRedisTemplate和RedisTemplate的坑已经填平了。
如你所见,委托属性并没有什么神奇的。但是,它虽然简单,却非常有用,让我们来看一些在 Android 开发中的例子。 你可以在官方文档中了解更多关于委托属性的内容。...所以让我们来写一个扩展函数用于往Bundle 中存储某种类型的值,在类型不支持的时候抛出异常。...我们把这个类型设为非空的,并且在不能读取时抛出了异常,这让我们可以在 Fragment 中获取非空的值,避免了空值检查。...Kotlin Android Extension的视图绑定来获取布局中的控件。...总结 我们看来一些在 Android 开发中使用 Kotlin 委托属性的例子。当然了,你也可以用别的方式来使用它。 这篇文章的目标是展示委托属性是多么强大,以及我们可以用它做什么。
在使用springboot项目中,使用RedisTemplate在Junit测试的时候,报RedisTemplate空指针: 来看看修改前: 修改后: 查了一下后面发现是容器没有启动,单纯的测试是无法注入的....要在测试类上加上 在类上加入:@RunWith(SpringRunner.class)这个注解。
随着Kotlin在移动端开发的普及,它也逐步走入后端开发者的视野。Kotlin是JVM体系的语言,和Java有着良好的互操作性,上手较容易,且可以使用Java强大的生态,其还具有函数式编程的优点。...市面上介绍使用Kotlin进行后端开发的图书和文章也比较少,袁康在大量实践的基础上,萌生了写一本书的想法,希望和更多的Java开发人员分享Kotlin在后端开发中的实践经验。...本文选自书中“Kotlin在常用中间件中的应用”一章,这一章主要介绍Kotlin在常用中间件中的应用,通过示例程序,将展示Kotlin集成Spring Boot、Redis、JPA、QueryDSL、MongoDB...读者可以掌握使用Kotlin操作常用中间件的技巧。 下面我们一起来学习了解下本章中“Kotlin集成Spring Boot”部分。...本书专注于Kotlin在Spring Boot微服务开发中的实践,介绍了函数式编程思想、Kotlin的语法、Kotlin在常用中间件中的应用,以及其在微服务注册中心、微服务配置中心、微服务网关、Spring
使用 MapStruct 可以在两个 Java Bean 之间实现自动映射的功能,只需要创建好接口。...Kotlin 中使用 MapStruct 在 github 上找到了一个 MapStruct Kotlin 实现的开源项目:https://github.com/Pozo/mapstruct-kotlin...) Person 类中还包含有 Role 类,以及 Person 跟 PersonDto 的属性并不完全一致的情况。在 Mapper 接口中,支持使用@Mappings来做映射。...PersonMapper 的 toDto() 中,对于 PersonDto 没有的属性,在 Mapping 时可以使用ignore = true。...总结 在使用 Kotlin 的 data class 时,如果需要做 Java Bean 之间的映射,使用 MapStruct 是一个很不错的选择。
在StringRedisTemplet中,默认都是存储字符串的形式;在RedisTemplet中,值可以是某个对象,而redis默认把对象序列化后存储在redis中(所以存放的对象默认情况下需要序列化...) 如果需要更改数据的存储方式,如采用json来存储在redis中,而不是以序列化后的形式。...= new Jackson2JsonRedisSerializer(Employee.class); 2)把定义的格式放进自己定义的RedisTemplate实例中 RedisTemplate...后并添加@Bean注解,(要在配置类中定义),那么默认的RedisTemplate就不会被添加到容器中,运行的就是自己定义的ReidsTemplate实例,而你在实例中自己定义了序列化格式,所以就会以你采用的格式定义存放在...CacheManager,在CacheManager中可以自定义序列化的规则,默认的序列化规则是采用jdk的序列化 注:在SpringBoot 1.5.6 和SpringBoot 2.0.5 的版本中自定义
"); 试图使用RedisTemplate在Redis中存储一个键为“student:1”,值为“kirito”的String类型变量(redis中通常使用‘:’作为键的分隔符)。...那么是否真的如我们所预想的那样,在Redis中存在这样的键值对呢?...序列化接口RedisSerializer 无论是RedisTemplate中默认使用的 JdkSerializationRedisSerializer,还是StringRedisTemplate中使用的...按照个人理解可以总结为以下几点: 各个工程间约定了数据格式,如使用JSON等通用数据格式,可以让异构的系统接入Redis同样也能识别数据,而JdkSerializationRedisSerializer...替换默认的序列化器 可以将全局的RedisTemplate覆盖,也可以在使用时在局部实例化一个RedisTemplate替换(不依赖于IOC容器)需要根据实际的情况选择替换的方式,以Jackson2JsonRedisSerializer
Bean2 redisTemplate对应的Redis中,于是我在这个应用中使用方式如下: @Autowired private RedisTemplate dataRedisTemplate; //...最后发现Redis数据源调用不对导致的,也就是说我希望是使用dataRedisTemplate,实际上是一直在使用redisTemplate。...,可是在多个实现类的时候,byType的方式不再是唯一,而需要通过byName的方式来注入,而这个name默认就是根据变量名来的。...也就是说,如果没有在redisTemplate()上面增加@Primary的话是没有问题的,因为有多个实现时,@Autowired是会通过byName的方式来注入的,但是按照上面说的,因为有了@Primary...,@Autowired注解会优先使用Bean redisTemplate。
前言 Kotlin协程底层是用线程实现的,是一个封装完善供开发者使用的线程框架。...Kotlin的一个协程可以理解为是运行在线程上的一个执行任务并且该任务可以在不同的线程间切换,一个线程可以同时运行多个协程。...CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> T ): Deferred runBlocking方式因为会阻塞线程,所以runBlocking函数我们在开发中基本不会使用到...CoroutineScope(Dispatchers.IO).launch {} 是在指定的 CoroutineScope 中启动一个协程,通常情况下应该手动创建 CoroutineScope 对象,并确保在合适的时机取消该...最常见的,网络请求在IO线程,而页面更新在主线程。 Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。
默认情况下,Spring 为我们提供了一个 RedisTemplate 来进行对 Redis 的操作,但是 RedisTemplate 默认配置的是使用Java本机序列化。...在 Spring 官方的文档中,官方也建议了我们使用其他的方式来进行序列化。...比如JSON 配置类 配置 Jackson2JsonRedisSerializer 序列化策略 下面就开始自动配置类的书写 我使用的是 Jackson2JsonRedisSerializer 来对对象进行序列化...() { // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值 Jackson2JsonRedisSerializer...,这是一个过时的方法,由于我当时并不知道这句话的意思,就把这段代码注释了,觉得可能没什么用,但注释后在向Redis里写数据的时候,数据会变成 导致数据无法反序列化。
SpringBoot整合Redis 整合Redis 在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce **jedis:**采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的...@Autowired private RedisTemplate redisTemplate; 3.1 基本操作 对于常用的基本操作,可以使用 redisTemplate 直接调用方法,例如: //...查看 Redis.conf详解 这个文件我们可以使用Linux查看最新版的: 正常安装的redis,应该在/usr/local/bin中 cd /usr/local/bin #进入该路径下...databases 16 #数据库的数量,默认是16个数据库 always-show-logo yes #是否显示logo 快照 持久化,在规定的时间内,执行了多少次操作,则会持久化到文件...aof模式的,默认是使用rdb方式持久化的,在大部分所有的情况下,rdb完全够用!
https://blog.csdn.net/pyycsd/article/details/80969574 Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统...其中就包括自动配置好了,RedisTemplate 、StringRedisTemplage。我们就可以在项目中直接使用。 4....JDK序列化器:JdkSerializationRedisSerializer 将序列化后的数据保存到redis中 // 我们也可以自定义序列化器完成序列化存储 // 1...所以我们需要自定义CacheManager(使用我们自己的序列化器): 重写RedisCacheConfiguration类中的方法: @Bean public RedisCacheManager...(true); return cacheManager; } } 在使用RedisCache时使用注解指定CacheManager: @Cacheable(cacheNames
); // 使用Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer...= new StringRedisSerializer(); // 指定objectMapper带输入类型的序列化,如果不指定redis中则存储纯json,序列化返回后解析默认为LinkedHashMap...); // 使用Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer...= new StringRedisSerializer(); // 指定objectMapper带输入类型的序列化,如果不指定redis中则存储纯json,序列化返回后解析默认为LinkedHashMap...redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer); redisTemplate.afterPropertiesSet
服务,在设计上没有考虑线程安全问题,一方面是因为该服务检测相关的api的访问都是管理员身份鉴权通过才能被允许的,正常的操作流程是不会出现安全问题的,另一方面,嗯,因为懒(误打QAQ)。...DsapServiceImpl 类 :DetectedServerAndPort的缩写,提供了api所需要的6个服务实现 只要是增删改类型的api,在返回前都进行一轮状态更新 updateAll()。...当然自动配置的redisTemplate并没有设置序列化器,所以我们可以有两种方式来更改,一种是将默认的引入到参数列表中然后直接修改,实际的对象只在堆中存在一个,也可以起redisTemplate名称的函数直接注册...可以看到我这里对hash的值使用了Jackson2JsonRedisSerializer,并且传入的序列化类型是Object.class,也就是最通用的。...而Jackson2JsonRedisSerializer由于没有插入额外的信息,那么只能通过不同的数据结构来组装反序列化后的内容。
,在调用主构造函数之前执行,这部分理论上可以进行任何工作,但建议类的初始化赋值可以放在这,其余的最好由其他专门的地方处理,采用init关键字 init{ println("ww cool") }...2.主构造函数 主构造函数只能由一个,初始化块相当于放在主构造函数的无参函数中,按顺序执行初始化块,这一点和传统的面向对象编程中的主构造函数没有太大的区别。...由关键字constructor提供,一般情况省略此关键字 class MyClass (name:String){ } //或者使用关键字 class MyClass constructor...(name:String){ } 3.次构造函数 同样使用constructor关键字作为函数名,但它不能省略函数名,使用时需要调用主构造函数 class MyClass constructor...和getter,所以不用这么担心 三、常用的类 抽象类 含有抽象方法的类称为抽象类,这一点和java里面很像 内部类 使用inner关键字,可以访问内部类外的属性 class outer{ val
领取专属 10元无门槛券
手把手带您无忧上云