自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(748)
  • 收藏
  • 关注

原创 JVM发展历程以及各大JVM介绍

早在1996年Java1.0版本的时候, Sun公司就发布了一款名为Sun Classic Vm的Java虚拟机, 他同时也是世界上第一款商用Java虚拟机, JDK1.4的时候完全被淘汰了这款虚拟机内部只提供了解释器所以这也是为什么早期的Java的效率比较低的原因, 但是现在Java在如此庞大的生态环境下已经是一步步的开发,提升, 现在Java程序的执行效率已经是可以和C/C++一较高下了那么如今Java已经效率上可以和C/C++一较高下了, 是否以后就能取代掉C和C++?

2023-06-29 23:30:25 391 2

原创 JRockit VM介绍

Oracle后来表达了整合HotSpot VM和JRockit VM这两大优秀虚拟机的工作, 大致在JDK8中完成, 整合的方式是在HotSpot的基础上, 移植了JRockit的优秀特性, 整合之后的虚拟机依然称之为: HotSpot VM。

2023-06-29 23:29:53 392

原创 JVM的生命周期

Java虚拟机的启动是通过引导类加载器(bootstrap classLoader)创建一个初始类(initial Class)来完成的, 这个类是由具体的虚拟机的实现来决定的(也就是不同的虚拟机这个初始化类也是不同的)

2023-06-29 23:29:39 345

原创 区分基于栈的指令集架构和基于寄存器的指令集架构

如今嵌入式平台(资源受限的平台)早已经不是Java程序的主流平台了,那么我们为什么不将Java架构改为寄存器的架构?=》 因为Java走的就是跨平台的,Java语言的特点中就有: 一处编译, 到处运行。来执行反编译, 将class文件反汇编为我们能看得懂的指令流。我们可以在Teminal中在对应字节码所在文件夹之下输入。

2023-06-29 23:28:46 464

原创 JVM整体结构以及Java代码执行流程

HotSpot VM是目前市面上高性能虚拟机的代表作之一,它采用的是解释器与及时编译器并存的架构在今天, Java程序的运行性能已经脱胎换骨, 以及达到了可以和C/C++一较高下的地步JVM整体结构图(简图):Java代码的执行流程:解释器和JIT编译器都是在执行引擎中的

2023-06-29 23:25:52 87

原创 JVM的位置以及JVM的整体结构

JDK(Java开发工具包)与JRE(Java运行时环境)与JVM(Java虚拟机)之间的关系图:JDK可以分为Java编译运行等相关工具和JRE, JRE又可以分为Java类库和JVM, 而在Java编译运行工具中我们学习到过一个编译工具是javac, 其实javac是一个前端编译器, 负责将.java文件(java源代码),编译为.class文件, 而在JVM()中又有(是一款后端编译器, 是及时编译器, 编译过程属于动态编译), JIT编译器的作用是将.class文件编译为对应操作系统上的机器指令。

2023-06-29 23:22:26 100

原创 虚拟机与Java虚拟机的介绍

虚拟机(virtual machine) : 就是一台, 它是一款, 用来, 大体上虚拟机可以分为和。

2023-06-29 23:21:09 83

原创 字节码与多语言混合编程

任何人都可以提交JSR,以向Java平台增添新的API和服务。职能是指定java标准。一个项目中, 我们可以对并行处理使用Clojure语言编写, 展示层使用JRuby/Rails语言编写, 中间层则是使用Java编写, 每个应用层都将使用不同的编程语言来完成, 而且, 接口对每一层的开发者都是透明的==(在计算机中透明表示的是看不见的, 某种看不见的特性我们就可以说是透明的)==, 各种语言之间的交互不存在任何困难, 就像是使用自己语言的API一样方便, 因为它们最终都运行在同一个虚拟机之上。

2023-06-29 23:20:25 57

原创 如何看待上层技术与JVM以及为何学习JVM

一些有一定工作经验的开发人员,认为SSM等上层框架才是重点,因此会沉迷与表层的业务逻辑开发, 导致仅仅着重与理解上层框架的使用, 认为基础技术不重要, 对JavaSE的内容理解都不够深刻, 更不要说JVM了, 而着其实是一种本末倒置的“病态”,这是问题,一定需要改正。

2023-06-29 23:19:36 49

原创 跨平台的语言Java和跨语言的平台JVM

【代码】跨平台的语言Java和跨语言的平台JVM。

2023-06-29 23:18:33 80

原创 MySQL - 索引

索引(index)是帮助MySQL高效获取数据的数据结构, 在数据之外, 数据库系统还维护着满足特定查找算法的数据结构, 这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法, 这种数据结构就是索引如果表中某个字段没有索引, 那么以该字段进行查找的时候就要进行一个全表扫描, 效率是非常低的如果表中某个字段是有索引, 那么通过索引这个数据结构, 我们查找的效率就会非常高。

