终于搞懂SpringBoot自动装配!
本篇博客是我个人对B站码场安员外SpringBoot自动配置视频的文字版总结,文中出现的源码均是简化后版本。原视频链接:https://www.bilibili.com/video/BV1NY411P7VX/?spm_id_from=333.337.search-card.all.click&vd_source=40ac0553f204ea9791dc385431e71f1c
自动配置概念什么是SpringBoot自动配置SpringBoot自动配置(Auto-Configiuration):
它是指基于你引入的依赖Jar包,对 SpringBoot应用进行自动配置
它为SpringBoot框架的 “开箱即用” 提供了基础支撑
自动配置(Auto-Configiuration):SpringBoot中的配置类自动装配(Autowire):Spring中的依赖注入
配置类(Configuration Class):
广义的“配置类”: 被注解 @Component直接或间接修饰的某个类,即我们常说的Spirng组件,其中包含了@Configuration类
狭义的“配置 ...
Spring总结
什么是SpringSpring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring的核心思想是不重新造轮子,开箱即用,省去开发中的大量重复工作,提高开发效率。
IOCIOC(Inversion of Control:控制反转)是一种设计思想,而不是一个具体的技术实现。所谓控制,就是创建对象的权力,而反转即为把控制权交给外部环境(Spring框架,IOC容器)。就以我的Redis项目来说,在没有使用IOC思想的情况下,Service层想要使用Dao层的具体实现的话,需要通过new在UserServiceImpl中手动创建IUserDao的具体实现类UserDaoImpl,如图所示:但一个项目难免有很多需求,针对这些需求,我需要在IUserDao接口中开发满足这些需求的具体实现类。因为Service层依赖了IUserDao的具体实现,所以我就要修改UserServiceImpl中new的对象。如果只有一个类引用了IUserDao的具体实现,那还好说,但如果很多地方都引用了,牵一发而动全身,修改起来会极其麻烦。
如果使用IOC的思想,我们将对象 ...
JVM总结
运行时数据区域JDK 1.7:
JDK 1.8:
图源自:javaguide.cn
线程私有程序计数器主要有两个作用:
字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:循序执行、选择、循环等。
多线程情况下,程序计数器用于记录当前线程执行的位置,以便线程被切换回来时能够正常运行。
程序计数器的生命周期随着线程的创建而创建,随着线程的结束而死亡。
虚拟机栈与程序计数器一样,它的生命周期也与线程共存亡。虚拟机栈由一个个栈帧组成,而栈帧中拥有:
局部变量表:存放编译器可知的各种数据类型和对象引用。
操作数栈:用于存放方法执行过程中产生的中间结果和临时变量。
动态链接:将符号引用转化为调用方法的直接引用,作用于一个方法需要调用其他方法的场景。
方法返回地址:正常退出时,返回调用该方法指令的下一条指令的地址;异常退出时,返回地址和通过异常表来确认,栈帧一般不会保存此信息。
本地方法栈与虚拟机栈的职责类似,虚拟机栈执行Java方法,而本地方法栈执行Native方法。
线程共有堆用于存放JAVA对象的实例,JDK 7中,堆内存分为以下三种:
新生代
老年代
永 ...
剑指Offer归类总结
LeetCode学习计划里的剑指offer为期一个月,刷完又会重置,后面的题点又点不进去,只能等到对应天数才解锁,还要我一个一个搜,故做了这篇博客用于复习。
栈与队列用两个栈实现队列题目链接用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例:
输入: [“CQueue”,”appendTail”,”deleteHead”,”deleteHead”,”deleteHead”][[],[3],[],[],[]]输出:[null,null,3,-1,-1]
1234567891011121314151617181920212223242526class CQueue { LinkedList<Integer> A; LinkedList<Integer> B; public CQueue() { A = new LinkedList( ...
刷题笔记之回溯(下)
子集问题LeetCode 78. 子集LeetCode题目链接
前面的组合问题和分割问题都是收集叶子节点,而子集问题是收集所有结点。
子集是无序的,在集合[1,2,3]中,[1,2]和[2,1]是一样的。
为了避免重复,for就要从start开始,而不是从0开始。
树状图
回溯三部曲:
确定回溯函数参数
1234List<List<Integer>> res = new ArrayList<>();List<Integer> tmp = new ArrayList<>();private void backtrack(int[] nums, int start)
确定终止条件
1234//当集合为空,即start已经大于数组长度就停止遍历if (start >= nums.length) { return;}
也可以直接 res.add(new ArrayList(tmp)),本题就是将所有结点加入结果集。
确定单层循环逻辑
12345for(int i = start; i < ...
刷题笔记之回溯(上)
回溯算法三部曲
以LeetCode77.组合为例:
递归函数的返回值以及参数定义两个全局变量,一个用来存放符合条件的结果的集合,一个用来存放单一结果。
123List<List<Integer>> res = new ArrayList<>();// 存放符合条件结果的集合List<Integer> tmp = new ArrayList<>();// 用来存放符合条件结果void backtrack(int n, int k, int start){}
递归函数终止条件本题需要返回范围 [1, n] 中所有可能的 k 个数的组合,不难得出终止条件的代码如下:
1234if (tmp.size() == k) { res.add(new ArrayList(tmp)); return;}
单层搜索的过程本题的重点是需要一个int型的变量start来记录本层递归中集合从哪里开始遍历。遍历过程如图所示,start主要起剪枝作用。
12345for (int i = start; ...