最新文章【Bug记录】调用Controller中的方法的Service为null
问题今天写代码的时候遇到了一个奇怪的Bug,在Controller中调用某个方法时突然报空指针异常,打断点时发现service为null,并尝试了数种注入方式,发现均为null。
原因分析首先去检查了一下Service上的注解,发现是有 @Service 注解的,因为使用了Lombok的 @RequiredArgsConstructor 注解1,所以在想是不是Lombok的原因,后面去掉该注解,分别尝试了使用 @Autowired 注入、@Resource 注入以及构造器注入,调用时发现仍为null。
上网查询资料后发现关注点错了,既然Service添加了对应注解,且也尝试了不同的注入方法,如果其他方法也均是使用这种方式注入且没出问题的,那就说明问题出在方法上。
在检查方法时发现,在Controller层,方法定义时使用了private 修饰,而不是正常的 public,如下:
查阅资料后发现:容器在扫描Bean并生成代理类的时候,只会生成被 public 和 protected 修饰的方法的代理类,被 private 修饰的方法并不会生成代理类。
Q: 那为什么我们的类是使用 pu ...
RocketMQ学习笔记
RocketMQ应用场景解耦用户购物积分服务:当我们购物后进行积分的一个累加,在实际开发中,会用到使用订单服务来调用我们的积分服务进行积分的累加,但是如果积分服务出现问题,就会导致我们相应的接口出问题,此时就可以把积分放到MQ中,积分服务作为消费者去处理,也就可以实现我们服务的解耦。
削峰填谷假如我们有一个商城,它的服务器能处理3000req/s,在晚上8点左右会有一个20分钟的高峰期,请求可能会达到5000req/s,而其他时候请求只有2000req/s,显然此时增加一台服务器做负载均衡并不划算,就可以将请求放到MQ中,服务每次只取3000个以下的请求,而剩余的请求排队进行等待。相当于将超出3000之外的请求给 “削” 掉了,然后填充到后面请求量没那么高的时候,以此类推,将后续排队的请求依次消费掉。
数据分发假如我们有一个服务A,服务A会有一些下游服务,服务A在处理完毕之后会将数据存储到Redis当中,然后服务A要通知其下游服务进行处理,但是如果此时有服务下线或有新服务上线时需要修改我们的服务A的代码。此时我们可以利用消息中间件,服务A处理完毕后将数据存入Redis,并将处理完毕的消 ...
教你使用JDWP远程调试服务
前言在我们日常开发工作中,经常会遇到写好的代码线上出了问题,但是本地又无法复现,看着控制台输出的日志恨自己当初没有多打几条日志,然后追着日志一条一条查,不说找起来有多费事费劲,再我们找到后还要去对应的代码进行修改,最后再将改过的代码打包部署重新测试,这个流程下来十几二十分钟就没了。那么有没有什么办法能帮助我们进行调试呢?答案是有的!使用Java为我们提供的JDWP协议(Java Debug Wire Protocol) 来实现
具体实现编写测试类我们新建一个web项目写个controller即可,不需要连接数据库和其他中间件
1234567891011@RestController public class TestController { @GetMapping("/test") public String test(String name) { String content = "你好,"; String message = content + name; ...
简单便捷的数据库版本管理工具:Flyway
前言
首先在我们日常的工作中避免不了会出现客户/公司在原有项目上新增或修改功能的需求,而这些需求也往往伴随着数据库的更新。
当还在开发中的软件遇到此类情况倒是无所谓,但是很多时候是在我们的软件已经部署到客户服务器上,并且已经使用了一段时间,有了一部分的数据,我们不可能直接从数据库导出干净的数据库表给客户更新上。
当部署的软件比较多时,人工手动去改或者新增数据库的操作又过于繁琐。那么我们有没有更简单便捷的方式来帮助我们解决这样的问题呢?答案肯定是有的:Flyway
以上讲了这么多,那么究竟Flyway是什么呢?
Flyway是一个开源的数据库版本管理工具,其主要作用在于管理数据库的版本更新以及迭代,它能够自动化的将数据库的变更迁移到不同的数据库中,其也支持多种数据库类型,这里我们就用Java来集成Flyway实现我们想要的功能。
工作原理
Flyway的工作原理非常简单,当你集成Flyway后,如果是初次启动,Flyway会在与你的数据库建立连接后自动的给你的数据库插入一个默认名为 flyway_schema_history 的表,这个表的主要作用就是来 保存Flyway的执行记录 ...
SpringBoot启动流程源码剖析
SpringBoot启动流程分析流程图
源码剖析运行Application.run()方法我们在创建好一个 SpringBoot 程序之后,肯定会包含一个类:xxxApplication,我们也是通过这个类来启动我们的程序的(梦开始的地方),而这个启动类中代码如下:可以看到这里的代码非常的简洁,一个 main方法,在该方法中调用了 SpringApplication.run() 方法,我们也可以去看一下里面的实现。这里的run方法接收了两个参数,一个是名为 primarySource 的类,另一个是 args 参数,其中最为主要的也就是 primarySource 参数,该参数接收了我们要启动的是哪一个类,我们把滚动条拉到最上面可以看到一个构造函数:在这个构造函数里将我们的启动类添加到了一个 LinkedHashSet中,而在它的下面有一个 webApplicationType 参数,这就是我们用来确定应用程序类型的地方。
SpringApplication构造函数确定应用程序类型我们去看一下 WebApplicationType.deduceFromClasspath() 方法的实现 ...
不会使用设计模式?一个案例教你结合使用模板方法+策略+工厂模式
不会使用设计模式?一个案例教你结合使用模板方法+策略+工厂模式前言
我们前面学习了那么多设计模式,但运用不到项目中的话终归是纸上谈兵,别人一问:都会,让你实践:全废。为了解决这种问题,哥们就拿几个应用场景来教大家如何在项目中使用设计模式,而本篇文章我们要学习的是: 模板方法模式 、策略模式 和 工厂模式 的结合实践。
案例场景假如我们正在做一个OA系统,而我们要实现不同级别的人提交的审批申请,要由他的上级来审批,并且不可以越级审批,那么针对于这种场景我们应该如何实现呢?
此时一定会有位大聪明回答:这题我会,直接使用 if…else… 大法!实现如下:
123456789public void approval(int approvalType){ if(approvalType == 1){ log.info("部门领导审批"); }else if(approvalType == 2){ log.info("分管领导审批"); }else if(approvalType == ...
流媒体实战之RTMP推送FLV
流媒体实战之推送MP4文件前言
在我们日常工作中会遇到流媒体相关的业务,特别是音视频领域的小伙伴们,那么什么是流媒体呢?
流媒体协议说白了:就是一种通过Web来传递多媒体的一种协议,当我们在网络上观看视频或者直播时,背后避免不了会与流媒体协议有牵扯。
而流媒体协议有很多种,其主要也分为三大类:
传统视频流媒体协议:
RTMP
RTSP
基于HTTP的流媒体协议:
Apple HLS
Low-Latency HLS
MPEG-DASH
Adobe HDS
新流媒体协议:
SRT
WebRTC
本篇文章主要基于 RTMP 进行讲解。
工作原理RTMP 主要的工作流程如下:
如上图所示:首先是由用户A来将一个媒体流推送至流媒体服务器,流媒体服务器接收到流之后再做一系列的处理。待处理完成之后,此时用户B如果来拉取媒体流,流媒体服务器则会将该流分发给用户B。
前置准备在我们编写我们的代码之前,我们要先去做一些准备工作:
服务器/虚拟机
SRS
ffmpeg
在我们编写代码之前,我们首先要将流媒体服务器准备好,这里可以用我们自己的服务器,也可以用虚拟机或者本机。
手动安装安 ...
更好用的MybatisPlus:MybatisFlex(下)
更好用的Mybatis Plus:Mybatis Flex(下)前言
上篇文章讲了 Mybaits Flex 的基础用法,这次讲一下 Mybatis Flex 的进阶用法,包含了一些 Mybatis Flex 核心的一些功能。(以下简称 MF)
逻辑删除上篇文章讲到了 @Column 注解,其中有个属性为 isLogicDelete ,当这个属性为 true 时,则标识该字段为逻辑删除字段,MF 会识别到该字段并进相应的一些处理。
当你在实体类中指明了逻辑删除字段后,在查询时 MF 会自动帮你拼接上 WHERE xxx = 0 的 SQL,而在你删除时则不会真正删除表中的数据,而是将你标识为逻辑删除的字段的值改为1,使其查询不到。
假如我们使用 MF 查询某张表:
12345@Test void simpleSelect() { List<SysUser> sysUsers = userMapper.selectAll(); sysUsers.forEach(System.out::println); }
其执 ...
更好用的MybatisPlus:MybatisFlex(上)
更好用的的MybatisPlus:MybatisFlex(上)前言
Mybatis 是我们常用的一个 ORM 框架,而 MybatisPlus (以下简称 MP) 则是对 Mybatis 进行了一层封装,便捷了我们的开发工作,但是由于其只能进行单表操作,所以有些功能还是需要在 XML 中手写 SQL。MybatisFlex 就是为了解决这类问题的框架。
摘自官网:MyBatis-Flex 是一个优雅的 MyBatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 亮点 帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。
总而言之,MyBatis-Flex 能够极大地提高我们的开发效率和开发体验,让我们有更多的时间专注于自己的事情。
同类型框架功能对比
功能或特点
Mybatis-Flex
Mybatis-Plus
Fluent-Mybatis
对 entity的基本增删改查
✅
✅
✅
分页查询
✅
✅
✅
分页查询之缓存总量
✅
✅
❌
分 ...
一文详解二叉搜索树
数据结构-二叉查找树前言
摘自百度百科: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。
简而言之,二叉查找树(Binary Search Tree) 又称为 二叉搜索树 、二叉排序树。它是一种 对搜索和排序都有用的特殊二叉树。而 红黑树、AVL树 都是特殊的二叉树 (自平衡二叉树)。
定义当一个二叉树为特殊二叉树时,势必会满足以下条件:
当其左子树不为空时,其左子树上所有的节点的值均小于根节点的值。
当其右子树不为空时,其右子树上所有节点的值均大于根节点的值。
该树上的所有子树(左右子树)均为一颗二叉查找树。
其结构如下图所示:
应用场景
电商系统 ...