暂时未有相关云产品技术能力~
通信工程本硕、IEEE 《Wireless Communications Letters》Q2 sci 一作一篇、申请发明专利2项 、Java开发工程师
RocketMQ 顺序消息解析——图解、源码级解析
RocketMQ 延迟消息解析——图解、源码级解析
在拥有 Spring Boot 以前,我们要运行一个 Java Web 应用,首先需要有一个 Web 容器(例如 Tomcat ),然后将我们的 Web 应用打包后放到容器的相应目录下,最后再启动容器。
Redis为什么用单线程? 多线程的开销 Redis使用单线程为什么还这么快? 网络与IO操作的潜在阻塞点 基于多路复用的高性能IO模型 回调机制 Redis的性能瓶颈点 其他Redis相关的有趣问题
相信很多同学都有过玩一玩服务器的经历吧,之前在我上学那会儿阿里云99块能包三年,于是就跟风租了一台,后面好像也被我冷落了哈哈。
当多个线程共享可变数据的时候,每个读或者写数据的线程都必须执行同步。 关键字 synchronized 可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。 同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都能看到由同一个锁保护的之前所有的修改效果。
使类和成员的可访问性最小化
我个人在Java领域也已经学习了近5年,在修炼“内功”的方面也通过各种途径接触到了一些编程规约,例如阿里巴巴的泰山版规约,在此基础下读这本书的时候仍是让我受到了很大的冲激,学习到了很多约定背后的细节问题,还有一些让我欣赏此书的点是,书中对于编程规约的解释让我感到十分受用,并愿意将他们应用在我的工作中,也提醒了我要把阅读JDK源码的任务提上日程。
57 最小化局部变量的作用域 58 for-each循环优先于传统的for循环 59 了解并使用类库 60 若需要精确答案就应避免使用float 和double 类型 61 基本类型优先于包装基本类型 62 如果其他类型更合适,尽量避免使用字符串 63 当心字符串连接的性能问题 64 通过接口引用对象 65 接口优于反射 66 谨慎使用本地方法 67 谨慎地进行优化 68 遵守被广泛认可的命名约定
57 最小化局部变量的作用域 58 for-each循环优先于传统的for循环 59 了解并使用类库 60 若需要精确答案就应避免使用float 和double 类型 61 基本类型优先于包装基本类型 62 如果其他类型更合适,尽量避免使用字符串 63 当心字符串连接的性能问题 64 通过接口引用对象 65 接口优于反射 66 谨慎使用本地方法 67 谨慎地进行优化 68 遵守被广泛认可的命名约定
49 检查参数的有效性 50 必要时进行保护性拷贝 51 谨慎设计方法 52 慎用重载 53 慎用可变参数 54 返回空的数组或集合,不要返回null 55 谨慎返回optional 56 为所有已公开的API 元素编写文档注释
49 检查参数的有效性 50 必要时进行保护性拷贝 51 谨慎设计方法 52 慎用重载 53 慎用可变参数 54 返回空的数组或集合,不要返回null 55 谨慎返回optional 56 为所有已公开的API 元素编写文档注释
42 Lambda优先于匿名类 43 方法引用优先于Lambda 44 优先使用标准的函数式接口 45 谨慎使用Stream 46 优先选择Stream中无副作用的函数 47 Stream要优先用Collection作为返回类型 48 谨慎使用Stream并行
42 Lambda优先于匿名类 43 方法引用优先于Lambda 44 优先使用标准的函数式接口 45 谨慎使用Stream 46 优先选择Stream中无副作用的函数 47 Stream要优先用Collection作为返回类型 48 谨慎使用Stream并行
34 用enum代替int常量 35 用实际属性代替序数 36 使用 EnumSet 替代位属性 37 使用EnumMap 替代序数索引 38 用接口实现可继承的枚举 39 注解优先于命名模式 40 坚持使用Override注解 41 用标记接口定义类型
34 用enum代替int常量 35 用实际属性代替序数 36 使用 EnumSet 替代位属性 37 使用EnumMap 替代序数索引 38 用接口实现可继承的枚举 39 注解优先于命名模式 40 坚持使用Override注解 41 用标记接口定义类型
KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,说实话,有点复杂。
我个人在Java领域也已经学习了近5年,在修炼“内功”的方面也通过各种途径接触到了一些编程规约,例如阿里巴巴的泰山版规约,在此基础下读这本书的时候仍是让我受到了很大的冲激,学习到了很多约定背后的细节问题,还有一些让我欣赏此书的点是,书中对于编程规约的解释让我感到十分受用,并愿意将他们应用在我的工作中,也提醒了我要把阅读JDK源码的任务提上日程。
我个人在Java领域也已经学习了近5年,在修炼“内功”的方面也通过各种途径接触到了一些编程规约,例如阿里巴巴的泰山版规约,在此基础下读这本书的时候仍是让我受到了很大的冲激,学习到了很多约定背后的细节问题,还有一些让我欣赏此书的点是,书中对于编程规约的解释让我感到十分受用,并愿意将他们应用在我的工作中,也提醒了我要把阅读JDK源码的任务提上日程。
我看到很多人会过分夸大5G和6G的作用,他们的描述里会给出很多关于未来生活的畅想,颠覆我们现在的生活。
1 添加surrounded with 【CTRL+ALT+T】 2 格式化代码 【CTRL+ALT+L】
1 前言 2 追本溯源 3 容器启动流程 3.1 应用启动计时 3.2 打印 Banner 3.3 创建上下文实例createApplicationContext 3.4 构建容器上下文prepareContext 3.5 小结
10 覆盖equals时要遵守通用约定 11 覆盖equals时总要覆盖hashCode 12 始终要覆盖toString 13 谨慎地覆盖clone 14 考虑实现Comparable接口
1 静态工厂代替构造器 2 构造函数有多个参数时要考虑使用构建器 3 使用private构造器或枚举类型强化Singleton属性 4 使用privete的构造函数强化不可实例化的能力 5 引用资源时应优先考虑依赖注入 6 避免创建不必要的对象 7 消除过期的对象引用 8 避免使用终结方法和清除方法 9 try-with-resources优先于try-finally
相信接触过设计模式的同学都知道,单例的一种经典实现方式就是private的构造函数,但直到我看到这一章节内容的时候,才突然顿悟原来枚举类型也是可以强化单例属性的,自愧个人的融会贯通能力还有待加强。
假设一个类的构造函数有多个参数时,如果想要创建实例时,很可能就会写出这样的代码:
这一节其实也是在说明工厂设计模式的优秀之处,它相对于构造函数的优势在于:
7 消除过期的对象引用 这一条建议主要讲的是要规避内存泄漏。因为像Java这种具有垃圾回收机制的语言,内存泄漏一般都是比较隐蔽的。
6 避免创建不必要的对象 从字面意思上来看,大家肯定都知道创建不必要的对象是错误的做法。但这一节其实主要是提醒我们避免无意识的创建不必要对象的代码写法。
站在设计者的角度设计populateBean: 调用Bean的Setter方法实例去给Bean设置上属性值 变量类型的转换,同时还要考虑处理集合类型的情况
循环依赖的情况如下: 构造器循环依赖(singleton,prototype) Setter注入循环依赖(singleton,prototype)
这一讨论的前提是要对Spring的doCreateBean方法有所了解,故将其源码放在这里,以供参考:
doCreateBean之创建无属性的bean doCreateBean之处理@Autowired以及@Value标签
进入到上面的applyMergedBeanDefinitionPostProcessors方法里:
上一篇文章分析到createBean执行到了doCreateBean方法:
createBean方法的执行流程如下:
doGetBean源码:
直接打开AbstractBeanFactory的doGetBean方法:
类与接口篇 15 使类和成员的可访问性最小化 16 在public类中使用访问方法而不是public属性 17 可变性最小化原则 18 复合优先于继承 19 要么设计继承并提供文档,要么禁止继承 20 接口优于抽象类 21 为后代设计接口 22 接口只用于定义类型 23 类层次优于标签类 24 静态成员类优于非静态成员类 (非)静态成员类 匿名类、局部类 25 一个文件只定义一个顶级类
Spring在Bean实例的创建过程中做了很多精细化控制 我们需要做的是理清脉络,不要陷入细节
SpringIOC容器初始化源码解析(4)—— 手撕Spring容器的刷新逻辑(较硬核)
示例代码 回调函数 Spring的事件驱动模型
ApplicationContextAware BeanNameAware 其他的
还记得2019年初时第一款5G手机发布,到现在身边的小伙伴们都用上了5G手机,5G越来越被大众关注。
后置处理器PostProcessor BeanDefinitionRegistryPostProcessor BeanFactoryPostProcessor BeanPostProcessor
在DefaultListableBeanFactory的registerBeanDefinition方法中的打上断点,Entrance程序入口换成
调用过程复现: 在DefaultListableBeanFactory的registerBeanDefinition里打上断点,运行Entrance,观察调用栈:
BeanDefinitionRegistry负责对BeanDifinition的注册,其中的方法:
每个计算机专业的同学都要掌握的知识
location BeanDefinitionReader Resource BeanDefinitionRegistry Resourceloader DefaultListableBeanFactory