AOP五种方式
AOP(面向切面编程)提供了五种主要的增强方式,它们分别是:
前置增强(Before Advice):在目标方法执行之前执行,常用于权限验证、日志记录等场景。
后置增强(After Advice):在目标方法执行之后执行,无论方法是否成功执行或抛出异常。
环绕增强(Around Advice):在目标方法执行前后都执行,可以控制目标方法的执行,甚至决定是否执行目标方法。
返回增强(After Returning Advice):在目标方法成功执行并返回结果后执行,常用于对返回结果进行加工处理。
异常增强(After Throwing Advice):在目标方法抛出异常后执行,常用于异常处理和日志记录。
这些增强方式使得开发者能够在不修改原有业务代码的情况下,增加额外的功能,提高了代码的复用性和可维护性。
Redis缓存的面试问题
缓存穿透:
查询一个不存在的数据,由于缓存中没有该数据,导致每次请求都会去数据库查询,数据库压力增大。
缓存击穿:
本来缓存中有对应的数据,但是缓存的数据 因为到期,需要去数据库中再次查询数据
缓存雪崩:
当大量缓存数据同时过期或被删除时,大量请求会直接访问数据库,导致数据库压力骤增。### 缓存倾斜:
某个热点数据被大量请求访问,导致该数据所在的Redis节点压力过大,甚至可能引发宕机。
什么是反射?
就是在运行时才知道要操作的类是什么,并且能够动态地操作这个类的属性和方法。
JDK动态代理和CGLIB动态代理的区别
JDK动态代理 底层的实现原理是反射,所以启动快,执行效率低,只能代理实现接口的对象
Cglib动态代理 底层是通过生成字节码文件,从而实现了子类继承父类的方式完成了代理,所以启动较慢,执行快
区别: 1.JDK只能代理具有接口的对象,而Cglib无此限制 2.启动速度JDK动态代理较快,Cglib生成字节码文件,启动较慢 3,执行效率JDK动态代理通过反射生成接口的实现类较慢,Cglib执行字节码文件较快
Mysql中的char和varchar区别
1.存储方式:
-
CHAR
是一个固定长度的类型 -
VARCHAR
是一个可变长度的类型,它只存储字符串实际需要的字符数 -
如果你的数据表中的列经常存储接近固定长度的字符串,使用
CHAR
类型可能更节省空间,因为MySQL不需要为每个值存储额外的长度信息。 -
如果列中的字符串长度差异很大,使用
VARCHAR
类型会更节省空间,因为它只存储实际需要的字符数。
3.性能:
- 对于
CHAR
类型,由于每个值的长度都是固定的,所以MySQL可以更快地处理这些值,特别是在进行排序和比较操作时。 VARCHAR
类型的处理可能会稍微慢一些,因为MySQL需要首先确定每个值的实际长度。
4.使用场景:
CHAR
类型适合存储长度几乎总是相同的字符串,如MD5哈希值、国家代码、电话号码等。VARCHAR
类型适合存储长度可能变化的字符串,如用户名、电子邮件地址、文章标题等。
5.最大长度:
-
CHAR
类型的最大长度是255个字符。 -
VARCHAR
类型的最大长度取决于MySQL的版本和存储引擎,但通常可以达到65,535个字符(在某些情况下可能更少)。
Mysql中limit分页查询后两数代表什么
第一个数字(offset):表示要跳过的记录数量。 它用于指定从结果集的哪一条记录开始获取数据,默认值为0,表示从第一条记录开始。
第二个数字(rows):表示要获取的记录数量。 它指定了从offset指定的位置开始,要获取多少条记录。
UNION和UNIONALL有啥区别
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结 果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不 是来自 TABLE1 就是来自 TABLE2。
主要三大范式
第一范式(1NF):要求数据库表的每一列都是不可分割的基本数据项,即每个字段都是原子性的,不可再分。
第二范式(2NF):在第一范式的基础上,要求数据库表中的非主键字段必须完全依赖于主键,而不能依赖于主键的一部分。
第三范式(3NF):在第二范式的基础上,要求数据库表中的非主键字段之间不能存在传递依赖关系,即每个非主键字段必须直接依赖于主键。
遵循这三大范式可以有效地规范化数据库的结构,减少数据冗余和数据更新异常,提高数据的一致性和查询效率12。
事务特性 ACID
-
原子性(Atomicity):指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。
-
一致性(Consistency):指事务将数据库从一种状态转变为另一种一致的状态。在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
-
隔离性(Isolation):要求每个读写事务的对象与其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见。
-
持久性(Durability):指事务一旦提交,其结果就是永久性的,即使发生宕机等故障,数据库也能将数据恢复。
mysql中索引类型
- 普通索引:最基本的索引,没有任何约束作用,主要用于提高查询效率。
- 唯一索引:在普通索引的基础上增加了数据唯一性的约束,允许有空值。
- 主键索引:一种特殊的唯一索引,不允许有空值,且一个表中只能有一个主键索引。
- 全文索引:用于查找文本中的关键字,一般很少用到。
- 空间索引:对空间数据类型的字段建立的索引。
此外,按照物理实现方式,索引还可以分为聚簇索引和非聚簇索引;按照作用字段个数,可以分为单列索引和组合索引(或称为联合索引)。不同的存储引擎支持的索引类型也有所不同
mysql隔离级别
-
读未提交(READ UNCOMMITTED):事务可以读取其他未提交事务的数据,可能导致脏读。这种隔离级别性能较高,但数据一致性差,很少用于实际应用。
-
读已提交(READ COMMITTED):事务只能读取已经提交的数据,防止了脏读,但可能出现不可重复读。这是大多数数据库系统的默认隔离级别,但不是MySQL的默认隔离级别。
-
可重复读(REPEATABLE READ):MySQL的默认隔离级别。它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,防止了脏读和不可重复读,但可能出现幻读。
-
可串行化(SERIALIZABLE):最高的隔离级别,通过强制事务排序,解决幻读问题,但可能导致大量的超时现象和锁竞争
B+数是什么结构
B+树是一种优化的树数据结构,通常用于数据库和操作系统的文件系统中。以下是关于B+树结构的详细解释:
-
节点构成:B+树是一个n叉排序树,每个节点通常有多个孩子。一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。
-
数据分布:B+树保证所有数据都在叶子节点,且叶子节点间有链接,便于数据检索。这种结构特点使得B+树在插入与修改时拥有较稳定的对数时间复杂度,能够保持数据稳定有序。
-
应用优势:B+树通过将数据分布在节点中,减少磁盘IO操作,提高查询速度。因此,它特别适用于数据库索引
HashMap底层原理
HashMap是Java集合框架中常用的映射表实现,底层基于数组+链表(或红黑树)实现。在JDK1.8之前,HashMap主要采用数组+链表的方式存储数据,通过计算Hash值将元素放到数组的指定位置上,出现Hash碰撞时形成单向链表,并使用头插法插入新元素。而从JDK1.8开始,当链表的长度超过8且数组长度大于64时,链表会转换为红黑树以提高查找效率。HashMap通过散列函数将键映射到数组中,采用链表或红黑树解决哈希冲突。扩容机制是当元素数量超过数组大小乘以加载因子(默认0.75)时,数组容量翻倍。
如何实现线程安全 关于 HashTable 加锁
实现线程安全的一种方法是使用HashTable,它通过给整个集合加锁来保证线程安全。这意味着,无论进行读操作还是写操作,都会给整个HashTable加锁,导致同一时间的其他操作必须等待,从而保证了线程安全。然而,这种方法的一个主要问题是性能较低,因为多个线程无法同时访问HashTable,导致并发性能较差。
另一种实现线程安全的方法是使用ConcurrentHashMap,它采用了分段锁的技术。ConcurrentHashMap将数据分成多个Segment,每个Segment都是一个独立的HashMap,并且每个Segment都有一个锁。这样,不同的线程可以同时访问不同的Segment,而不会发生冲突,从而提高了并发性能。同时,由于每个Segment都是独立的,所以也保证了线程安全。
最左匹配原则
最左匹配原则是MySQL中索引使用的一个重要原则。它指的是在使用联合索引时,查询条件必须从索引的最左列开始匹配,任何连续的索引列都能匹配上,但遇到范围查询就会停止匹配。
这一原则的产生与MySQL的索引结构有关。自MySQL5.5版本起,主流的索引结构转为B+树。B+树的节点存储索引顺序是从左向右存储,在检索匹配的时候也要满足自左向右匹配。因此,如果查询条件不包含索引的最左列,那么索引将不会被使用。
了解最左匹配原则对于优化数据库查询性能非常重要,它可以帮助我们更好地利用索引,提高查询效率
事务注解为啥用在业务层
-
解耦业务逻辑和事务管理:将事务管理的责任从业务逻辑中剥离出来,使业务逻辑更加专注于业务本身,提高代码的可维护性和灵活性。
-
统一事务管理:在业务层中进行统一的事务管理,确保一组相关的数据库操作要么全部成功,要么全部回滚,保证数据的一致性和完整性。
-
控制事务粒度:通过声明式方式在业务方法上控制事务的粒度,根据实际需求调整事务边界,实现更精细的事务控制。
-
事务特性发挥:在业务层使用事务注解可以充分发挥事务的ACID特性,特别是在处理多个数据库操作时,能够确保事务的一致性和隔离性。
什么情况下会导致事务失效
-
事务方法不是public:Spring中,@Transactional注解只能用于public方法,否则事务不会生效。
-
数据库引擎不支持事务:如MySQL的MyISAM引擎不支持事务,需使用InnoDB引擎。
-
异常处理不当:如捕获异常后未重新抛出,或抛出的是非运行时异常且未在@Transactional中指定回滚。
-
配置错误:如事务管理器配置错误,或Spring和Spring MVC配置文件中重复扫描service层。
-
自调用问题:同一个类中的方法互相调用时,事务可能不生效。
-
事务传播行为不当:如使用了不支持事务的传播机制。
关于事务回滚
它指的是在事务执行过程中,如果遇到错误或异常情况导致事务无法继续执行时,系统会将事务中已经执行的所有操作全部撤销,使数据库恢复到事务开始前的状态。这样可以保证数据的一致性和完整性,避免因为部分操作成功而部分失败导致的数据不一致问题。
在Spring框架中,事务回滚通常是通过@Transactional注解来控制的,可以指定哪些异常会触发事务回滚,以及事务的传播行为等属性。
@RequestBody与@ResponseBody区别
@RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象
@ResponseBody的作用是将后端以return返回的javabean类型数据转为json类型数据
@JSON Format 与 @DateTime Format区别
@JSONFormat`
- 主要用于JSON序列化和反序列化过程中,控制Java对象中的日期时间格式化为JSON输出或从JSON输入反序列化为Java对象时的格式12。
- 通常用于实体类中的日期字段上,确保在前端和后端之间传输的JSON数据中日期时间格式的一致性
@DateTimeFormat`
-
主要用于Spring MVC中,处理表单提交或请求参数中的日期时间字符串,将其转换为Java的日期时间对象,或将Java的日期时间对象格式化为特定格式的字符串。
-
通常与
@RequestParam
、@PathVariable
等注解一起使用,在控制器层的方法参数或返回值上指定日期时间格式
@Autowird和@Resource区别
-
@Autowired
只能注入Bean对象,包括Spring容器中的Bean对象以及自定义的Bean对象。 -
在注入时需要依赖Spring的容器,不支持直接指定注入的名称或类型(除非结合
@Qualifier
使用) -
@Resource
可以注入任何属性,包括基本类型和字符串,尽管在Spring环境下通常用于注入Bean对象 ;可以通过name
和type
属性直接指定注入的名称或类型
使用@AutoWird如何区分一个接口实现多个对象
首先,你需要确保你的Spring配置(无论是XML配置还是Java配置)已经正确地声明了这些bean,并且它们都被标记为Spring管理的组件(例如,使用@Component
、@Service
等注解)。
然后,在你的代码中,当你想要注入这个接口的一个特定实现时,你可以使用@Autowired
和@Qualifier
注解来指定你想要注入的实现。
Spring中如何解决循环依赖
A->B->C->A 不产生循环 独立出来
Maven的作用 除了jar包依赖管理 如何用Maven打包项目
在命令行中输入以下命令,并按回车键
常用git命令 代码发生冲突如何解决
手动解决冲突:
- 使用
git status
命令查看冲突的文件。 - 打开冲突文件,查找由
<<<<<<<
、=======
、>>>>>>>
标记的冲突部分。 - 手动编辑冲突文件,删除或修改冲突标记和代码,保留需要的代码。
- 保存文件,并使用
git add
命令将文件标记为已解决冲突。 - 使用
git commit
命令提交修改。
使用Git可视化工具:
- 利用如SourceTree、GitKraken等工具图形化地显示和解决冲突。
使用Git命令行合并工具:
- 使用
git mergetool
命令打开合并工具,如vimdiff、meld等,进行冲突解决。
无论哪种方法,解决冲突后都需要使用git commit
提交,然后可以git push
到远程仓库。
实现多个参数 在dao层
-
使用
@Param
注解来标识方法中的多个参数,以便在 SQL 语句中引用。 -
在 XML 映射文件中,直接使用
#{parameterName}
来引用方法参数。
实现动态sql用到哪些标签
<if>
:用于在满足特定条件时包含 SQL 片段。<choose>
:结合<when>
和<otherwise>
用于多条件选择。<trim>
:用于去除多余的 SQL 片段,如多余的逗号或空格。<foreach>
:用于遍历集合或数组,并生成 SQL 片段。<set>
:用于在UPDATE
语句中动态设置字段。
的多个参数,以便在 SQL 语句中引用。
- 在 XML 映射文件中,直接使用
#{parameterName}
来引用方法参数。
实现动态sql用到哪些标签
<if>
:用于在满足特定条件时包含 SQL 片段。<choose>
:结合<when>
和<otherwise>
用于多条件选择。<trim>
:用于去除多余的 SQL 片段,如多余的逗号或空格。<foreach>
:用于遍历集合或数组,并生成 SQL 片段。<set>
:用于在UPDATE
语句中动态设置字段。