<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Forget_Re的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Forget_Re</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Forget_Re]]></copyright><item><title><![CDATA[手写Spring-第十六章-旋转吧雪月花！用三级缓存解决循环依赖]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128396884</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128396884</guid><author>Forget_Re</author><pubDate>Wed, 21 Dec 2022 14:39:10 +0800</pubDate><description><![CDATA[循环依赖，一直是一个令人头疼的问题。虽然我们一般情况下会尽量避免这种情况的发生，但很多时候它会在无意识的情况下出现。比如隔了好几个bean之后，发现循环起来了。那么什么是循环依赖呢？其实就是A依赖B，但B又依赖A。或者A依赖B，B依赖C，C又依赖A这样，构成一个循环。按照我们之前的实现，是无法解决这种循环的。因为之前的逻辑实际上比较单纯，就是遍历Bean定义，然后逐一实例化，遇到依赖的Bean，那就先去实例化依赖Bean。但这样就会发现，实例依赖Bean的时候，依赖Bean又依赖当前Bean。]]></description><category></category></item><item><title><![CDATA[手写Spring-第十五章-我也要注入？为代理对象注入属性，完善AOP]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128318790</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128318790</guid><author>Forget_Re</author><pubDate>Wed, 14 Dec 2022 16:55:33 +0800</pubDate><description><![CDATA[我们上一章实现了用注解为对象注入属性。但是还有一个地方我们没有照顾到，那就是代理对象属性的注入。你可能会疑惑，我们的Bean，不都是通过cglib代理出来的吗？那不都是代理对象？但我们这里说的代理对象，并不是这些。还记得之前我们的AOP相关部分吗？那里我们实现AOP功能的时候，走的是特殊路径来创建代理bean，从而实现将我们的增强逻辑插入进去。但当时的实现过程存在一个隐患，那就是在创建原始对象的时候，是直接调用方法进行的。]]></description><category></category></item><item><title><![CDATA[手写Spring-第十四章-再次进化！用注解完成属性的注入]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128297244</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128297244</guid><author>Forget_Re</author><pubDate>Tue, 13 Dec 2022 09:51:40 +0800</pubDate><description><![CDATA[上次我们的标题中用了【超进化】这个词，从配置文件升级到用注解来进行bean的注册，这确实可以称得上是超进化。但总觉得进化的不是那么完全，大概是从亚古兽进化到暴龙兽这样的程度(?)。因为我们还是在测试过程中，在配置文件中进行了一些Bean的配置。这些配置，不仅是为了测试两种Bean注册方式都可用，更多的是一种无奈之举。因为我们还没法用注解往bean中注册一些属性和依赖的bean。所以我们只能用原始的方式来注册。那么，这一章，我们就来完成这一块内容，让我们可以用注解完成所有的工作，彻底摆脱配置文件。]]></description><category></category></item><item><title><![CDATA[手写Spring-第十三章-超进化！用注解完成Bean的注册]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128254744</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128254744</guid><author>Forget_Re</author><pubDate>Fri, 09 Dec 2022 16:05:38 +0800</pubDate><description><![CDATA[我们的框架，到了今天，其实已经比较完备了。Spring的两大特性：IOC和AOP，都已经被我们实现了。这让我想到了那句名言：【物理学的大厦已经落成，上面只有两朵乌云】（flag就这么立起来了）。那对于我们的框架来说，乌云是什么呢？易用性。我们虽然实现了这些基本功能，但是用起来总觉得很古老，和我们现在熟悉的Spring有所区别。我们现在根本不会去配置文件里面一个一个的配置bean，而是直接用注解来完成。只能说懒惰是第一生产力，人类为了偷懒，真的是煞费苦心。]]></description><category></category></item><item><title><![CDATA[手写Spring-第十二章-Engage！将AOP和Spring生命周期结合起来]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128234676</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128234676</guid><author>Forget_Re</author><pubDate>Thu, 08 Dec 2022 12:12:37 +0800</pubDate><description><![CDATA[这里先说一点题外话。由于明年一月份火焰纹章系列新作-火焰纹章Engage就要发售了，我作为一个老火纹厨表示，这个2022年真的一秒钟也待不下去了（恼）。所以就用了这么个标题。也算是强行契合了这次的主题。Engage，有结合的意思。我们上一章用动态代理，实现了AOP的核心功能。但是这个功能的实现相对比较独立，和前面的内容有很强的割裂感。那我们自然是不能满足于这样的现状的，直接把这样的内容交给用户，是很难使用的。我们需要把它和Spring的生命周期结合起来，以配置的方式，达到润物细无声的效果。]]></description><category></category></item><item><title><![CDATA[手写Spring-第十一章-用动态代理实现AOP核心功能]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128201082</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128201082</guid><author>Forget_Re</author><pubDate>Tue, 06 Dec 2022 13:01:29 +0800</pubDate><description><![CDATA[前面经过了十章的漫长练习，我们终于把Spring的IOC部分完善的差不多了。那么从这一章开始，我们就要步入Spring的另外半壁江山：AOP了。AOP，也就是面向切面编程。它可以实现对业务逻辑的各个部分进行隔离，从而降低各个模块之间的耦合度，提高代码可复用性。我们平时对Spring AOP的应用，最常见的情况可能就是对方法执行的监控了。比如在方法执行前后输出一些日志之类的。那么Spring是如何实现这个功能的呢？答案就是动态代理。我们最终使用的类，实际上已经不是我们最原始的类了，而是被Spring代理过的类]]></description><category></category></item><item><title><![CDATA[手写Spring-第十章-让我看看！基于观察者模式的事件机制]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128146162</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128146162</guid><author>Forget_Re</author><pubDate>Fri, 02 Dec 2022 12:42:29 +0800</pubDate><description><![CDATA[解耦，是我们一直以来都很重视的事情。而事件，就是我们实现解耦的一大利器。通过观察者模式，我们可以实现事件的发布和订阅之间的解耦。而且在日常开发中，事件的使用场景也是很常见的。比如用户注册完成，可以产生一个事件，以便后续进行操作。或者用户下单，也可以产生一个事件，然后各种监听器对下单这个事件进行自己的处理。这些都是事件机制的使用案例。这次，我们就来实现Spring中的事件。我们使用Spring框架之后，就可以使用Spring给我们提供的事件发布机制，不需要我们自己去实现了。]]></description><category></category></item><item><title><![CDATA[手写Spring-第九章-FactoryBean：我是工厂，也是Bean]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128117528</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128117528</guid><author>Forget_Re</author><pubDate>Wed, 30 Nov 2022 16:24:52 +0800</pubDate><description><![CDATA[上回书说到，我们用Aware接口实现了感知，让bean能感受到Spring组件的一部分。其实从这里我们也可以看出，Spring不仅为我们提供了自身的功能，同时也给我们留出了许多扩展的接口。那么这一次，我们就要实现FactoryBean接口。这个接口可以让我们自己编写一个Factory用来生产bean。而这个Factory，本身也是Spring中的一个bean。所以就有了标题中的【我是工厂，也是Bean】这么一个说法。那么我们可以通过这个接口做什么事情呢？]]></description><category></category></item><item><title><![CDATA[手写Spring-第八章-感受波动！用Aware接口来实现感知]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128022962</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128022962</guid><author>Forget_Re</author><pubDate>Thu, 24 Nov 2022 17:24:26 +0800</pubDate><description><![CDATA[感知，是一个很玄乎的词。其实我们可以这样理解。正常情况下，我们的bean，是不应该意识到Spring框架的存在的，它虽然被Spring所管理，但是它本身意识不到管理者的存在。从初始化，到销毁，在它自己看来，其实都是一个正常的java对象应该有的流程。只不过调用者是Spring而已。那么总有些时候，我们需要让bean【感知到】Spring框架的存在，体现在代码中，就是获取到属于Spring框架的一部分，比如bean工厂：是谁生产出自己的。ApplicationContext：自己属于哪个上下文。]]></description><category></category></item><item><title><![CDATA[手写Spring-第七章-钩直饵咸？虚拟机钩子与bean的初始化和销毁]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128022939</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128022939</guid><author>Forget_Re</author><pubDate>Thu, 24 Nov 2022 17:23:28 +0800</pubDate><description><![CDATA[上一次的练习中，我们主要实现了后置处理器，对bean定义以及bean进行了扩展。那个时候留下了一个坑，也就是bean的【初始化】，我们是没有内容的。那么这一次，我们就来填上这个坑。不仅如此，有开始，就有结束。所以，我们还要加上bean的销毁逻辑。对于没接触过的人来说，这块可能没有什么【实感】。你说初始化和销毁，我又没接触过，它到底可以完成哪些操作？其实不管是初始化还是销毁，它都是一个方法。方法的内容是我们自己来决定的，Spring只是留了这么个扩展点给我们。我们日常使用，自然可以不用去理会这些。]]></description><category></category></item><item><title><![CDATA[手写Spring-第六章-让我访问！实现前置后置处理扩展功能]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128022921</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128022921</guid><author>Forget_Re</author><pubDate>Thu, 24 Nov 2022 17:22:36 +0800</pubDate><description><![CDATA[上一次我们实现了bean定义的自动化注册，这让我们的demo看起来已经很有Spring的那个味道了。但是扩展性还是差了一些。我们都知道，要写出高内聚，低耦合，富有扩展性的代码。那么如何增加扩展性呢？想想Spring中的AOP吧。在我们使用切面的时候，是不是可以在方法执行的前后进行拦截，加入我们自己的逻辑？这就是一种扩展性。它可以让我们在不修改主体逻辑的前提下，完成一些功能的扩展。那么我们这次要做的，虽然不是AOP，但思想和这个是类似的。]]></description><category></category></item><item><title><![CDATA[手写Spring-第五章-解放双手！自动化配置！]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128022885</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128022885</guid><author>Forget_Re</author><pubDate>Thu, 24 Nov 2022 17:21:35 +0800</pubDate><description><![CDATA[上次我们完成了Bean之间依赖的注入。但在最后测试的时候，吃到了苦头。Bean定义的构建太麻烦了>_]]></description><category></category></item><item><title><![CDATA[手写Spring-第四章-为依赖的对象注入灵魂！]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128022849</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128022849</guid><author>Forget_Re</author><pubDate>Thu, 24 Nov 2022 17:20:23 +0800</pubDate><description><![CDATA[经过了前面的三章，不知道大家有没有一个感觉，总觉得有些怀念Spring中我们最常用到的那个东西，但是等啊等啊，一直没有提到它。没错，就是我们的@Autowired！单丝不成线，孤木不成林。很多时候我们的一个bean，并不能仅靠自己就完成一项任务，它会需要依赖其他的bean。我们常用的做法，自然就是将依赖的bean注入进来。那么这一章，我们就来解决这件事情：如何解决bean的依赖。]]></description><category></category></item><item><title><![CDATA[手写Spring-第三章-来填坑吧！有参bean的实例化策略]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128022815</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128022815</guid><author>Forget_Re</author><pubDate>Thu, 24 Nov 2022 17:18:56 +0800</pubDate><description><![CDATA[上次我们终于把bean实例化这一步骤交给Spring容器了，这是个了不起的进步。但是，我们还是埋下了一个坑，那就是，这个实例化的手段，过于粗糙了。我们仅仅是简单的调用了newInstance方法而已，这样只能新建一个无参对象。当我们遇到有参构造方法的时候，这里就会报错了。那么这一章，我们就来填上这个坑，让有参bean也可以正常实例化！]]></description><category></category></item><item><title><![CDATA[手写Spring-第二章-实现 Bean 的定义、注册、获取]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/128022791</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/128022791</guid><author>Forget_Re</author><pubDate>Thu, 24 Nov 2022 17:18:00 +0800</pubDate><description><![CDATA[上一章我们实现了一个简化的Bean容器，那么这一章开始，我们就要上一些强度了。这一章主要的目的是，让Spring容器来自动化实现Bean的创建，并且实现单例Bean的复用。在上一章，我们只实现了一个容器，bean的创建，实际上还是我们在注册bean的时候手动new出来的。那么这次，我们就让Spring容器来帮我们做这些工作。/*** Bean的定义，将Bean的Class类型注册到这里来**/}}}]]></description><category></category></item><item><title><![CDATA[手写Spring-第一章-实现一个简单的Bean容器]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/127977608</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/127977608</guid><author>Forget_Re</author><pubDate>Tue, 22 Nov 2022 10:20:41 +0800</pubDate><description><![CDATA[开个新坑，来整点儿大项目。有这个想法是因为用了那么久的Spring，但是某一天突然冒出来一个念头：Spring到底是怎么实现这些功能的。发现脑子一片空白。在我抽出纸巾擦干脑门儿上的汗之后，我决定去网上搜索Spring源码解读。但是找来找去，要么讲的乱七八糟，要么就是过于庞大，一下子堆到面前，看不下去。终于，找到了一个还不错的教程，作者基于Spring框架，自己手写了一个简化版的Spring，而且代码的命名、类之间的关系，都是根据真正的Spring来的，只不过有所简化。我想，这就是我要找的教程了。]]></description><category></category></item><item><title><![CDATA[JVM学习笔记-运行时数据区域]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/127885313</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/127885313</guid><author>Forget_Re</author><pubDate>Mon, 21 Nov 2022 11:20:33 +0800</pubDate><description><![CDATA[之前在学习和工作的过程中，一直有听过JVM在运行时会把不同的数据存放在不同的区域，比如堆、栈、程序计数器之类的概念。但对于这些概念只是停留于听过有个印象而已。这次专门学习了JVM的一些内容，也在这里做一个笔记，记录一下这个知识点。]]></description><category></category></item><item><title><![CDATA[MYSQL主从同步配置过程记录-docker方式]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/127885262</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/127885262</guid><author>Forget_Re</author><pubDate>Mon, 21 Nov 2022 11:20:07 +0800</pubDate><description><![CDATA[由于我们采用的是docker进行部署，docker容器间是隔离的，所以无法直接通过本地ip访问到主节点。这里可以看到，mysql的镜像已经拉取下来了，那么下一步就是要开启两个节点，分别作为主节点和从节点。近期在学习MYSQL的主从读写分离，先学习了如何配置MYSQL的主从复制，在这里记录一下步骤。执行如上语句，即可让从节点通过主节点的日志来进行复制操作，也就是主从复制了。这样，我们就开了两个节点，3306端口是主节点，3307节点是从节点。，这一步是开启操作记录日志，主从复制就是通过这里的日志来进行的。]]></description><category></category></item><item><title><![CDATA[MYSQL分库分表配置过程记录-mycat实现]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/127885239</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/127885239</guid><author>Forget_Re</author><pubDate>Mon, 21 Nov 2022 11:19:43 +0800</pubDate><description><![CDATA[之前学习了MYSQL的主从同步，现在来学习一下分库分表。网上查了很多资料，最终决定使用mycat来实现，因为个人觉得这个中间件更符合使用习惯。这次使用的环境和上次主从同步的一致，主从同步的文章链接在此由于这次配置的是分库分表，所以我们要先取消掉数据库的主从同步。方法也很简单，在slave数据库中执行stop slave即可。执行完毕后，salve数据库就和master数据库解除了主从关系，可以认为是两个独立的数据库了。下面我们来配置Mycat。]]></description><category></category></item><item><title><![CDATA[sharding-proxy分表配置过程记录]]></title><link>https://blog.youkuaiyun.com/Forget_Re/article/details/127885216</link><guid>https://blog.youkuaiyun.com/Forget_Re/article/details/127885216</guid><author>Forget_Re</author><pubDate>Mon, 21 Nov 2022 11:19:00 +0800</pubDate><description><![CDATA[之前研究过通过mycat进行分库分表的配置，最近发现很多项目上用的都是sharding-proxy来实现，所以也来进行一个学习。下面来简单记录一下搭建的过程。]]></description><category></category></item></channel></rss>