自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 手写Spring-第十六章-旋转吧雪月花!用三级缓存解决循环依赖

循环依赖,一直是一个令人头疼的问题。虽然我们一般情况下会尽量避免这种情况的发生,但很多时候它会在无意识的情况下出现。比如隔了好几个bean之后,发现循环起来了。那么什么是循环依赖呢?其实就是A依赖B,但B又依赖A。或者A依赖B,B依赖C,C又依赖A这样,构成一个循环。按照我们之前的实现,是无法解决这种循环的。因为之前的逻辑实际上比较单纯,就是遍历Bean定义,然后逐一实例化,遇到依赖的Bean,那就先去实例化依赖Bean。但这样就会发现,实例依赖Bean的时候,依赖Bean又依赖当前Bean。

2022-12-21 14:39:10 474

原创 手写Spring-第十五章-我也要注入?为代理对象注入属性,完善AOP

我们上一章实现了用注解为对象注入属性。但是还有一个地方我们没有照顾到,那就是代理对象属性的注入。你可能会疑惑,我们的Bean,不都是通过cglib代理出来的吗?那不都是代理对象?但我们这里说的代理对象,并不是这些。还记得之前我们的AOP相关部分吗?那里我们实现AOP功能的时候,走的是特殊路径来创建代理bean,从而实现将我们的增强逻辑插入进去。但当时的实现过程存在一个隐患,那就是在创建原始对象的时候,是直接调用方法进行的。

2022-12-14 16:55:33 685

原创 手写Spring-第十四章-再次进化!用注解完成属性的注入

上次我们的标题中用了【超进化】这个词,从配置文件升级到用注解来进行bean的注册,这确实可以称得上是超进化。但总觉得进化的不是那么完全,大概是从亚古兽进化到暴龙兽这样的程度(?)。因为我们还是在测试过程中,在配置文件中进行了一些Bean的配置。这些配置,不仅是为了测试两种Bean注册方式都可用,更多的是一种无奈之举。因为我们还没法用注解往bean中注册一些属性和依赖的bean。所以我们只能用原始的方式来注册。那么,这一章,我们就来完成这一块内容,让我们可以用注解完成所有的工作,彻底摆脱配置文件。

2022-12-13 09:51:40 505

原创 手写Spring-第十三章-超进化!用注解完成Bean的注册

我们的框架,到了今天,其实已经比较完备了。Spring的两大特性:IOC和AOP,都已经被我们实现了。这让我想到了那句名言:【物理学的大厦已经落成,上面只有两朵乌云】(flag就这么立起来了)。那对于我们的框架来说,乌云是什么呢?易用性。我们虽然实现了这些基本功能,但是用起来总觉得很古老,和我们现在熟悉的Spring有所区别。我们现在根本不会去配置文件里面一个一个的配置bean,而是直接用注解来完成。只能说懒惰是第一生产力,人类为了偷懒,真的是煞费苦心。

2022-12-09 16:05:38 684

原创 手写Spring-第十二章-Engage!将AOP和Spring生命周期结合起来

这里先说一点题外话。由于明年一月份火焰纹章系列新作-火焰纹章Engage就要发售了,我作为一个老火纹厨表示,这个2022年真的一秒钟也待不下去了(恼)。所以就用了这么个标题。也算是强行契合了这次的主题。Engage,有结合的意思。我们上一章用动态代理,实现了AOP的核心功能。但是这个功能的实现相对比较独立,和前面的内容有很强的割裂感。那我们自然是不能满足于这样的现状的,直接把这样的内容交给用户,是很难使用的。我们需要把它和Spring的生命周期结合起来,以配置的方式,达到润物细无声的效果。

2022-12-08 12:12:37 343

原创 手写Spring-第十一章-用动态代理实现AOP核心功能

前面经过了十章的漫长练习,我们终于把Spring的IOC部分完善的差不多了。那么从这一章开始,我们就要步入Spring的另外半壁江山:AOP了。AOP,也就是面向切面编程。它可以实现对业务逻辑的各个部分进行隔离,从而降低各个模块之间的耦合度,提高代码可复用性。我们平时对Spring AOP的应用,最常见的情况可能就是对方法执行的监控了。比如在方法执行前后输出一些日志之类的。那么Spring是如何实现这个功能的呢?答案就是动态代理。我们最终使用的类,实际上已经不是我们最原始的类了,而是被Spring代理过的类