2023-06-27 19:32:15 102

原创 MySQL存储引擎

存储引擎就是存储数据, 建立索引, 更新, 查询数据等技术的实现方式. 存储引擎是基于表的, 而不是基于库的, 所以存储引擎也可被称之为 : 表类型InnoDB是一种兼顾高可靠性和高性能的通用存储引擎, 在MySQL5.5之后, InnoDB成为了默认的MySQL存储引擎MyISAM是MySQL早期的默认存储引擎Memory引擎的表数据是存储在内存中的, 由于受到硬件问题, 或者断电的影响, 只能将这些表作为临时表或者缓存使用。

2023-06-27 19:29:09 132

原创 InnoDB数据存储结构

页a, 页b, 页c… 页n这些页可以不在物理结构上相连, 只要通过双向链表相关联即可. 每个数据页中的记录会按照主键值从小到达的顺序组成一个单向链表, 每个数据页都会为存储在它里面的记录生成一个页目录, 在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽位, 然后再遍历该槽对应分组中的记录即可快速找到指定的记录页目录等我们下面详细介绍页结构的会讲解注意: 这些页是同一层的页, 可以不在物理结构上相连, 但是页分配的时候确实是相连的, 但是呐不是同一层相连。

2023-06-27 19:27:20 935

原创 MySQL的数据目录

本篇文章是以安装在Linux上的MySQL进行讲解的。

2023-06-27 19:18:39 75

原创 MySQL多版本并发控制(MVCC)

MVCC(Multiversion Concurrency Control), 多版本并发控制. 顾名思义, MVCC是通过数据行的多个版本管理来实现数据库的并发控制. 这项记录使得在InnoDB的事物隔离级别下执行一致性读操作有了保证. 换言之, 就是为了查询一些正在被另一个事物更新的行, 并且可以看到他们被更新之前的值, 这样在做查询的时候就不用等待另一个事物释放锁而insert操作在事物之间是没有共享的, 所以insert操作是不用使用并发版本控制的。

2023-06-27 19:17:23 98

原创 MySQL - 锁

锁是计算机协调多个线程或线程并发访问某一资源的机制. 在程序开发中会存在多线程同步的问题, 当多个线程并发访问某个数据的时候, 尤其是针对一些敏感的数据(比如订单, 金额等), 我们就需要保证这个数据在任何时刻最多只有一个线程在访问, 保证数据的完整性和一致性, 在开发过程中加锁是为了保证数据的一致性, 这个思想在数据库领域中同样很重要。

2023-06-26 23:12:57 209 2

原创 锁的概述 -> 帮助你先了解MySQL中的锁的概念

锁是计算机协调多个进程或者线程并发访问某一资源的机制. 在程序开发中会存在多线程同步的问题, 当多个线程并发访问数据的时候, 尤其是针对一些敏感的数据(比如 : 订单, 金额等), 我们就需要保证这个数据在任何时刻最多只有一个线程在访问, 保证数据的完整性和一致性, 在开发过程中加锁是为了保证数据的一致性, 这个思想在数据库领域中同样很重要.在数据库中, 除了传统的计算资源(如: cpu, RAM, I/O等)的争用以外, 数据也是一种供许多用户共享的资源. 为了保证数据一致性, 需要对并发操作进行控制。

2023-06-26 23:07:05 50

原创 MySQL优化、视图、存储过程、触发器、锁的简单概述

前面我们学过的数据库对象就只有数据库表, 接下来我们会学习 :视图存储过程存储函数触发器索引(索引我们前面已经是学习过了)视图(View)是一种虚拟存在的表, 视图中的数据并不在数据库中实际存在, 行和列数据来自定义视图的查询中使用的表, 并且是在使用视图时动态生成的通俗的讲, 视图只保存了查询的SQL逻辑, 不保存查询结果, 所以我们在创建视图的时候, 主要的工作就落在创建这条SQL查询语句上可以理解为视图就是一个SQL语句, 每次我们查询视图的时候都是执行了对应的SQL语句。

2023-06-26 23:02:22 70

原创 MySQL事务日志

​事务有4中特性 : 原子性, 一致性, 隔离性和持久性. 那么事务始终特性到底是基于什么机制实现的?

2023-06-26 22:56:36 127

原创 MySQL事务

事务是数据为了保证数据操作的原子性, 隔离性, 持久性, 一致性, 数据库提供的一套机制, 在同一个事务中, 如果有多条SQL执行, 事务要确保执行的可靠性。

