- 博客(19)
- 收藏
- 关注
原创 Java反射
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
2023-10-30 15:48:38 77 1
原创 Java基础
对象代表了现实世界中的实体或抽象概念,并具有属性(数据)和行为(方法)。面向过程就是分析出实现需求所需要的步骤,通过函数(方法)一步一步实现这些步骤,接着依次调用即可面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成类(类实例化后才是对象),创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为。
2023-10-27 18:37:16 77 1
原创 MySql数据库总结
索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据最左前缀原则就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配事务是数据库并发的基本单位,事务是一个不可分割的数据库操作序列、其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。
2023-10-07 18:51:33 91 1
原创 数据库事务
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
2023-10-04 20:11:52 45 1
原创 解决循环依赖
Setter方法(多例)注入产生的循环依赖:每一次getBean()时,都会产生一个新的Bean,如此反复下去就会有无穷无尽的Bean产生了,最终就会导致OOM问题的出现。在Spring中,只有单例模式的循环依赖问题被解决了,其他两种方式在遇到循环依赖问题时都会产生异常。循环依赖问题在Spring中主要有三种情况:通过构造方法进行依赖注入时产生的循环依赖问题;构造方法注入产生的循环依赖:在构造方法参数上添加@Lazy注解,添加@Lazy注解之后依赖查找所需要的值是代理对象而不是真实对象。
2023-09-08 17:00:00 90 1
原创 Hibernate 和 MyBatis 的区别
Hibernate对SQL语句进行了封装,提供了日志、缓存、级联等特性,支持HQL操作数据库,数据库无关性支持好,但可能会多消耗性能。MyBatis需要手动编写SQL,支持动态SQL、处理列表、动态生成表名、支持存储过程。MyBatis是一个半自动映射框架,需要配置Java对象与SQL语句执行结果的对应关系,多表关联关系配置简单。Hibernate是重量级框架,学习使用门槛高,适合需求相对稳定、中小型的项目,例如办公自动化系统。Hibernate是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。
2023-09-07 20:30:00 111
原创 spirng、spirngBoot、springCloud的区别
它包含了许多模块,例如Spring Core、Spring MVC、Spring Security等,每个模块都提供了特定的功能来支持应用程序的不同方面,比如依赖注入、AOP、Web开发等。需要注意的是,Spring Boot可以作为开发微服务架构的基础,而Spring Cloud则提供了更多的功能来支持微服务架构中的各种需求,如服务发现、负载均衡、配置管理等。是一个用于快速构建Spring应用程序的框架,通过自动配置和约定优于配置的原则,简化了应用程序的配置和部署。
2023-09-06 14:45:00 61 1
原创 Spring Mvc
Spring MVC提供了一个清晰、可配置和灵活的模型-视图-控制器(MVC)设计模式,用于构建具有清晰职责划分和良好组织结构的Web应用程序。处理器适配器执行处理器,处理器(Controller)执行完成后返回模型和视图(ModelAndView);前端控制器调用视图解析器(ViewReslover)解析模型和视图(ModelAndView);前端控制器调用处理器映射器(HandlerMapping)查找处理器(Handler);前端控制器进行视图渲染(即把模型数据填充到视图中),最终响应浏览器的请求。
2023-09-06 11:45:00 49 1
原创 ThreadLocal
ThreadLocal直译是本地线程,实际上译名是线程局部变量。ThreadLocal为变量在每个线程中都创建了一个副本,每个线程可以访问自己内部的副本变量,使线程之间相互独立互不影响。每个Thread中都存在一个ThreadLocalMap容器,这个容器的key为ThreadLocal对象,value为具体保存的值。ThreadLocal并不是为了解决线程并发问题,而是为了在同一个线程中所有的地方都能访问同一个变量,这与Java中的关键字volatile还是有区别的。
2023-09-05 20:00:00 41 1
原创 反射的理解
Java 反射是一种强大的机制,允许在运行时检查类、接口、字段和方法等信息,并能够操作对象、调用方法以及访问成员。通过反射,可以在编译时不知道类的情况下,动态地获取和操作类的信息和对象。类代表 Java 中的类,它提供了许多方法来获取类的信息,如字段、方法、构造函数等。通过 Class 类的实例,可以获取类的名称、包名、修饰符等。有三种主要方法获取 Class 类的实例:使用方法,指定类名来获取 Class 实例。使用.class语法,如。使用对象的方法,如。通过反射可以使用。
2023-09-05 13:00:00 53 1
原创 synchronized的底层原理,和Reentlock的区别
修饰的代码块时,它会尝试获取对象的锁,如果锁被其他线程占用,则该线程会被阻塞,直到锁被释放。在底层,Java 虚拟机使用监视器(Monitor)来实现锁,每个对象都有一个关联的监视器,用于控制对对象的访问。都是 Java 中用于实现线程同步的机制,但它们的底层原理和使用方式有一些区别。如果需要更复杂的同步操作,如可中断锁、公平锁、精细的锁控制等,可以选择使用。可以提供更细粒度的锁控制,例如可以为不同的代码块使用不同的锁。提供了更丰富的锁操作,如可以设置超时时间、可中断的锁请求等。如果只需要简单的同步,
2023-09-04 14:30:00 115 1
原创 MYSQL事务
索引方面:MyISAM是非聚簇索引,储存索引有三个文件(表结构、数据文件、索引文件),InnoDB支持聚簇索引,存储索引只有两个文件(表结构,数据和索引文件)。串行化:将并发事务串行化执行,只允许一个事务在同一时间修改同一行数据,可以解决一切并发访问存在的问题,但是会降低性能。可重复读:一个事务在多次读取同一行数据中,能够获得相同的结果,解决了脏读、不可重复读问题,但是会出现幻读问题。工作中:使用MySQL数据库的默认级别。undolog:回滚日志,确保日志的原子性,记录事务发生前的一个版本,用于回滚。
2023-09-04 07:00:00 41 1
原创 volatile
2. 禁止指令重排(保证有序性):volatile修饰的变量,在初始化和引用之间会添加一个内存屏障,防止指令重排,避免了对象半初始化的问题。1. 保证可见性:volatile修饰的变量在多个线程之间是可见的,通过缓存一致性协议的监听器,监听副本中的变化,同步给其他线程。3. 不保证原子性:主内存的写操作和副本之间的读操作不能保证原子性。因为volatile不能保证原子性,所以不能保证线程安全。
2023-09-03 15:00:00 40
原创 lock和Synchronized区别Synchronized锁膨胀的过程什么是CAS?什么是ABA问题和如何解决ABA问题?
可重入锁:重入锁,也叫做递归锁,可重入锁指的是在一个线程中可以多次获取同一把锁,比如: 一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁, 两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。一般使用sync,官方推荐的用法,而且sync不需要我们自己释放锁,避免了忘记释放锁的情况。sync采用悲观锁(具有锁膨胀的机制),lock采用乐观锁。sync不能获取锁的状态,lock可以获取锁的状态。
2023-09-03 11:00:00 56
原创 Spring Aop
Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个核心模块,用于实现横切关注点(如日志、事务、安全性等)与核心业务逻辑的分离。切面定义了一系列通知(advice)和切点(pointcut),通知是在特定的切点上执行的代码,可以包括前置通知、后置通知、异常通知、环绕通知等。通知是在切点上执行的代码,包括了不同类型的通知,如前置通知、后置通知、环绕通知、异常通知、最终通知。在配置文件中声明切面,并指定要应用的通知和切点。
2023-09-03 02:00:00 51
原创 HashMap 的扩容方式
newTable[i] 的引用赋给了 e.next ,也就是使用了单链表的头插入方式,同一位置上新元素总会被放在链表的头部位置;这样先放在一个索引上的元素终会被放到 Entry 链的尾部(如果发生了 hash 冲突的话)Java 里的数组是无法自动扩容的,方法是将 HashMap 的大小扩大为原来数组的两倍,并将原来的对象放入新的数组中。这里就是使用一个容量更大的数组来代替已有的容量小的数组,transfer()方法将原有Entry数组的元素拷贝到新的Entry数组里。那扩容的具体步骤是什么?
2023-09-02 23:00:00 305
原创 springboot从前端请求到后端处理的过程
请求可以包括HTTP方法(GET、POST、PUT、DELETE等)、URL、请求头和请求体等信息。Controller生成的响应数据会通过HTTP协议返回给前端,响应包括HTTP状态码、响应头和响应体等信息。处理完业务逻辑后,Controller会生成响应数据,通常是一个视图模板、JSON数据或其他格式的数据。在Controller中,可以进行业务逻辑的处理,包括调用Service层的方法、读取数据库、计算等。作为前端控制器,它会接收到所有的HTTP请求,然后将请求分发给合适的Controller。
2023-09-02 18:33:33 1514
原创 Java多线程
1.线程和进程的区别:线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少包含一个线程。:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;
2023-09-02 18:02:48 312
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人