- 博客(24)
- 收藏
- 关注
原创 滑动窗口问题
1、我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引左闭右开区间 [left, right) 称为一个「窗口」。2、我们先不断地增加 right 指针扩大窗口 [left, right),直到窗口中的字符串符合要求(包含了 T 中的所有字符)。3、此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right),直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。
2024-11-03 17:20:38
1028
原创 SpringBoot源码(四):run() 方法解析(一)
SpringApplicationRunListener 看名字就可以知道它是一个监听器,只不过它只负责监听 run() 方法,由于 run() 方法过于复杂,且整个 run() 方法中涉及很多切入点和扩展点,留有一个监听器可以在预定义好的切入点中扩展自定义逻辑。SpringApplicationRunListener 提供了一系列的方法,用户可以通过回调这些方法,在启动各个流程时加入指定的逻辑处理。下面我们对照源代码和注释来了解一下该接口都定义了哪些待实现的方法及功能:
2024-11-03 12:42:09
1095
原创 SpringBoot源码(三):SpringApplication 对象的初始化
利用Spring的SPI机制,从项目类路径下 META-INF/spring.factories 中加载所有的 `ApplicationListener`,反射创建对象(赋值给 SpringApplication 的成员属性:List
2024-11-02 18:51:56
768
原创 SpringBoot源码(二):@SpringBootApplication注解(自动配置原理)
① SpringBoot 的自动装配机制会试图根据你所添加的依赖来自动配置你的 Spring 应用程序。例如,你添加了 HSQLDB 依赖,而且你没有手动配置任何 DataSource Bean,那么SpringBoot就会自动配置内存数据库。② 自动配置是**非侵入性**的。 在任何时候,你都可以自定义配置来取代自动配置的特定部分。 例如,如果你添加了你自己的 DataSource bean,默认的嵌入式数据库支持就会 "退步",从而让你的自定义配置生效。③ 如果你想禁用掉项目中某些自动装配类,你
2024-11-02 18:44:43
938
原创 SpringBoot源码(一):创建一个干净的 SpringBoot 工程
在pom.xml中引入父工程:`spring-boot-starter-parent` 后,相当于提供了统一的版本控制(注意,引入父工程后并没有导入任何jar包)引入相关的场景启动器:如 spring-boot-starter-web 后,官方提供的 Xxx 场景启动器 spring-boot-starter-Xxx ,都先会依赖 `spring-boot-starter`(核心起步依赖),再引入 Xxx 场景的其它特有依赖
2024-11-02 18:21:02
349
原创 ArrayList 在并发条件下的线程安全问题
elementData[size++] = e 不是一个原子操作,其本身包含两步:① elementData[size] = e ② size++例如有两个线程,分别向 ArrayList 中加入数字 1 与 2:
2024-11-02 17:32:17
387
原创 Spring 中的 Environment 对象
在 Spring 中,使用 PropertySource 对象对属性进行抽象。PropertySource 是对 "任何键值对源" 的简单抽象,提供了统一存储外部化配置数据的功能,例如上面配置的JVM系统属性就会被封装为 PropertySource 对象(可参考其 javadoc)Environment 对象中保存了一系列 PropertySource 集合,可以使用 Environment 对 PropertySource 进行搜索获取:
2024-11-02 11:37:34
925
原创 Lifecycle生命周期回调
Spring容器中任何具有 “自身生命周期需求” 的对象,都可以实现 Lifecycle 接口当 ApplicationContext 本身接收到启动和停止信号时,它会将这些信号传递给该上下文中定义的所有 Lifecycle 实现:
2024-11-02 09:06:12
914
原创 BeanDefinition体系架构(待...)
由上述定义可以看到,这些 BeanDefinition 会有相同的设置(setScope( "singleton" )),从而造成冗余,于是 Spring 就使用了一种 伪继承模式:我们可以将多个 BeanDefinition 的公共部分放置在一个 RootBeanDefinition 中,然后创建多个 ChildBeandefinition,并且指定 parent 为 RootBeanDefinition 即可,如下:
2024-11-02 08:59:38
541
原创 并发工具类:CountDownLatch 倒计时锁
确保某些活动直到其他活动都完成才继续执行,如:确保某个计算在其需要的所有资源都被初始化之后才继续执行;确保某个服务在其依赖的所有其他服务都已经启动之后才启动;等待直到某个操作所有参与者都准备就绪再继续执行。
2024-10-31 16:41:12
170
原创 Spring事件监听机制
在容器刷新的 initApplicationEventMulticaster(); 步骤中会初始化一个事件多播器ApplicationEventMulticaster(默认为SimpleApplicationEventMulticaster)赋值给 AbstractApplicationContext 所持有的多播器成员 applicationEventMulticaster
2024-10-31 15:42:09
1165
原创 Spring源码:《Spring的组件扫描》
Spring的组件扫描的核心组件是 ClassPathBeanDefinitionScanner ,即类路径下BeanDefinition扫描器① BeanDefinitionRegistry 指明解析后产生的 BeanDefinition 存在哪② basePackage 指明扫描路径③ 定义扫描规则(通过构造方法指定),按哪种规则去扫描 (如默认的扫描规则是:待扫描的类上要标注 @Component、 @Repository、 @Service、@Controller 注解)在使用 Cl
2024-09-04 20:59:33
1864
1
原创 Spring整合MyBatis:MapperScannerConfigurer 原理
注意到,通过配置 MapperFactoryBean 的方式,只能向容器中注入一个接口代理对象。当有很多 DAO 接口时,就需要为每一个 DAO 接口配置 MapperFactoryBean:
2023-11-20 23:03:57
1054
1
原创 SqlSessionDaoSupport讲解(引出 MapperFactoryBean)
SqlSessionDaoSupport 的子类可以通过调用它的 `getSqlSession()` 方法来获取这个 SqlSessionTemplate
2023-11-20 23:03:31
555
1
原创 Spring整合MyBatis:SqlSessionFactoryBean【基础】
SqlSessionFactoryBean 是一个负责生产 SqlSessionFactory 的工厂 Bean, 当想从容器中获取 SqlSessionFactory 对象时,Spring 会调用其 getObject() 方法进行获取。
2023-11-20 23:02:05
2733
1
原创 向Spring容器中导入Bean:@Import注解【基础】
@Import常用于导入如下三种类:1、普通类2、其它配置类3、ImportSelector接口的实现类4、ImportBeanDefinitionRegistrar接口的实现类
2023-11-15 19:43:49
155
原创 Spring中的自动装配:@Autowired【基础】
在Spring创建对象的过程中,会为类里标有@Autowired注解的地方,默认按类型 (byType) 从容器中匹配一个bean注入进去
2023-11-13 23:03:45
184
原创 SpringWeb容器的启动
Web容器如何发现这些 ServletContainerInitializer 的实现?-----> 使用的是SPI机制
2023-11-13 22:12:47
117
原创 HandlerAdapter-处理器适配器
为了将处理请求的代码在形式上做统一,所以采用了适配器模式(对外统一,使用某一种适配器,间接地操控某一同种类型的 handler)
2023-11-08 09:34:55
193
1
原创 SpringMVC源码:DispatcherServlet的初始化(三)
通过此阶段,DispatcherServlet 初始化了内部的9个组件(若没有在容器中配置这些组件,则会默认从外部文件 “DispatcherServlet.properties” 处决定初始化策略)DispatcherServlet 在后续请求处理的过程中,会频繁依赖这些组件来完成整个请求服务。
2023-11-07 08:54:01
71
1
原创 SpringMVC源码:DispatcherServlet的初始化(二)
此阶段完成了:①、SpringWeb容器的创建,默认创建的SpringWeb容器为 XmlWebApplicationContext ,并为此容器设置了一些属性值②、设置了父容器为rootContext③、容器的刷新通过对 initWebApplicationContext 源码的分析,我们知道了:0、SpringWeb容器的创建,发生在 DispatcherServlet 的初始化过程中。
2023-11-07 08:26:38
176
1
原创 SpringMVC源码:SpringMVC中的父子容器
我们会在web.xml中配置监听器:ContextLoaderListener。本文就来介绍这个监听器在背后做了什么
2023-11-06 11:43:46
108
原创 SpringMVC源码:DispatcherServlet的初始化(一)
HttpServletBean类的作者是Spring之父Rod Johnson。作为POJO编程哲学的大师,他在HttpServletBean这个类的设计中,运用了依赖注入思想完成了< init-param>配置元素的读取。他抽离出HttpServletBean这个类的目的也在于此,就是 “以依赖注入的方式来读取< init-param>配置信息”,而且这里很明显是一种setter注入。明白了HttpServletBean类的设计思想,我们也就知道可以如何从中获益。
2023-11-06 11:16:39
138
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人