- 博客(51)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 MySQL-在字段上使用函数不会走索引的原因是什么?
题记我们常常从关于MySQL的各种技术博客、书籍上面看到这样一句话:“不能在字段上使用函数,否则就不会走索引”。那么这句话的依据是什么呢?本文就围绕“不能在字段上使用函数,否则就不会走索引”这句话来展开分析。Talk is cheap. Show me the code假设存在这样一张交易记录表-trade_log,该表中存在三个字段id(主键),operator_id(操作人id)、create_time(交易时间)。建表语句:CREATE TABLE `trade_log` ( `id`
2021-02-18 10:39:22
2255
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 关于Spring中的一级缓存、二级缓存、三级缓存那些事
题记常常听到别人提起:“一级缓存、二级缓存、三级缓存”。那么它们是什么呢?有什么作用呢?
2021-02-04 10:39:37
22260
6
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 阿里面试题:什么是循环依赖?Spring是如何解决循环依赖的?
什么是循环依赖?顾名思义,循环依赖就是A依赖B,B又依赖A,两者之间的依赖关系形成了一个圆环,通常是由于不正确的编码所导致。Spring只能解决属性循环依赖问题,不能解决构造函数循环依赖问题,因为这个问题无解。接下来我们首先写一个Demo来演示Spring是如何处理属性循环依赖问题的。Talk is cheap. Show me the code第一步:定义一个类ComponentA,其有一个私有属性componentB。package com.tech.ioc;import org.spri
2021-01-06 09:34:48
6447
20
原创 关于MyBatis一级缓存、二级缓存那些事
前言什么是MyBatis的一级缓存、二级缓存呢,它们的作用又是什么呢?其实很简单,MYBatis的一级缓存和二级缓存的作用都是为了减少数据库查询,对于相同的DQL语句和相同的查询参数复用之前的查询结果。它们之间的区别在于缓存范围。一级缓存也称为本地缓存,其缓存范围是SqlSession级别,即使用同一个SqlSession进行相同条件的N次查询,实际只会查询数据库一次(注意,不能在这N次查询之间进行增删改,以及调用close方法,这会让缓存失效),默认开启;而二级缓存范围是全局的,也可以简单理解为接口级
2021-05-20 17:44:47
709
3
原创 使用MyBatis后,DAO层的方法还能重载吗?
接下来我们就编码测试下。1.首先定义一个Mapper:/** * @author: 君战 * @since: 2020-04-29 **/public interface OrgRealNameMapper { @Select("SELECT * FROM xxx WHERE id = #{id}") OrgRealNameDO selectByPrimaryKey(Integer id); @Select("SELECT * FROM xxx WHERE id
2021-05-15 09:34:43
2340
3
原创 从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(三)?
做为分析Spring是如何将@ComponentScan注解属性basepackages指定的包路径下的资源通过I/O来读取,通过ASM来解析类中的注解元数据(MetadataReader→AnnotationMetadata)并构造成BeanDe-finition这个过程的最后最后一篇文章。在文章开始前先总结下前面两篇文章讲了些什么。从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?在第一篇文章中,我们分析了在AbstractApplic
2021-03-08 07:30:56
392
原创 小知识-Spring Boot是如何确定当前运行环境
Talk is cheap. Show me the codestatic WebApplicationType deduceFromClasspath() { if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null) && !ClassUtils.isPresent(JERSEY_INDICATOR_C
2021-03-01 11:36:14
2415
原创 MyBatis的四种资源加载方式以及优先级
什么是MyBatis资源加载?MyBatis资源加载指的就是如何加载我们定义好的映射文件(可能使用的是XML方式,也可能是注解方式),只有这样,MyBatis才能解析我们写的SQL以及将XML中的SQL和接口中的方法关联起来等等。其实所有的资源加载都差不多,Spring也有这样的资源加载机制,例如支持URL方式的资源加载、支持classpath方式的资源加载、支持文件方式的资源加载等等。MyBatis的资源加载方式有几种?我们可以首先查看MyBatis官方文档。在官方文档中给出了四种资源加载的方式:
2021-02-09 15:21:30
1016
原创 MySQL逻辑架构
大体来说,MySQL可以分为两层:Server层和存储引擎层。Server层Server层包含连接器、查询缓存、分析器、优化器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层而存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。不同的存储引擎共用一个Server层。连接器第一步是要和数据库建立链接,这时候就要和连
2021-02-03 07:57:23
195
原创 SpringMVC全局异常处理机制常见问题及底层实现分析
题记本文由以下两部分组成:第一部分,介绍SpringMVC中异常处理方式有哪些;第二部分,常见问题分析;第三部分,底层实现原理分析。
2021-02-01 08:23:42
667
原创 MyBatis数据库链接池源码分析
简介MyBatis默认提供了一个数据库链接池的实现-PooledDataSource,但是在企业级项目中几乎没有公司使用。今天我们就来分析下其源码实现,以及为什么不使用该链接池的原因。需要提前声明的是,在阅读源码前最好有一些J.U.C(java.util.concurrent)方面的基础知识源码分析从类关系中可以看出,PooledDataSource实现了Java定义的DataSource接口。我们都知道从数据源获取一个数据库链接是调用getConnection方法。因此,我们首先来分析下getCon
2021-01-22 12:46:53
367
1
原创 基于主键索引和普通索引的查询区别
聚簇索引与非聚簇索引假设存在这样一个表,表t1,主键为int类型的id,还有一个int类型的num。create table t1( int id primary key auto_increment; int num not null, index idx_num(num))engine = innodb;其第一行到第五行的数据分别为:(100,1)、(200,2)、(300,3)、(400,4)、(500,5),那么对应的B+Tree为:可以看出,主键索引的叶子节点存放的是整行数
2021-01-19 09:53:30
2488
6
原创 展望Spring野心-Spring资源定位
Java标准资源定位在Java标准资源管理中有面向资源的文件系统、artifact以及远程资源(HTTP、FTP等)。它们对应Java中的ClassLoader#getResource、File以及URL或者URI。Spring为什么要另起炉灶搞一套资源定位呢?主要是因为Java的标准资源定位接口不统一,分散到不同的API中。Spring有自己的野心,他想通过自定义一套API来进行整合,忽略底层的实现差异。事实上Spring也完成了这个目的,那就是其定义的Resource接口。该接口有三个主要
2021-01-17 10:53:16
195
原创 Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(二)?
书接上文 Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?在执行完ClassPathScanningCandidateComponentProvider的scanCandidateComponents方法后,应用上下文已经将在类中添加@Component或者由javax.annotation包中提供的@ManagedBean或者N-amed注解的Class通过ASM技术读取到类元信息并构造成SimpleMetadatRe
2021-01-13 09:45:36
344
1
原创 手写SpringMVC
SpringMVC整体执行流程图1.DispatcherServlet 接收到请求后, 将根据请求信息交给处理器映射器 (HandlerMapping)。2.处理器映射器根据用户请求的URL查找该URL所对应的Handler,然后根据请求找到对应的(HandlerExecutionChain)。3.在请求处理器适配器之前,会先执行拦截器链的preHandle方法,如果该方法返回false,则执行结束,不会往下继续执行。4.DispatcherServlet请求处理器适配器(HandlerAdap
2021-01-10 11:59:21
193
原创 Spring IoC、应用上下文容器层次分析
相信很多同学在学习Spring源码时,总会被Spring IoC和应用上下文复杂的层次性所搞晕,debug时一会调到这个类一会调到那个类的,搞得晕头转向的,今天我们就分析下Spring IoC和应用上下文(ApplicationContext)的层次性,以及Spring为什么这样设计。BeanFactory这里我们以Spring...
2021-01-08 08:28:04
710
原创 扩展Spring-自定义Bean的作用域(Scope)
前提摘要之所以说Spring的IoC容器是最好的IoC容器实现之一,是因为其太灵活了,在各个执行链路中都留下了足够的扩展点,通过这些扩展点,可以打造出千人千面的IoC容器。废话不多说。我们都知道通过XML或者注解向IoC容器注册的Bean,Scope默认都是单例的,如果想配置其它作用域,可以通过添加@Scope注解配置其value属性来指定作用域。非Web环境支持Singl-eton和property。Web环境增加了四个作用域:request、session、application、websocket
2021-01-07 09:43:56
2019
2
原创 MyBatis中拦截器(Interceptor)实现原理分析
简介插件是用来改变或者扩展MyBaits原有的功能,MyBatis对外提供的扩展点共有四个,可以使用插件进行拦截的接口和方法如下:Executorupdate(updaye、query、flushStatement、commit、rollback、getTransaction、close、isClose)。StatementHandler(prepare、parameter、batch、update、query)。ParameterHandler(getParameterObject、set
2021-01-05 09:16:51
4336
原创 @Resource真的只是按名称来进行依赖注入吗?@Autowired真的只是按照类型来依赖注入吗?
背景我们常听别人说:“Spring中的@Autowired是按类型来依赖注入的,@Resource是按名称来依赖注入的”,那么这句话到底正不正确呢?这里我先下个定论,“Spring中的@Autowired是按类型来依赖注入的,@Resource是按名称来依赖注入的”这句话正确也不正确。要怎么理解呢?@Resource注解是优先按照名称来进行依赖注入,但如果按名称找不到对应的Bean时,还是按类型来进行依赖注入;同样,当某个接口存在多个实现类,并且这些实现类都交给IoC容器管理,那么@Autowired也
2021-01-04 13:13:21
3156
1
原创 Spring-自定义BeanName生成规则
BeanName是什么?BeanName是Spring中用来区分不同Bean的一种手段,IoC容器必须保证BeanName的唯一性。如果无法保证BeanName的唯一性,容器会抛出异常,类似于我们的身份证,用户可以通过BeanName来定位唯一一个Bean。例如通过BeanFactory或者ApplicationContext提供的getBean方法。AbstractSuperBean extendAbstractBean = (AbstractSuperBean) applicationCo
2021-01-03 10:02:35
3026
2
原创 Spring事务传播实现原理
什么是事务传播?假设这样一个场景:方法A上面添加了一个@Transactional注解,在该方法中去调用另一个Service的方法B,但方法B并不需要事务,但是由于A开启了事务,导致B方法的执行也处于事务范围,那么这种情况该如何处理呢?简单来说事务传播其实就是当一个事务方法调用其它方法时,被调用的方法可以通过@Transactional注解来决定如何应对调用方的事务,是抛出异常(Propagation.NEVER)?还是挂起调用方的事务(Propagation.NOT_SUPPORTED)?还是被调用方
2021-01-03 09:49:49
2947
3
原创 在单例Bean中依赖原型Bean问题解决
Talk is cheap. Show me the code第一步:创建一个单例Bean。package com.xxx.hyl.scope;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.config.ConfigurableBeanFactory;import org.springframework.context.annotatio
2021-01-02 09:19:52
386
原创 Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
阅前提醒全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解。由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位大佬在评论区留言指正。如果各位小伙伴由于笔者描述不清,而不理解的地方也欢迎在评论区留言哦!该系列文章共有三篇,敬请期待~ ~ ~正文一切的开始要从AbstractApplicationContext的refresh方法说起。refresh方法是应用上下文中最重要的方法,没有之一!public void
2021-01-02 09:18:53
713
3
原创 SpringMVC中的九大组件
HandlerMapping将请求映射到处理程序以及用于预处理和后处理的拦截器列表,其细节因HandlerMapping不同实现而异。两个主要的HandlerMapping实现是RequestMappingHandlerMapping(它支持@RequestMapping注释方法)和SimpleUrlHandlerMapping(它维护URI路径模式到处理程序的显式注册)。HandlerAdapter帮助DispatcherServlet调用映射到请求的处理程序,而不管该处理程序实际是如何调用的。例
2021-01-01 16:49:37
417
原创 DispatcherServlet和Spring应用上下文初始化详解
SpringMVC中的Servlet一共有三层:HttpServletBean、FrameworkServlet和DispatcherServlet。HttpServletBean直接继承于Java的HttpServlet,其作用是将Servlet中配置的参数设置到相应的属性。该类实现Servlet生命周期中的init方法,但并未实现destroy方法。FrameworkServlet初始化了WebApplicationContext。并且实现了Servlet生命周期中的destroy方法,在该方法中调
2021-01-01 16:30:32
634
原创 深入理解@Lazy注解
结论当将@Lazy注解加在字段时,Spring应用上下文会为目标类型创建一个代理对象,Talk is cheap. Show me the code第一步:编写一个类交由IoC容器管理。package com.xxx.hyl.lazy;import org.springframework.context.annotation.Lazy;/** * 演示当前Bean 被延迟加载,需注意的是必须在当前类上添加{@link Lazy}注解,否则当前类在IoC容器初始化的时候就会被实例化 *
2020-12-31 13:43:20
3129
原创 查看Cglib生成的Class(字节码)文件
Talk is cheap. Show me the code第一步:编写一个类,用于被CGLIB增强。package com.xxx.hyl.cglib;public class BaseBean { public void say() { System.out.println("this is son"); }}第一种方式查看CGLIB增强后的Class。package com.xxx.hyl.cglib;import net.sf.cglib.c
2020-12-31 10:45:37
2458
原创 Bean被IoC容器销毁后还能使用吗?
Talk is cheap. Show me the code第一步:定义一个Bean用来测试。package com.xxx.hyl.ioc;/** * Bean 销毁演示 * @author 君战 * * **/public class DestroyBean {}第二步:使用IoC容器来销毁Bean,再次获取。package com.xxx.hyl.ioc;import org.springframework.context.annotation.AnnotationC
2020-12-30 16:01:39
899
4
原创 Spring Boot不指定包路径就可以扫描启动类所在包及其子包下的类是怎么做到的?
Talk is cheap. Show me the code第一步:在com.xxx.hyl.boot包下创建一个子包-beans,并在该包中创建一个Bean。package com.xxx.hyl.boot.beans;import org.springframework.context.annotation.ComponentScan;import org.springframework.stereotype.Component;/*** * 使用{@link ComponentScan
2020-12-29 17:41:41
2562
1
原创 一图助你搞明白Spring应用上下文初始化流程!
未经授权,不得转载。Talk is cheap. Show me the codepackage com.xxx.hyl.context.initialize;import org.springframework.context.annotation.AnnotationConfigApplicationContext;/** * Spring 应用上下文 初始化流程演示 * @author 君战 * * **/public class ApplicationContextInitia
2020-12-29 16:36:42
1006
12
原创 在Spring IoC中,依赖注入和依赖查找的数据来源区别
什么是依赖注入?什么是依赖查找?简单来说,依赖查找是一个主动获取的过程,例如我需要某个Bean,通过BeanFactory的getBean方法来获取;依赖注入是一个被动接受的过程,例如我需要某个Bean,我只需在类中方法或字段上添加@Autowired或@Resource注解即可,由IoC容器来帮我完成查找并注入。Talk is cheap. Show me the code第一步:定义一个Bean,其拥有ApplicationContext、BeanFactory、ApplicationEventP
2020-12-28 15:34:53
1580
6
原创 从源码理解Bean的生命周期执行顺序
Talk is cheap. Show me the code第一步,定义一个Bean实现InitializingBean、DisposableBean、BeanPostProcessor、ResourceLoaderAware、BeanFactoryAware、BeanClassLoaderAware接口。package com.xxx.hyl.bean.lifecycle;import org.springframework.beans.BeansException;import org.sp
2020-12-28 13:58:53
372
原创 什么是安全查找Bean,什么是非安全查找Bean?如何安全地查找Bean?
查找Bean有哪些手段?总体来说,查找Bean有两种手段,一种是单Bean查找(只会返回一个Bean),一种是多Bean查找(返回多个Bean),它们分别对应BeanFactory和ListableBeanFactory。ListableBeanFactoty继承自BeanFactory接口。再往细分,BeanFactory接口定义的方法主要有两种,一种是根据名称或类型非安全查找(当未根据传入的参数查找到对应的Bean时会抛出异常),这系列的代表是getBean(String)、getBea
2020-12-28 10:18:51
606
1
原创 对于相同Bean,在父应用上下文中定义的切面,在子应用上下文中会生效吗?
背景描述假设这样一个场景,在父应用上下文中持有一个类的Bean实例,并针对这个Bean定义了相关切面,而在子容器中也持有和父应用上下文相同类的Bean实例,但未定义针对该Bean的切面,那么当从子应用上下文中获取该Bean实例并执行其方法时,定义在父应用上下文中的切面会生效吗?结论会生效。因为Spring AOP 在使用应用上下文(ApplicationContext)查找切面时,会使用层次性查找。虽然在子容器中未定义切面,但是会把父容器中的切面找到。Talk is cheap. Show me t
2020-12-27 11:32:21
505
3
原创 SpringMVC中的父子容器关系
先贴出Spring 官方文档对父子容器的描述:官方文档地址何为根容器?在Spring MVC场景中,官方对根容器的定义是用来管理基础设施Bean,例如需要跨多个Servlet实例共享的DAO或者Service。何为子容器?在Spring MVC场景中,官方对子容器的定义是Servlet级别的,因为Spring MVC是基于Servlet的,而我们都知道Servlet可以通过标签来指定对不同请求的处理,而每个Servlet持有的子容器管理的视图解析器、控制器、处理器映射器、处理器适配器都不相同,这些
2020-12-26 20:07:55
396
原创 什么场景下声明式事务会失效?如何解决?
先说下使用的ORM框架-MyBatis,数据库链接池为阿里巴巴的Druid。Talk is cheap. Show me the code数据库DDLCREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf
2020-12-26 17:25:27
940
1
原创 SpringBoot工程中,如果不继承spring-boot-starter-parent ,还可以怎么做到的版本管理?
有些场景下,我们就是不能直接继承spring-boot-starter-parent,那么该如何做到版本管理呢?关于这一点,SpringBoot官方给出了解决版本,就是使用标签来解决。除此之外,还需要将打包插件设置为repackage。<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot<
2020-12-26 10:17:40
1289
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人