自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

设计模式之简单工厂模式介绍工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。回到模板方法模式的例子,...

2021-09-26 15:17:39 194

原创 SpringCloud之feign的使用以及源码解析

SpringCloud之feign的使用以及源码解析feign的作用Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。feign的使用main方法上加上注

2021-09-17 23:28:12 288

原创 设计模式之模板方法模式

模板方法设计模式在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。举之前公司的一个例子来说明。例如坐飞机时候的值机,选座,托运行李这3个业务场景。大概就能抽象出3个方法,1.queryPersonInfo(),查询出需要办理业务的人是哪个2.checkLimit(),检查这个场景是否满足要求3.dobiz(),真正的业务处理。先上一下代码,定义了一个

2021-09-16 23:28:19 115

原创 SpringCloud之ribbon的使用以及源码解析

ribbon与feign源码解析ribbon简介ribbon是一个客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务ribbon的使用new出来一个RestTemplate,然后上面加上@LoadBalanced@Configurationpublic class RestTemplateConfig { @Bean @Lo

2021-09-15 23:43:12 436

原创 SpringAop源码解析

SpringAop源码解析(基于springBoot)要读懂SpringAop,首先需要看springIoc,否则连入口代码都找不到。首先我们先看一下一个bean被初始化的过程,简化版。一个简单的bean会通过反射被实例化出来,然后进行属性的填充,执行init方法,然后bean放到sinletonObjects里面,能通过getBean方法拿出来。但需要创建代理的bean在执行完init方法后,会经过一个特殊的beanPostProcess把bean变成一个代理类,放到sinletonObjects

2021-09-05 22:19:53 173 1

原创 Spring全注解解析

Spring注解@Configuration,@Bean,@Configurationpublic class MainConfig {@Beanpublic Person person(){return new Person();}}@Configuration,相当于以前的xml配置的beans标签,@Bean,就是调用@Bean标注的方法,往beanFactory注册这个bean。bean的默认名字是方法名,假如想指定bean的名字,使用@Bean(value=“XXX”)。@S

2021-09-02 22:18:56 89

原创 设计模式之代理模式

设计模式之代理模式代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。这种类型的设计模式属于结构型模式。比如一个餐厅要上线外卖功能,第一种方法是有顾客自己打电话到餐厅,进行点餐。但可能很少人知道能餐厅上线了外卖功能。第二就是在美团上上线外卖功能上美团,美团帮餐厅去接单。代理又分两种,静态代理和动态代理;静态代理在程序运行前,代理类已经提前写好。动态代理则是在程序运行时,动态的创建代理类。其中又分为JDK动态代理和CGLIB动态代理,JDK动态代理是基于接口进行代理

2021-09-01 22:57:29 65

原创 设计模式之观察者模式

设计模式之观察者模式当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。其特点是:持有监听的观察者的引用支持增加和删除观察者主题状态改变,通知观察者首先我们举一个例子:大雄和胖虎在看一部电影,当一个精彩的武打戏出现的时候,大雄因为害怕,会闭上眼睛,但胖虎会为这个打戏的精彩而大声叫好。这个时候我们就可以使用到我们的观察者模式。JDK自带了观察者模式的实现我们先上代码,首先是一个main函

2021-08-17 22:37:36 130

原创 SpringMVC总体流程与源码分析

SpringMVCSpringMVC总体流程图首先请求进入DispatcherServlet 由DispatcherServlet 从HandlerMappings中提取对应的Handler此时只是获取到了对应的Handle,然后得去寻找对应的适配器,即:HandlerAdapter拿到对应HandlerAdapter时,这时候开始调用对应的Handler处理业务逻辑, 执行完成之后返回一个ModeAndView这时候交给我们的ViewResolver通过视图名称查找出对应的视图然后返回最后

2021-08-17 16:58:06 60

原创 kafka学习笔记

kafka基于发布订阅的消息队列,需要消费者主动的到队列里面获取,一个分区对应消费组的一个消费者kafka的启动首先,修改%KAFKA_HOME%\conf\zookeeper.properties中的dataDir=/tmp/zookeeper,改为dataDir=/mnt/d/ubuntuSoft/kafka_2.12-0.11.0.0/data/zookeeper。创建新目录D:\ubuntuSoft\kafka_2.12-0.11.0.0\data\zookeeper。执行命令行

2021-08-16 15:58:35 226

原创 netty中NioEventLoop工作流程

netty中NioEventLoop工作流程首先先看一幅图可以看到:1)Netty抽象出两组线程池 BossGroup 专门负责接收客户端的连接, WorkerGroup 专门负责网络的读写2)BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup3)NioEventLoopGroup 相当于一个事件循环组, 这个组中含有多个事件循环 ,每一个事件循环是 NioEventLoop4)NioEventLoop 表示一个不断循环的执行处理任务的线程, 每个Ni

2021-07-13 11:17:43 198

原创 Netty服务端启动