2023-06-26 22:48:54 45

原创 lombok简化Spring开发

我们使用了lombok提供的@Slf4j注解之后类中就会有这样一个成员属性log, 这样就有了日志功能了, 使用起来是非常方便的。使用就是这么简单, 当然这也是最基础的用法, lombok其实还为我们提供了slf4j日志。我这个项目中父工程中管理的lombok依赖版本是1.18.20。

2023-06-26 22:41:35 84

原创 最佳实践 - SpringBoot应用如何编写

我们去spring-boot-autoconfig.jar包中,去看web场景下其实是由很多autoconfiguration的, 那么这些配置都会配置成功?

2023-06-26 22:39:15 57

原创 自动配置[源码分析] - 初始加载自动配置类原理

本篇文章中我们来分析@SpringBootApplication注解底层的@EnableAutoConfiguration注解底层的@Import(AutoConfigurationImportSelector.class)这个方法就是核心方法, 最终返回的String[]就是我们要初始加载的一些类, 这些类当然不是之前一篇文章中的主程序所在包下的组件, 而是以下自动配置类我们接下来进入到getAutoConfigurationEntry方法中:然后点入到getCandidateConfiuration

2023-06-26 22:38:12 121

原创 自动配置[源码分析] - 初始加载自动配置类原理

本篇文章中我们来分析@SpringBootApplication注解底层的@EnableAutoConfiguration注解底层的@Import(AutoConfigurationImportSelector.class)这个方法就是核心方法, 最终返回的String[]就是我们要初始加载的一些类, 这些类当然不是之前一篇文章中的主程序所在包下的组件, 而是以下自动配置类我们接下来进入到getAutoConfigurationEntry方法中:然后点入到getCandidateConfiuration

2023-06-26 22:35:55 58

原创 自动配置[源码分析] - 自动配置包原理

这里的自动配置包就是指的启动类所在包, 为什么我们会将该包下的所有类进行一个扫描?首先我们要看自动配置原理, 肯定是从@SpringBootApplication注解开始:这个注解就会为我们一步一步解开SpringBoot的自动配置原理。

2023-06-26 22:32:53 28

原创 @ConfigurationProperties配置绑定

完成配置绑定有什么好处?之前我们在javase中使用到了properties配置文件, 哪个时候我们要取出配置文件中的值要通过IO流完成, 那么在SpringBoot中我们只需要完成配置绑定即可, 非常的简单, 非常的灵活。

2023-05-03 20:35:06 309 2

原创 @ImportResource导入Spring配置文件

如果我们之前已经是写好了Springxml配置文件, 配置文件中创建了指定的bean, 那么现在我们如何直接使用xml方式呐?然后由于这是一个配置类, 只要在该配置类加载的时候就会导入对应的spring配置文件到容器中, 就达成了我们的需求。其实非常的简单, 就是使用@ImportResource注解即可, 该注解即可导入SpringXML配置文件。这就是一个Spring配置文件, 那么我们如何导入该Spring配置文件到Spring容器中?类路径之下的beans.xml配置文件。

2023-05-03 20:31:40 140

原创 @Conditional注解

这些注解其实是很见名知意的, 就是符合某个条件的时候就装配, 或者就是不符合某个条件的时候就装配, 都是比较好理解的。

2023-05-03 20:29:47 77

原创 @Import注解

比如有的时候我们某个类被加载到容器中的时, 如果此时需要加载其他一些类到容器中, 那么就可以使用@Import注解。可以看到@Import注解中有一个Class[], 这个数组其实就是我们要添加到容器中的组件的类的对象。@Import注解不仅仅是可以加载自定义类到容器中, 还可以加载第三方jar包中的类到容器中。

2023-05-03 20:27:20 108

原创 @Configuration注解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vakZcHH-1683116601752)(E:\非凡英才\SpringBoot\图解\图解\现在springboot创建组件的方式.png)]以前的时候我们向容器添加组件的时候会是创建一个spring.xml配置文件, 然后在配置文件中使用bean标签来完成对组件的创建。这里的配置类肯定也是要被创建对象放到容器中的 —> 由于我的ctrl + f用不了, 直接点搜索页不行, 所以这里就不截屏了。

2023-05-03 20:25:11 94

原创 SpringBoot自动配置原理

并且如果我们点击到某些自动配置中我们可以发现其中很多都是红的, 这个其实红的就是该自动配置没有开启 —> 后面文章会细讲, 这里不过多赘述。然后我们可以点击到依赖导入列表中进行一个查看 —> 就看spring-boot-autoconfigure依赖。所以我们如果某个时候要用到某个配置的默认值的时候就获取到对应的bean实例, 然后就提取出里面的bean实例。我们点击到上面的配置中去, 发现会点进到一个类中, 其实这就是说我们的配置最后都会映射到某个类上。引入Tomcat依赖 —> 这个属于依赖管理。