2022-12-06 13:01:29 452

原创 手写Spring-第十章-让我看看!基于观察者模式的事件机制

解耦,是我们一直以来都很重视的事情。而事件,就是我们实现解耦的一大利器。通过观察者模式,我们可以实现事件的发布和订阅之间的解耦。而且在日常开发中,事件的使用场景也是很常见的。比如用户注册完成,可以产生一个事件,以便后续进行操作。或者用户下单,也可以产生一个事件,然后各种监听器对下单这个事件进行自己的处理。这些都是事件机制的使用案例。这次,我们就来实现Spring中的事件。我们使用Spring框架之后,就可以使用Spring给我们提供的事件发布机制,不需要我们自己去实现了。

2022-12-02 12:42:29 314

原创 手写Spring-第九章-FactoryBean:我是工厂,也是Bean

上回书说到,我们用Aware接口实现了感知,让bean能感受到Spring组件的一部分。其实从这里我们也可以看出,Spring不仅为我们提供了自身的功能,同时也给我们留出了许多扩展的接口。那么这一次,我们就要实现FactoryBean接口。这个接口可以让我们自己编写一个Factory用来生产bean。而这个Factory,本身也是Spring中的一个bean。所以就有了标题中的【我是工厂,也是Bean】这么一个说法。那么我们可以通过这个接口做什么事情呢?

2022-11-30 16:24:52 352

原创 手写Spring-第八章-感受波动!用Aware接口来实现感知

感知,是一个很玄乎的词。其实我们可以这样理解。正常情况下,我们的bean,是不应该意识到Spring框架的存在的,它虽然被Spring所管理,但是它本身意识不到管理者的存在。从初始化,到销毁,在它自己看来,其实都是一个正常的java对象应该有的流程。只不过调用者是Spring而已。那么总有些时候,我们需要让bean【感知到】Spring框架的存在,体现在代码中,就是获取到属于Spring框架的一部分,比如bean工厂:是谁生产出自己的。ApplicationContext:自己属于哪个上下文。

2022-11-24 17:24:26 331

原创 手写Spring-第七章-钩直饵咸?虚拟机钩子与bean的初始化和销毁

上一次的练习中,我们主要实现了后置处理器,对bean定义以及bean进行了扩展。那个时候留下了一个坑,也就是bean的【初始化】,我们是没有内容的。那么这一次,我们就来填上这个坑。不仅如此,有开始,就有结束。所以,我们还要加上bean的销毁逻辑。对于没接触过的人来说,这块可能没有什么【实感】。你说初始化和销毁,我又没接触过,它到底可以完成哪些操作?其实不管是初始化还是销毁,它都是一个方法。方法的内容是我们自己来决定的,Spring只是留了这么个扩展点给我们。我们日常使用,自然可以不用去理会这些。

2022-11-24 17:23:28 344

原创 手写Spring-第六章-让我访问!实现前置后置处理扩展功能

上一次我们实现了bean定义的自动化注册,这让我们的demo看起来已经很有Spring的那个味道了。但是扩展性还是差了一些。我们都知道,要写出高内聚,低耦合,富有扩展性的代码。那么如何增加扩展性呢?想想Spring中的AOP吧。在我们使用切面的时候,是不是可以在方法执行的前后进行拦截,加入我们自己的逻辑?这就是一种扩展性。它可以让我们在不修改主体逻辑的前提下,完成一些功能的扩展。那么我们这次要做的,虽然不是AOP,但思想和这个是类似的。

2022-11-24 17:22:36 688

原创 手写Spring-第五章-解放双手!自动化配置!

上次我们完成了Bean之间依赖的注入。但在最后测试的时候,吃到了苦头。Bean定义的构建太麻烦了>_

2022-11-24 17:21:35 170

原创 手写Spring-第四章-为依赖的对象注入灵魂!