Netty服务端启动样例来自于netty源码的example.echo的EchoServerpublic static void main(String[] args) throws Exception { // Configure SSL. final SslContext sslCtx; if (SSL) { SelfSignedCertificate ssc = new SelfSignedCertificate();

2021-07-07 17:17:46 214 1

原创 mysql主从复制原理以及如何搭建mysql主从

mysql主从复制原理以及如何搭建MySQL 复制过程分成三步:1.master 将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;2.slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);3.slave 重做中继日志中的事件,将改变应用到自己的数据库中。MySQL 复制是异步的且串行化的复制的基本原则(1)每个 slave 只有一个 master(2)每个 slave

2021-06-05 22:06:00 66

原创 mysql索引原理以及如何正确使用索引

mysql索引什么是索引索引的本质其实就是排好序的快速查找数据结构,就像查字典,你可以根据拼音去快速的检索你所需要查询的汉字。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以文件形式存储在硬盘上。如图就是我们的B+树,mysql最常用的索引。根据B+树的特性,例如我们需要查找9这个数据,先去找根节点磁盘块1,9小于17,所以在P1,再查找P1所在的磁盘块2,9大于8,所以再找到磁盘块2中的P2,找到P2所在的磁盘块6,然后就找到了9了。mysql的索引分类:单值索引:即一个索引只

2021-06-05 21:34:20 249 1

原创 mybatis结合spring执行Sql的流程

mybatis执行Sql的流程首先讲上一篇出现过的一段代码new SqlSessionTemplate public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { if (!this.externalSqlSession) { this.sqlSession = new SqlSessionTemplate(sqlSessionFactory); } }进入new SqlSessio

2021-05-26 14:44:59 454

原创 spring和mybatis整合源码解析

springboot和mybatis整合源码解析使用的是我们springboot,所以我们先要创建一个config类@Configuration//指定这是一个核心配置类@MapperScan("com.demo.dao")//扫描dao层,生成动态代理@ComponentScan("com.demo")//扫描该路径下所有类上的注解@EnableTransactionManagement//开启事务@EnableAspectJAutoProxypublic class Application

2021-05-23 20:54:41 233

原创 Springboot如何实现自动装配

Springboot如何实现自动装配首先附上springboot启动的整理流程图,可以发现实现自动装配的主要是里面的两个流程prepareContext()和refreshContext()。下面就让我们进入这两个方法,去分析spring如何完成自动装配。prepareContext()prepareContext里面的核心方法是load(context, sources.toArray(new Object[0]));,sourcce就是我们的main函数所在的类。创建一个loader用于

2021-05-21 22:54:48 517

原创 Spring如何解决循环依赖

Spring如何解决循环依赖先建立循环依赖的demo代码dao中引用了service,service引用了dao。Dao代码@Componentpublic class MyDao { @Autowired MyService service; public MyService getService() { return service; } public void setService(MyService service) { this.service = servic

2021-05-19 16:39:14 137

原创 Spring提供的扩展点以及案例

Spring提供的扩展点以及案例1 BeanFactoryPostProcessor/** * spring的扩展点之一 * 实现该接口,可以在spring的bean创建之前修改bean的定义属性。 * spring允许BeanFactoryPostProcessor在容器实例化任何其它bean之前读取配置元数据, * 并可以根据需要进行修改,例如可以把bean的scope从singleton改为prototype,也可以把property的值给修改掉。 * 可以同时配置多个BeanFacto

2021-05-18 17:53:32 368

原创 基于注解的spring源码解析之读懂refresh方法之finishBeanFactoryInitialization(beanFactory)

基于注解的spring源码解析之读懂refresh方法之finishBeanFactoryInitialization(beanFactory)接着上一篇文章,BD里面现在有8个属性实例化bean进入finishBeanFactoryInitialization(beanFactory)方法,安装流程图一路点进去,获得bean的构造方法,然后进行实例化。填充属性populateBean(beanName, mbd, instanceWrapper);...

2021-05-17 21:47:06 120

原创 基于注解的spring源码解析之读懂refresh方法之invokeBeanFactoryPostProcessors()

基于注解的spring源码解析之读懂refresh方法之invokeBeanFactoryPostProcessors()进入方法invokeBeanFactoryPostProcessors() protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { //获取自定义的,手工add进去list的beanFactoryProcessors PostProcessorR

2021-05-17 14:55:50 80

原创 基于注解的spring源码解析之读懂refresh方法,refresh方法的总体流程

基于注解的spring源码解析2-读懂refresh方法ynchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. ////准备工作包括设置启动时间,是否激活标识位, // 初始化属性源(property source)配置 prepareRefresh(); // Tell the subclass to refresh the internal bean fact

2021-05-17 11:30:24 253 1

原创 基于注解的spring源码解析之总体流程

基于注解的spring源码解析1-总体流程##总体流程图Demo代码public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); MyService service = (MyService) context.getBean("serv

2021-05-17 11:05:16 141

空空如也

空空如也

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

TA关注的人

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