设计思维
文章平均质量分 65
lang20150928
stay hungry stay foolish
展开
-
<<程序员底层思维>>概略
第一章:抽象思维抽象思维是程序员最重要的思维能力之一,抽象的过程就是通过归纳总结、分析综合来寻找共性、提炼相关概念的过程。语言和抽象是一体的,抽象的概念只有通过语言才能表达出来,因此命名至关重要。过多地使用基础类型可能意味着抽象的缺失,需要对这些业务概念进行封装和抽象。重复代码意味着抽象缺失,提取重复代码只是完成了重构的第一步,关键是后续的命名。抽象具有层次性,抽象层次越高,内涵越小、外延越大,扩展性越好;反之,抽象层次越低,内涵越大,外延越小,扩展性越差,但语言表达能力越强。对抽象层次的拿捏体原创 2022-05-29 10:48:18 · 514 阅读 · 0 评论 -
Spring当中一个巧妙的lazy方式
创建的时候不设置具体的PasswordEncoder,而是将上下文传入进去,在真实调动接口方法的时候才去容器中获取其他的PasswordEncoder实现static class LazyPasswordEncoder implements PasswordEncoder { private ApplicationContext applicationContext; private PasswordEncoder passwordEncoder; LazyPasswordEncoder(Appl原创 2021-07-28 16:16:01 · 107 阅读 · 0 评论 -
关闭钩子
文章目录前言一、关闭钩子二、简单案例三、Tomcat中的钩子方法案例总结前言在很多实际应用环境中,当用户关闭了应用程序时,需要做一些善后清理工作,但问题是,用户有时并不会按照推荐的方法关闭应用程序,很有可能不会做清理工作。例如,在Tomcat的部署应用当中,通过实例化一个Server对象来启动servlet容器,调用其start()方法,然后逐个调用组件的start方法。正常情况下,为了让Server对象能够关闭这些已经启动的组件,应该通过发送关闭命令的方式。如果你只是简单的突然退出,例如在应用程.原创 2021-02-09 21:24:26 · 158 阅读 · 1 评论 -
MyBatis缓存模块(二级缓存深入理解)
系列文章目录MyBatis开发要点MyBatis一级缓存MyBatis二级缓存MyBatis日志模块MyBatis日志增强MyBatis数据源MyBatis缓存模块(二级缓存深入理解)文章目录系列文章目录 前言 Blocking cache 二级缓存的真实实现 eviction算法 总结 前言 在前面介绍二级缓存的时候,我们说到了org.apache.ibatis.cache.decorators.TransactionalCache这个类的注释,对应的内容如下:The 2n原创 2020-12-04 16:24:57 · 426 阅读 · 1 评论 -
MyBatis日志增强
系列文章目录MyBatis开发要点MyBatis一级缓存MyBatis二级缓存MyBatis日志模块MyBatis日志增强文章目录系列文章目录 前言 MyBatis日志增强简单介绍 MyBatis日志增强源码分析 一个配置解决所有MyBatis日志的开关问题 总结 前言在上一章当中我们介绍了MyBatis的日志模块没有自己的具体实现,而是通过适配器模式兼容了其它主流日志组件的功能。这样通过org.apache.ibatis.logging.Log就可以打印日志了。本章我们来聊一聊My原创 2020-12-03 14:34:14 · 645 阅读 · 0 评论 -
MyBatis日志模块
系列文章目录MyBatis开发要点MyBatis一级缓存MyBatis二级缓存MyBatis日志模块文章目录系列文章目录 前言 MyBatis日志实现 优雅加载日志组件 前言MyBatis定了自己的Log接口以及级别,但是并没有考虑自己,而是使用第三方的日志,但是第三方日志多种多样而且日志级别也不同,MyBatis是如何对接的呢?如果当前环境中存在多个第三方的日志插件,MyBatis又该如何选择才能保证日志正常而又不会出现异常呢? MyBatis日志实现首先看一下MyBatis的原创 2020-12-02 17:58:06 · 181 阅读 · 0 评论 -
Spring中的观察者模式
在Spring容器(ApplicationContext)中事件处理是通过ApplicationEvent类和ApplicationListener接口来实现的。如果一个bean实现了ApplicationListener接口(前提:bean),容器每次发布ApplicationContext事件的时候,这个bean会被通知到。这是典型的观察者模式。Spring中提供了很多内置的事件,比如ContextRefreshedEvent。public class ContextRefreshedEvent e原创 2020-09-01 16:45:53 · 412 阅读 · 0 评论 -
一个类被代理或多次代理之后,如何获取原来的类型?
在java的各种设计模式中,代理模式使用的非常广泛。比如目前作为Java的事实标准框架Spring框架中最有名的名称就是IOC和AOP,而AOP就是使用的代理模式。比如事务处理,我们只需要添加一个注解@Transactional就可以完成复杂的事务处理。在Spring中动态代理有两种模式:一个是JDK动态代理,一个是CGLIB.比如有以下一个接口:public interface OrderService { public void add(Order order);}实现类如下:原创 2020-07-20 15:32:03 · 7393 阅读 · 4 评论 -
SimpleLockCache
原创 2020-04-02 10:21:12 · 112 阅读 · 0 评论 -
分布式事务
为什么需要锁?场景:多任务环境下 — 多对一操作有状态的资源 — 非原子性操作,存在中间态为什么需要事务?场景:服务需要做多件事情但是其中可能某件事情会失败非原子动作通过事务保证要么一起成功,要么一起失败假设这样一个场景: A 给 B 转账 100, 流程步骤如下:1、 A 减 1002、 B 多 100。如果第一步骤执行后, 系统崩溃掉了。 会怎么样呢?问题: ...原创 2020-03-22 16:29:13 · 146 阅读 · 0 评论 -
LRU缓存实现
MyBatis实现LRU缓存package org.apache.ibatis.cache.decorators;import java.util.LinkedHashMap;import java.util.Map;import org.apache.ibatis.cache.Cache;/** * Lru (least recently used) cache decorat...原创 2020-03-22 12:39:41 · 179 阅读 · 0 评论 -
缓存
缓存概念根据数据使用的规则,二八规律:有20%的数据最常用,加载入缓存/有80%的数据不常用,最好不占用缓存不一定是缓存的数据库结果,而是缓存业务结果(数据库的结果经过一些处理)外存 : 计算机内存与CPU缓存之外的储存器,一般断电数据不丢失,用于数据持久化内存 : 外存与CPU沟通的桥梁,一般断电之后数据也会被清空缓存 : 把一些外存的数据存到内存而已 java中一般缓存通过Ma...原创 2020-03-22 11:50:15 · 154 阅读 · 0 评论 -
OOP理念
面向过程让计算机有步骤地顺次做一件事情,是一种过程化的叙事思维。但是在大型软件开发过程中,发现用面向过程语言开发,软件维护、软件复用存在着巨大的困难,代码开发编程了记流水账,久而久之,模块之间互相耦合,流程互相穿插,往往牵一发而动全身。面向对象提出一种计算机世界里解决复杂软件工程的方法论,拆借问题复杂度,从人类思维角度提出解决问题的步骤和方案。比如开门这个动作,面向过程的思维就是 open(...原创 2020-03-21 22:55:13 · 181 阅读 · 0 评论 -
同步与异步
同步调用是刚性调用,是阻塞式操作,必须等待调用方法体执行结束。而异步调用是柔性调用,是非阻塞操作,在执行过程中,如调用其他方法,自己可以继续执行而不被阻塞等待方法调用完毕。异步调用通常用在某些耗时长的操作上,这个耗时方法的返回结果,可以使用某种机制反向通知,或者再开启一个线程轮询。反向通知方式需要异步系统和各个调用它的系统进行耦合;而轮询对于没有执行完的任务会不断地请求,从而加大执行机器的压...原创 2020-03-21 21:12:16 · 77 阅读 · 0 评论