经过了前面的三章,不知道大家有没有一个感觉,总觉得有些怀念Spring中我们最常用到的那个东西,但是等啊等啊,一直没有提到它。没错,就是我们的@Autowired!单丝不成线,孤木不成林。很多时候我们的一个bean,并不能仅靠自己就完成一项任务,它会需要依赖其他的bean。我们常用的做法,自然就是将依赖的bean注入进来。那么这一章,我们就来解决这件事情:如何解决bean的依赖。

2022-11-24 17:20:23 238

原创 手写Spring-第三章-来填坑吧!有参bean的实例化策略

上次我们终于把bean实例化这一步骤交给Spring容器了,这是个了不起的进步。但是,我们还是埋下了一个坑,那就是,这个实例化的手段,过于粗糙了。我们仅仅是简单的调用了newInstance方法而已,这样只能新建一个无参对象。当我们遇到有参构造方法的时候,这里就会报错了。那么这一章,我们就来填上这个坑,让有参bean也可以正常实例化!

2022-11-24 17:18:56 287

原创 手写Spring-第二章-实现 Bean 的定义、注册、获取

上一章我们实现了一个简化的Bean容器,那么这一章开始,我们就要上一些强度了。这一章主要的目的是,让Spring容器来自动化实现Bean的创建,并且实现单例Bean的复用。在上一章,我们只实现了一个容器,bean的创建,实际上还是我们在注册bean的时候手动new出来的。那么这次,我们就让Spring容器来帮我们做这些工作。/*** Bean的定义,将Bean的Class类型注册到这里来**/}}}

2022-11-24 17:18:00 341 1

原创 手写Spring-第一章-实现一个简单的Bean容器

开个新坑,来整点儿大项目。有这个想法是因为用了那么久的Spring,但是某一天突然冒出来一个念头:Spring到底是怎么实现这些功能的。发现脑子一片空白。在我抽出纸巾擦干脑门儿上的汗之后,我决定去网上搜索Spring源码解读。但是找来找去,要么讲的乱七八糟,要么就是过于庞大,一下子堆到面前,看不下去。终于,找到了一个还不错的教程,作者基于Spring框架,自己手写了一个简化版的Spring,而且代码的命名、类之间的关系,都是根据真正的Spring来的,只不过有所简化。我想,这就是我要找的教程了。

2022-11-22 10:20:41 537 1

原创 JVM学习笔记-运行时数据区域

之前在学习和工作的过程中,一直有听过JVM在运行时会把不同的数据存放在不同的区域,比如堆、栈、程序计数器之类的概念。但对于这些概念只是停留于听过有个印象而已。这次专门学习了JVM的一些内容,也在这里做一个笔记,记录一下这个知识点。

2022-11-21 11:20:33 71

原创 MYSQL主从同步配置过程记录-docker方式

由于我们采用的是docker进行部署,docker容器间是隔离的,所以无法直接通过本地ip访问到主节点。这里可以看到,mysql的镜像已经拉取下来了,那么下一步就是要开启两个节点,分别作为主节点和从节点。近期在学习MYSQL的主从读写分离,先学习了如何配置MYSQL的主从复制,在这里记录一下步骤。执行如上语句,即可让从节点通过主节点的日志来进行复制操作,也就是主从复制了。这样,我们就开了两个节点,3306端口是主节点,3307节点是从节点。,这一步是开启操作记录日志,主从复制就是通过这里的日志来进行的。

2022-11-21 11:20:07 111

原创 MYSQL分库分表配置过程记录-mycat实现

之前学习了MYSQL的主从同步,现在来学习一下分库分表。网上查了很多资料,最终决定使用mycat来实现,因为个人觉得这个中间件更符合使用习惯。这次使用的环境和上次主从同步的一致,主从同步的文章链接在此由于这次配置的是分库分表,所以我们要先取消掉数据库的主从同步。方法也很简单,在slave数据库中执行stop slave即可。执行完毕后,salve数据库就和master数据库解除了主从关系,可以认为是两个独立的数据库了。下面我们来配置Mycat。

2022-11-21 11:19:43 261

原创 sharding-proxy分表配置过程记录

