一、什么是策略模式 定义一些列算法类,将每一个算法封装起来,并让它们可以互相替换。 策略模式让算法独立于使用它的客户而变化,是一种对象行为型模式。 以上是策略模式的一般定义,属于是课本内容。 在没有真正理解策略模式之前并不需要对此定义下过多功夫,读一遍直接进入下一章节。 二、为什么要用策略模式 我们应该知道,所谓的设计模式实际上是一种经过检验的、科学高效的、针对某种场景的最佳编程设计实践。 所以要理解某一种设计模式,就必须知道我们什么时候可以用,用之前和用之后到底有什么区别。 练习: 假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。 一个最简单的情况就是把所有货品的单价乘上数量,但...
一、程序计数器 程序计数器内存很小,可以看作是当前线程所执行字节码的行号指示器。 有了它,程序就能被正确的执行。 因为有线程切换的存在,则每个线程必须有各自独立的程序计数器,即线程私有的内存。 这里再解释一下什么是线程切换,线程切换指的是: 单处理器在执行多线程时所进行的线程切换,多线程的交替运行会产生同时运行的错觉。 程序计数器不会发生OOM原因: 占用内存非常小,当线程结束时程序计数器也会随之回收。 二、本地方法栈与虚拟机栈 栈是stack的翻译,那stack又是什么? 在英文语境中,stack指的是一摞盘子堆叠起来、一摞书堆叠起来的这种状态,也就是astackofbooks.借这种现实物...
首先,跨域的域是什么? 跨域的英文是:Cross-Origin。 Origin 中文含义为:起源,源头,出生地。 在跨域中,"域"指的是一个Web资源(比如网页、脚本、图片等)的源头。 包括该资源的协议、主机名、端口号。 在同源策略中,如果两个资源的域相同,则它们属于同一域,可以自由进行交互和共享数据。 反之,如果两个资源的域不同,就会出现跨域问题。 这时就需要特殊的方式来处理,如跨域资源共享(CORS)。 那什么是同源策略? 同源策略(Same-OriginPolicy)是浏览器中的一项安全机制,用于保护用户的隐私和安全。 它限制了一个网页或者脚本只能从同一个源加载的资源进行访问,...
场景描述: 前一阵子接手的新项目中需要使用2个数据源。 一个叫行云数据库,一个叫OceanBase数据库。 就是说,我有时候查询要查行云的数据,有时候查询要查OceanBase的数据,咋办? 废话不多说,下面以mysql为例,开整。 一、环境依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </de...
技术总是在不断更新变化的,尤其是在IT编程领域。 有时候我们理所当然的用着现成的框架,以至于用的太过于顺手,更要时不时的骂一句: 什么垃圾框架?我家狗都不会用! 如果那些被拍死在沙滩的“前浪”听到这话,怕是要顶开棺材板给你点个赞。 为什么? 因为太安逸了,安逸到一出生就开着拖拉机耕地,还嫌拖拉机费油。 今天来看看不费油的,费人。 现在MyBatis框架用的比较熟练了,但是有时候不明白原理,也不知道MyBatis具体做了什么工作,于是就把JDBC翻出来看一下,忆苦思甜。 什么是JDBC 我们是学java的,我们要操作数据库,我们怎么办? 聪明的Sun公司想了个办法,我们定义一套java接口,一...
开发中经常遇到需要判空的地方,比如对字符串进行判空操作。 而有时候工具包太多不知道用哪个。 就像下图,光一个StringUtils就有十几个包弹出来。 怎么选? 其实用哪个都行。 最重要的是: 有一套自己用的顺手的工具。 或者换句话说: 要养成自己的开发习惯。 有了自己专属的开发习惯,不管客观上这个习惯是否是最优的,但一定要有一套,然后随着经验积累和实践,将这套习惯不断修整精进,达到个人开发效率的最高程度。 而且更值得说的是: 重要的甚至不是这套习惯,而是一种认知的建立,一种行为模式的养成。 一、字符串 <dependency> &...
聚簇索引一般指的是主键索引(如果存在主键索引的话)。 作为一个正常开发,建表时主键肯定是必须的。 而即使如果表中没有定义主键,InnoDB会隐式选择一个唯一的非空索引代替。 所以我们就直接含糊点说: 聚簇索引就是主键索引!其余的都是非聚簇索引。 那到底什么是聚簇索引,什么是非聚簇索引? 聚簇就是扎一堆儿。 聚簇索引就是将数据存储与索引放到了一块,找到索引也就找到了数据。 在innodb中,在聚簇索引之上创建的索引称之为辅助索引,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引。 辅助索引叶子节点存储的不再是行的物理位置,而是主键值。辅助索引访问数据总是需要二次查找。 而这个二次查找的过程...
一、java锁存在的必要性 要认识java锁,就必须对2个前置概念有一个深刻的理解:多线程和共享资源。 对于程序来说,数据就是资源。 在单个线程操作数据时,或快或慢不存在什么问题,一个人你爱干什么干什么。 多个线程操作各自操作不同的数据,各干各的,也不存在什么问题。 多个线程对共享数据进行读取操作,我就四处看看,什么也不动,也不存在什么问题。 但如果多个线程对共享数据进行写操作,问题就来了。 经典库存问题: mysql记录剩余:1,redis缓存记录剩余:1。 小明上网下单,后台程序检查redis记录存货剩1台,数据库执行-1,但小明网太卡了,数据库刚执行完-1,redis没来得及更新成0,小...
当我们学习apple时候,我们很容易记住apple是什么。 我们也不会对apple的概念产生模糊混淆。 为什么? 因为字典上明确说了,apple=苹果。 那苹果是什么? 苹果就是圆圆的红红的,吃起来甜甜的水果。 我们学习apple如此简单,就是因为我们对苹果这个概念的理解已经通透到不能再通透。 那现在我们问,事务是什么? 我们百度一下。 在最开始,我死记硬背各种博客笔记对事务的定义。 好像理解了。 但是又没完全理解。 事务这个概念困扰了好久好久。 面试官问我事务,我好像也能对上几句。 但我真的像理解apple一样理解了事务吗? 没有。 为什么理解不了呢? 下面我们一点一点说。 我们为什么能...
张麻子:汤师爷,翻译翻译,什么叫AOP? 汤师爷:这还用翻译。 张麻子:我让你翻译给我听,什么叫AOP? 汤师爷:不用翻译,切面编程就是AOP啊。 黄四郎:难道你听不懂什么叫AOP? 张麻子:我就想让你翻译翻译,什么叫AOP! 汤师爷:AOP嘛。 张麻子:翻译出来给我听,什么他妈的叫AOP!什么他妈的叫他妈的AOP! 汤师爷:什么他妈的叫AOP啊? 黄四郎:AOP就是AspectOrientedProgramming,面向切面编程!明白了吗? 汤师爷:这就是AOP啊。 张麻子:翻译翻译。 汤师爷:... 汤师爷:AOP就是AspectOrientedProgramming!面向切面编程!面向...
学习SpringBoot自动配置之前我们需要一些前置知识点: Java注解,看完就会用 学会@ConfigurationProperties月薪过三千 不是银趴是@Import! @Conditional+@Configuration有没有搞头? 首先我们提出2个问题: SpringBoot是干什么的? 是用来简化Spring原生的复杂的xml配置的进阶框架。 自动配置是什么? 我们用另外一个问题回答这个问题。 我们在SpringBoot开发中,就写了几个配置,怎么连接上的数据库? spring: datasource:  ...
首先我们要明确:@Import注解是Spring提供的。 然后我们看一下该注解的官方注释: Indicates one or more component classes to import — typically @Configuration classes. Provides functionality equivalent to the <import/> element in Spri...
日拱一卒,功不唐捐。 在了解@Conditional之前先花10秒钟复习一下@Configuration这个注解。 @Configuration是干什么? 是配合@Bean注解来配置Spring容器的bean的。 那它为什么会出现呢? 因为配置bean的另一种方式是xml,狗都不用。 那给个示例看看呗? 简单。 @Configuration public class AppConfig { @Bean public MyBean myBean()&n...
学习@ConfigurationProperties之前我们需要一些前置知识点: @Value是个什么东西 首先明确:@ConfigurationProperties是SpringBoot注解。 我们在讲@Value时知道了如何将配置文件的属性注入到变量中,废话不多说,直接上代码。 这是配置文件配置: spring.datasource.dynamic.mysql.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.dynamic.mysql.url=jdbc:mysql://localhost:3306/db1 spring....
对注解不了解的可以看一下: Java注解,看完就会用 首先我们要明确: @Value是Spring框架的注解。 它有什么作用呢? 作用 @Value通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。 使用方式 常量注入 顾名思义,就是把一个写死的值赋给对应变量,形式如下: // 注入普通字符串 @Value("Bin") private String username; // 注入文件资源 @Value("classpath:com/test/config.xml") private Res...