2023-05-03 20:23:02 63

原创 SpringBoot依赖管理原理

我们可以看到 :我们只需要在当前项目的pom.xml文件中也使用< properties>标签来完成一个版本号申明, 就可以覆盖父项目中的版本号申明了。这个时候就点到头了, 最顶层的父项目是spring-boot-dependencies-*.pom —>4、见到的 *-spring-boot-starter: 第三方为我们提供的简化开发的场景启动器。1、见到很多 spring-boot-starter-* : *就某种场景。2、只要引入starter,这个场景的所有常规需要的依赖我们都自动引入。

2023-05-03 20:20:32 218

原创 官方文档架构

点击learn, 就可以开始学习SpringBoot的官方文档了。

2023-04-28 15:36:48 54

原创 SpringBoot-HelloWorld

我们对jar包进行一个解压, 可以看到解压之后的boot-info文件夹中的lib文件夹中有非常多的jar包, 其中还内置了tomcat环境, 还有我们依赖的第三方jar包。我们cmd中默认是开启着快速编辑模式的, 我们一定要把这个关掉, 否则在启动SpringBoot项目的时候一旦鼠标点击窗口就会停止启动。我们SpringBoot中所有的配置都写到这个配置文件中即可, 非常非常非常的方便 —> 并且所有的配置都可以点入到。我们自己写的程序在打包之后的boot-info的classes文件夹之下。

2023-04-28 15:33:55 85

原创 FactoryBean注册组件

/ public DogFactoryBean() { // System.out.println("哈哈哈");// } //返回一个Dog对象, 这个Dog对象会添加到容器中 public Dog getObject() throws Exception {System . out . println("嘿嘿嘿");} //控制bean是否为单例 /*1. true : 是单例, 在容器中保存一份。

2023-04-28 15:27:22 78

原创 @Import-给容器中导入组件

但是第二个却不是表示要加载MyImportSelector.class类型的实例到IOC容器中, 因为此时的MyImportSelector类实现了ImportSelector接口, 这是一种@Import注解的高级用法, 底层会通过反射的方式调用其中的selectImports()方法获取到对应的返回值作为要导入的Bean实例。selectImports()方法最终会返回一个String[], 该String[]中的内容就是要注册到IOC容器中的类的全类名。

2023-04-28 15:25:58 176

原创 @Conditiona-按条件注册bean

}判断条件能使用的上下文(环境)注释信息通过条件能使用的上下文调用getClassLoader能获取到类加载器通过条件能使用的上下文调用getBeanFactory方法能获取到IOC使用的bean工厂通过条件能使用的上下文调用getRegister方法能获取到bean定义的注册类通过条件能使用的上下文调用getEnvironment方法能获取到当前环境信息(JVM运行的各种环境信息)

2023-04-28 15:25:16 152

原创 @Scope-设置组件作用域

可以看到, 我们只是启动IOC容器的时候就调用了PersonConfig中的getPerson()方法。发现确实是IOC第一次调用getBean()方法获取该实例的时候完成的创建。发现确实是使用IOC容器调用getBean()方法的时候创建的多实例对象。可以发现request和session都是在web工程中使用的。发现启动IOC容器的时候确实没用创建该实例对象。发现确实不是IOC容器启动的时候完成的创建实例。

2023-04-28 15:24:13 218

原创 @ComponentScan通过自定义TypeFilter指定过滤规则

其实如果有小伙伴记得, 我们其实在初期的学习Spring的时候通过xml配置文件方式设置包扫描规则, 如果是配置只扫描某些类的时候也是通过ComponentScan注解中的useDefaultFilters属性, 将该属性设置为了false。以前我们的初学spring的时候使用spring的xml配置文件的方式配置过滤规则的时候其实也是使用的ComponentScan标签的excludeFilters属性来完成的。注解修饰的类都会被添加到容器中。

2023-04-28 15:23:27 234

原创 @ComponentScan-自动扫描组件(指定扫描规则)

其实如果有小伙伴记得, 我们其实在初期的学习Spring的时候通过xml配置文件方式设置包扫描规则, 如果是配置只扫描某些类的时候也是通过ComponentScan注解中的useDefaultFilters属性, 将该属性设置为了false。以前我们的初学spring的时候使用spring的xml配置文件的方式配置过滤规则的时候其实也是使用的ComponentScan标签的excludeFilters属性来完成的。注解修饰的类都会被添加到容器中。

2023-04-28 15:21:44 952

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除