之前研究过通过mycat进行分库分表的配置,最近发现很多项目上用的都是sharding-proxy来实现,所以也来进行一个学习。下面来简单记录一下搭建的过程。

2022-11-21 11:19:00 991

原创 Redis主从哨兵搭建-docker方式

因为我们用docker启动redis,默认是以无配置文件启动的,所以我们需要为其额外准备一份配置文件。mymaster是自己给主节点起的一个名字,第一条命令最后的2,指的是当两个哨兵都认为主节点挂了之后,才会重新选取一个从节点作为主节点。然后我们来测试一下哨兵是否能正常工作,我们手动停止掉master节点,然后分别在两个从节点执行info replication,看看会有什么效果。可以看到,主从已经搭建成功了,主节点和从节点都分别识别到了。到这一步,我们可以先启动主节点和两个从节点看看效果,先不管哨兵。

2022-11-21 11:18:47 187

原创 Redis发布订阅功能-SpringBoot demo

Redis的发布订阅是一种消息通信模式,发送者发布消息,订阅者接收消息。它们的关系如下图所示:对于消息发布者和订阅者来说,其实都是多对多关系。发布者可以向多个channel发布消息,订阅者自然也可以从多个channel接收消息。这种发布订阅模式其实很像各种MQ,但是相对于这些MQ,redis则更为轻量化,当业务压力不大的时候,可以考虑采用Redis来代替MQ实现消息队列。下面我们用SpringBoot来写个小demo体验一把Redis的发布订阅。这里的环境,redis本地启动,没有密码。

2022-11-21 11:18:07 692

原创 提升SAP trace级别排查单点登录问题

SAP trace级别提升

2022-11-21 11:17:44 432

原创 Redis淘汰策略简介

Redis淘汰策略简介

2022-11-18 10:41:27 297

原创 记一次Jenkins无法启动tomcat问题解决

项目发版部署采用Jenkins+tomcat进行。jenkins的tomcat和项目的tomcat在同一台服务器上,端口不同。发版采用jenkins的shell脚本进行,会在服务器上拉取最新代码,然后打包,替换war包,kill掉tomcat进程再重新启动。但只能做到kill掉进程,无法启动项目的tomcat,需要每次去服务器上手动执行startup.sh来启动。首先看看是不是shell脚本的问题,部署的shell脚本如下:可以看到,shell脚本没有什么问题。网上搜索相似问题,大部分都是说要加上BUIL

2022-11-18 10:38:01 1517

原创 SpringCloudAlibaba学习-Zookeeper

SpringCloudAlibaba学习

2022-11-18 10:37:08 201

原创 SpringCloudAlibaba学习-加入Dubbo

SpringCloudAlibaba学习

2022-11-18 10:36:14 505

原创 SpringCloudAlibaba学习-从Nacos开始

SpringCloudAlibaba学习

2022-11-18 10:35:46 176

原创 企业微信工作台集成CAS实现单点登录

企业微信工作台集成CAS实现单点登录

2022-11-18 10:32:19 3614 2

原创 搭建一个基于SpringBoot的OIDC客户端

基于SpringBoot的OIDC客户端demo

2022-11-18 10:31:18 1949 1

原创 后端项目性能优化总结

java后端性能优化总结

2022-11-18 10:29:52 1161 1

原创 设计模式-简单工厂模式

设计模式-简单工厂模式

2022-11-18 10:29:12 27

原创 设计模式-策略模式

设计模式-策略模式

2022-11-18 10:28:46 60

原创 设计模式-单一职责原则

设计模式-单一职责原则

2022-11-17 09:49:14 33

原创 设计模式-开放-封闭原则

设计模式-开放-封闭原则

2022-11-17 09:48:31 175

原创 设计模式-依赖倒转原则

设计模式-依赖倒转原则

2022-11-17 09:47:42 147

原创 设计模式-装饰模式

设计模式-装饰模式

2022-11-17 09:46:57 91

原创 设计模式-代理模式

设计模式-代理模式

2022-11-17 09:46:35 27

原创 设计模式-工厂模式

设计模式-工厂模式

2022-11-17 09:45:36 38

原创 设计模式-原型模式

设计模式-原型模式

2022-11-17 09:44:24 50

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除