<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[mrguif的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/mrguif</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; mrguif]]></copyright><item><title><![CDATA[滑动窗口问题]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143467573</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143467573</guid><author>mrguif</author><pubDate>Sun, 03 Nov 2024 17:20:38 +0800</pubDate><description><![CDATA[1、我们在字符串 S 中使用双指针中的左右指针技巧，初始化 left = right = 0，把索引左闭右开区间 [left, right) 称为一个「窗口」。

2、我们先不断地增加 right 指针扩大窗口 [left, right)，直到窗口中的字符串符合要求（包含了 T 中的所有字符）。

3、此时，我们停止增加 right，转而不断增加 left 指针缩小窗口 [left, right)，直到窗口中的字符串不再符合要求（不包含 T 中的所有字符了）。]]></description><category></category></item><item><title><![CDATA[SpringBoot源码（四）：run() 方法解析（一）]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143454833</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143454833</guid><author>mrguif</author><pubDate>Sun, 03 Nov 2024 12:42:09 +0800</pubDate><description><![CDATA[SpringApplicationRunListener 看名字就可以知道它是一个监听器，只不过它只负责监听 run() 方法，由于 run() 方法过于复杂，且整个 run() 方法中涉及很多切入点和扩展点，留有一个监听器可以在预定义好的切入点中扩展自定义逻辑。

SpringApplicationRunListener 提供了一系列的方法，用户可以通过回调这些方法，在启动各个流程时加入指定的逻辑处理。下面我们对照源代码和注释来了解一下该接口都定义了哪些待实现的方法及功能：]]></description><category></category></item><item><title><![CDATA[SpringBoot源码（三）：SpringApplication 对象的初始化]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143454683</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143454683</guid><author>mrguif</author><pubDate>Sat, 02 Nov 2024 18:51:56 +0800</pubDate><description><![CDATA[利用Spring的SPI机制，从项目类路径下 META-INF/spring.factories 中加载所有的 `ApplicationListener`，反射创建对象

（赋值给 SpringApplication 的成员属性：List]]></description><category></category></item><item><title><![CDATA[SpringBoot源码（二）：@SpringBootApplication注解（自动配置原理）]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143454365</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143454365</guid><author>mrguif</author><pubDate>Sat, 02 Nov 2024 18:44:43 +0800</pubDate><description><![CDATA[① SpringBoot 的自动装配机制会试图根据你所添加的依赖来自动配置你的 Spring 应用程序。例如，你添加了 HSQLDB 依赖，而且你没有手动配置任何 DataSource Bean，那么SpringBoot就会自动配置内存数据库。

② 自动配置是**非侵入性**的。 在任何时候，你都可以自定义配置来取代自动配置的特定部分。 例如，如果你添加了你自己的 DataSource bean，默认的嵌入式数据库支持就会 "退步"，从而让你的自定义配置生效。

③ 如果你想禁用掉项目中某些自动装配类，你]]></description><category></category></item><item><title><![CDATA[SpringBoot源码（一）：创建一个干净的 SpringBoot 工程]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/141939915</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/141939915</guid><author>mrguif</author><pubDate>Sat, 02 Nov 2024 18:21:02 +0800</pubDate><description><![CDATA[在pom.xml中引入父工程：`spring-boot-starter-parent` 后，相当于提供了统一的版本控制（注意，引入父工程后并没有导入任何jar包）

引入相关的场景启动器：如 spring-boot-starter-web 后，官方提供的 Xxx 场景启动器 spring-boot-starter-Xxx  ，都先会依赖 `spring-boot-starter`（核心起步依赖），再引入 Xxx 场景的其它特有依赖]]></description><category></category></item><item><title><![CDATA[ArrayList 在并发条件下的线程安全问题]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143452698</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143452698</guid><author>mrguif</author><pubDate>Sat, 02 Nov 2024 17:32:17 +0800</pubDate><description><![CDATA[elementData[size++] = e 不是一个原子操作，其本身包含两步：① elementData[size] = e   ② size++

例如有两个线程，分别向 ArrayList 中加入数字 1 与 2：]]></description><category></category></item><item><title><![CDATA[Spring 中的 Environment 对象]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143445797</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143445797</guid><author>mrguif</author><pubDate>Sat, 02 Nov 2024 11:37:34 +0800</pubDate><description><![CDATA[在 Spring 中，使用 PropertySource 对象对属性进行抽象。PropertySource 是对 "任何键值对源" 的简单抽象，提供了统一存储外部化配置数据的功能，例如上面配置的JVM系统属性就会被封装为 PropertySource 对象（可参考其 javadoc）

Environment 对象中保存了一系列 PropertySource 集合，可以使用 Environment 对 PropertySource 进行搜索获取：]]></description><category></category></item><item><title><![CDATA[Lifecycle生命周期回调]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143445619</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143445619</guid><author>mrguif</author><pubDate>Sat, 02 Nov 2024 09:06:12 +0800</pubDate><description><![CDATA[Spring容器中任何具有 “自身生命周期需求” 的对象，都可以实现 Lifecycle 接口

当 ApplicationContext 本身接收到启动和停止信号时，它会将这些信号传递给该上下文中定义的所有 Lifecycle 实现：]]></description><category></category></item><item><title><![CDATA[BeanDefinition体系架构（待...）]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143441393</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143441393</guid><author>mrguif</author><pubDate>Sat, 02 Nov 2024 08:59:38 +0800</pubDate><description><![CDATA[由上述定义可以看到，这些 BeanDefinition 会有相同的设置（setScope( "singleton" )），从而造成冗余，于是 Spring 就使用了一种 伪继承模式：

我们可以将多个 BeanDefinition 的公共部分放置在一个 RootBeanDefinition 中，然后创建多个 ChildBeandefinition，并且指定 parent 为 RootBeanDefinition 即可，如下：]]></description><category></category></item><item><title><![CDATA[并发工具类：CountDownLatch 倒计时锁]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143405662</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143405662</guid><author>mrguif</author><pubDate>Thu, 31 Oct 2024 16:41:12 +0800</pubDate><description><![CDATA[确保某些活动直到其他活动都完成才继续执行，如：

确保某个计算在其需要的所有资源都被初始化之后才继续执行;

确保某个服务在其依赖的所有其他服务都已经启动之后才启动;

等待直到某个操作所有参与者都准备就绪再继续执行。]]></description><category></category></item><item><title><![CDATA[并发编程中的CAS思想]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143404969</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143404969</guid><author>mrguif</author><pubDate>Thu, 31 Oct 2024 16:26:22 +0800</pubDate><description><![CDATA[解决思路：要递增一个计数器，你必须知道它之前的值，在将更新结果写回之前，确保其它线程没有修改过这个值]]></description><category></category></item><item><title><![CDATA[Spring事件监听机制]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/143401870</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/143401870</guid><author>mrguif</author><pubDate>Thu, 31 Oct 2024 15:42:09 +0800</pubDate><description><![CDATA[在容器刷新的 initApplicationEventMulticaster(); 步骤中

会初始化一个事件多播器ApplicationEventMulticaster（默认为SimpleApplicationEventMulticaster）
赋值给 AbstractApplicationContext 所持有的多播器成员 applicationEventMulticaster
]]></description><category></category></item><item><title><![CDATA[Spring源码：《Spring的组件扫描》]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/141903612</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/141903612</guid><author>mrguif</author><pubDate>Wed, 04 Sep 2024 20:59:33 +0800</pubDate><description><![CDATA[Spring的组件扫描的核心组件是 ClassPathBeanDefinitionScanner ，即类路径下BeanDefinition扫描器① BeanDefinitionRegistry   指明解析后产生的 BeanDefinition 存在哪② basePackage   指明扫描路径③  定义扫描规则（通过构造方法指定），按哪种规则去扫描   （如默认的扫描规则是：待扫描的类上要标注 @Component、 @Repository、 @Service、@Controller 注解）
在使用 Cl]]></description><category></category></item><item><title><![CDATA[Spring整合MyBatis：MapperScannerConfigurer 原理]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/134518441</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/134518441</guid><author>mrguif</author><pubDate>Mon, 20 Nov 2023 23:03:57 +0800</pubDate><description><![CDATA[注意到，通过配置 MapperFactoryBean 的方式，只能向容器中注入一个接口代理对象。
当有很多 DAO 接口时，就需要为每一个 DAO 接口配置 MapperFactoryBean：]]></description><category></category></item><item><title><![CDATA[SqlSessionDaoSupport讲解（引出 MapperFactoryBean）]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/134498638</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/134498638</guid><author>mrguif</author><pubDate>Mon, 20 Nov 2023 23:03:31 +0800</pubDate><description><![CDATA[SqlSessionDaoSupport 的子类可以通过调用它的 `getSqlSession()` 方法来获取这个 SqlSessionTemplate]]></description><category></category></item><item><title><![CDATA[Spring整合MyBatis：SqlSessionFactoryBean【基础】]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/134472364</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/134472364</guid><author>mrguif</author><pubDate>Mon, 20 Nov 2023 23:02:05 +0800</pubDate><description><![CDATA[SqlSessionFactoryBean 是一个负责生产 SqlSessionFactory 的工厂 Bean， 当想从容器中获取 SqlSessionFactory 对象时，Spring 会调用其 getObject() 方法进行获取。]]></description><category></category></item><item><title><![CDATA[向Spring容器中导入Bean：@Import注解【基础】]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/134427499</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/134427499</guid><author>mrguif</author><pubDate>Wed, 15 Nov 2023 19:43:49 +0800</pubDate><description><![CDATA[@Import常用于导入如下三种类：
1、普通类
2、其它配置类
3、ImportSelector接口的实现类
4、ImportBeanDefinitionRegistrar接口的实现类]]></description><category></category></item><item><title><![CDATA[Spring中的自动装配：@Autowired【基础】]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/134388605</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/134388605</guid><author>mrguif</author><pubDate>Mon, 13 Nov 2023 23:03:45 +0800</pubDate><description><![CDATA[在Spring创建对象的过程中，会为类里标有@Autowired注解的地方，默认按类型 (byType) 从容器中匹配一个bean注入进去]]></description><category></category></item><item><title><![CDATA[SpringWeb容器的启动]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/134385163</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/134385163</guid><author>mrguif</author><pubDate>Mon, 13 Nov 2023 22:12:47 +0800</pubDate><description><![CDATA[Web容器如何发现这些 ServletContainerInitializer 的实现？-----> 使用的是SPI机制]]></description><category></category></item><item><title><![CDATA[HandlerAdapter-处理器适配器]]></title><link>https://blog.youkuaiyun.com/mrguif/article/details/134281055</link><guid>https://blog.youkuaiyun.com/mrguif/article/details/134281055</guid><author>mrguif</author><pubDate>Wed, 08 Nov 2023 09:34:55 +0800</pubDate><description><![CDATA[为了将处理请求的代码在形式上做统一，所以采用了适配器模式（对外统一，使用某一种适配器，间接地操控某一同种类型的 handler）]]></description><category></category></item></channel></rss>