自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ApplicationContext--容器的功能扩展

ApplicationContext--容器的功能扩展

2022-08-28 22:04:46 203 1

原创 Spring源码--Bean的加载

Spring的BeanFactory进行bean加载

2022-08-28 19:19:40 434

原创 Spring源码--容器的基本实现与BeanDefinition

spring基础

2022-08-28 19:12:34 267

原创 SpringSecurity的OAuth2的授权服务器配置

SpringSecurity Oauth2 授权服务器

2022-08-20 10:09:49 1550

原创 Security配置生效源码分析

文章概述本文主要解决几个问题:security配置生效的入口是哪里我们平时写的security配置是如何被调用的为什么我们写的配置需要继承WebSecurityConfigurerAdapterHttpSecurity和WebSecurity是干嘛用的配置核心类启动Security,需要在启动类上添加@EnableSecurity注解@SpringBootApplication@EnableWebSecuritypublic class ThingsboardApp {

2022-02-19 14:08:37 705

原创 Java的桥接方法和BridgeMethodResolver使用

什么是桥接方法桥接方法是JDK1.5引入泛型之后,为了使Java的泛型方法生成的字节码和1.5版本前的字节码相兼容,由编译器自动生成的方法。对于实现了泛型接口或继承了泛型抽象类的类,如果没有桥接方法,则在编译器对泛型进行擦除后,不符合语义:泛型擦除后,泛型类型成了Object,如果子类没有一个对应的桥接方法(泛型类型成了Object的方法),则认为是不符合语义,且不兼容1.5之前的字节码了。同样子类的返回值如果是父类的返回值的子类型,也需要一个桥接方法。什么时候生成桥接方法方法重写的时候子父类返回

2021-11-07 11:23:49 528 1

原创 SpEl及@Value的SpEl表达式源码分析

文章目录SpEl使用例子@Value使用SpEl解析源码分析SpEl使用例子public class SpElDemo { public static void main(String[] args) { Stu stu = new Stu(); stu.setName("xxl"); SpelExpressionParser spelExpressionParser = new SpelExpressionParser(); S

2021-11-07 11:18:05 426

原创 Spring(十六)--Spring应用上下文生命周期

Spring应用上下文启动准备阶段AbstractApplicationContext#prepareRefresh()方法1.启动时间startupDate2.状态标识closed、active3.初始化PropertySources-initPropertySources()4.检验Environment中必须属性5.初始化事件监听器集合6.初始化早期Spring事件集合BeanFactory创建阶段AbstarctApplicationContext#obtainFreshBe

2021-10-11 23:18:10 173

原创 Spring(十五)--SpringEnvironment抽象

理解SpringEnvironment抽象统一的Spring配置属性管理SpringFramework3.1开始引入Environment抽象,它统一Spring配置属性的存储,包括占位符处理和类型转换,不仅完整地替换PropertyPlaceholderConfigurer,而且还支持更丰富的配置属性源。条件话SpringBean装配管理通过EnvironmentProfiles信息,帮助Spring容器提供条件化装配Bean。SpringEnvironment接口使用场景用于属性占

2021-10-11 23:17:58 134

原创 Spring(十四)--Spring事件

Java事件/监听器编程模型设计模式–观察者模式扩展1.可观察对象–java.util.Observable2.观察者–java.util.Observer标准化接口1.事件对象–java.util.EventObject2.事件监听器–java.util.EventListenerSpring标准事件–ApplicationEventjava标准事件 java.util.EventObject扩展,扩展特性:事件发生时间戳Spring应用上下文ApplicationEvent扩

2021-10-11 23:13:20 127

原创 Spring(十三)--Spring泛型处理

Java5类型接口-java.lang.reflect.TypeJava泛型反射APISpring泛型类型辅助类核心API-org.springframework.core.GenericTypeResolver1.处理类型相关(Type)相关方法resolveReturnType: 获取方法返回值的TyperesolveType:2.处理泛型参数类型(ParameterizedType)相关方法resolveReturnTypeArgument: 获取方法返回值的泛型参数.

2021-10-11 23:11:26 470

原创 Spring(十二)--Spring类型转换

Spring类型转换的实现基于JavaBeans接口的类型转换实现:基于java.beans.PropertyEditor接口扩展Spring 3.0+通用类型转换实现使用场景基于JavaBeans接口的类型转换核心职责: 将String类型的内容转换为目标类型的对象扩展原理1.Spring框架将文本内容传递到PropertyEditor实现的setAsText(String)方法。2.PropertyEditor#setAsText(String)方法实现将String类型转化为

2021-10-11 23:11:13 939

原创 Spring(十一)--Spring数据绑定

Spring数据绑定使用场景Spring BeanDefinition到Bean实例创建Spring数据绑定SpringWeb参数绑定Spring数据绑定组件标准组件: org.springframework.validation.DataBinderWeb组件1.org.springframework.web.bind.WebDataBinder2.org.springframework.web.bindServletRequestDataBinder3.org.springfr

2021-10-11 23:07:14 348

原创 Spring(十)--Spring校验

Spring校验使用场景Spring常规校验Spring数据绑定SpringWeb参数绑定SpringWebMVC/SpringWebFlux处理方法参数校验Validator接口设计接口的职责: Spring内部校验器接口,通过编程的方式校验目标对象核心方法supports(Class): 校验目标类能否校验validate(Object, Errors): 校验目标对象,并将校验失败的内容输出至Errors对象配套组件错误收集器: org.springframewor

2021-10-11 22:58:36 623

原创 Spring(九)--Spring国际化

Spring国际化接口核心接口: org.springframework.context.MessageSource主要概念: 1.文案模板编码code 2.文案模板参数args 3.区域Locale层次性MessageSourceSpring国际化的实现类都是层次性的,具体接口如下Spring层次化国际化接口: org.springframework.context.HierarchicalMessageSrouceJava国际化标准实现抽象实现-java.util.Resou

2021-10-11 22:58:22 421

原创 Spring(七)--Spring配置元信息

Spring Bean配置元信息Bean配置元信息-BeanDefinition : 1. GenericBeanDefinition:通用型BeanDefinition。2.RootBeanDefinition: 无Parent的BeanDefinition或者合并后BeanDefinition。3.AnnotatedBeanDefinition: 注解标注的BeanDefinition。Sping Bean属性元信息Bean属性元信息-PropertyValues,这个就是影响bean属性的

2021-10-10 22:20:08 155

原创 Spring(八)--Spring资源管理

Java标准资源管理Java URL协议扩展目前java内建的URL协议有ftp,file,http等有时候我们需要扩展协议,可以通过下面两种方法进行扩展基于java.net.URLStreamHandlerFactory基于java.net.URLStreamHandler: 比如我们要实现一个x协议,解析 x:///META-INF/default.properties 文件,则在创建一个类名为Handler的类,放在 sun.net.www.protocol.${protoco

2021-10-10 22:15:01 193

原创 Spring(六)--SpringBean生命周期

Spring Bean元信息配置阶段BeanDefinition配置: 面向资源: XML配置,Properties资源配置。面向注解;面向APISpringBean元信息解析阶段面向资源BeanDefinition解析: 1.BeanDefinitionReader。2.XML解析器 BeanDefinitionParser。面向注解BeanDefinition解析: 1.AnnotatedBeanDefinitionReaderSpring Bean注册阶段BeanDefiniti

2021-10-10 22:12:24 150

原创 Spring(五)--SpringBean作用域

singleton默认SpringBean作用域,单例,即一个BeanFactory有且仅有一个实例prototype每次都新建对象,Spring容器没有办法管理prototype Bean的完整生命周期,也没有办法记录示例的存在,销毁回调方法将不会执行,可以利用其他方式进行清理工作。request作用域sessionBean作用域applicationBean作用域自定义Bean作用域实现Scope: org.springframework.beans.factory.config.Sc

2021-10-10 22:11:34 111

原创 Spring(四)--SpringIOC依赖来源

依赖查找来源依赖查找来源分为两类,一类通过SpringBeanDefinition生成的bean,一类是单例对象。除了用户定义,Spring内建了一些beandefinition和单例对象Spring内建的BeanDefinition在AnnotationConfigUtils类注册了一下BeanDefinitionSpring内建单例对象AbstractApplicationContext类里registerSingleton了一下bean依赖注入的来源依赖注入多了一个非S

2021-10-10 22:05:01 157

原创 Spring(三)--SpringIOC的依赖查找

Spring依赖查找的根源在JavaBeans里有依赖查找,BeanContext。在JNDI也有依赖查找,Context类。SpringIOC单一类型依赖查找接口根据Bean名称查找: getBean(String)根据Bean类型查找: 1. 实时查找(getBean(Class))。2.Spring 5.1 Bean延迟查找,getBeanProvider(Class)。ObjectProvider是Spring提供的一种宽松注入方式,解决了强制依赖以及同类型多个bean的问题。S

2021-10-10 22:01:07 187

原创 Spring(二)--SpringBean基础

定义SpringBeanBeanDefinitionBeanDefinition元信息BeanDefinition构建1.BeanDefinitionBuilder类2.AbstractBeanDefinition及派生类// 1.通过 BeanDefinitionBuilder 构建BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.cla

2021-10-10 21:58:45 61

原创 Spring(一)--SpringBeanIOC的依赖注入

依赖注入的模式与类型手动模式: 1.XML,Java注解配置元信息,API配置元信息自动模式: Autowring,即不需要任何配置就能自动注入(根据名字或类型等)为什么自动模式不被推荐根据名称来自动注入,一旦变量名改了,就无法生效。对于基本类型,比如int,String等,也无法使用自动绑定Setter方法依赖注入XML资源配置元信息,其实是setter注入Java注解配置元信息API配置元信息:BeanDefinitionBuilder definitionBuilde

2021-10-10 21:57:12 159

原创 elasticsearch认证,节点部署,容量规划,性能优化--《elasticsearch核心技术与实战》笔记(三)

开启并配置X-Pack的认证和授权第三步是修改kibana.yml文件,将elasticsearch.username, elasticsearch.password,修改为kibana使用的账号和密码,配置完这步,打开kibana还是提示登录,还是需要输入账号和密码的,所以可以理解为该配置只是kibana程序自身使用,实际登录还需使用其他账户。Elasticsearch常见的集群部署方式不同角色的节点Master eligible, Data, Ingest, Coordinating, M

2021-07-25 22:21:12 390 1

原创 elasticsearch检索,聚合,建模,优化--《elasticsearch核心技术与实战》笔记(二)

检索相关基于Term的查询Term是表达语意的最小单位,在ES中,term查询,对输入不做分词,会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分。第一个查询能查得到,第二个查询查不到。根据dynamic mapping,desc字段是text,会对文档内容进行分词器处理。所以录入iPone会在倒排索引里记录了iphone,所以能查得到。productId经过分词器处理后,会以’-'切割成一个一个字符存起来,所以term查询去找produ

2021-07-13 22:25:22 573 4

原创 elasticsearch基本使用--《elasticsearch核心技术与实战》笔记(一)

CAT查看elasticsearch索引的情况查看索引信息GET /_cat/indices/kibana_sample_data_flights?v&s=indexhealthstatusindexuuidpri(主分片)rep(副本数)docs.count(文档总数)docs.deletedstore.size(主分片的大小)pri.store.sizegreenopenkibana_sample_data_flightsQ6oQk43eSi

2021-07-07 22:57:59 176 3

原创 从KafkaProducer源码学习异步发送,缓冲区管理,NIO编程。

KafkaProducer初始化参数clientId没主动设置clientId时,后台都会生成一个client.id,producer-自增长的数字,producer-1。partitioner决定消息路由到Topic的哪个分区里去的metadata组件,生产端拉取Topic的元数据,包括Topic有哪些分区,分区的Leader位于哪个broker,有一个metadata.max.age参数默认是五分钟,强制重新刷新数据。request.max.size默认是1mb,一次请求最大为1

2021-06-06 23:54:05 794 4

原创 《MySQL实战45讲》读后笔记

《MySQL实战45讲》读后笔记MySQL 里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。Innodbbin logMySQL的Server层的日志,binlog只能用于归档,不能用于crash-safe,所以MyISAM不具备crash-safe能力。redolog和binlog比较:1.redolog是物理日志,记录的是某一页做了什么修改。binlog是逻辑日志,记录了sql。2.redoglog会循环覆盖,binlo

2021-05-10 08:14:04 205

原创 配置kafka容器访问ip踩坑

配置kafka容器访问ip踩坑这是分配kafka内外网访问的方法# 通过任意IP的9003访问的定义为OUTSIDE,任意IP9002访问的定义为INSIDElisteners=OUTSIDE://:9093,INSIDE://:9092 # 连上Kafka之后,Broker会根据outside还是inside返回对应的值,也就是配置里的advertised.listeners=OUTSIDE://<外网IP>,INSIDE://<内网IP>:9092# OUTSID

2021-04-24 17:52:40 1948 1

原创 Mybatis浅析

Mybatis架构层次Mybatis的层次结构MyBatis源码分析先看传统方式开发初始化,加载配置文件InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");// 此方法会调用到SqlSessionFactoryBuilder的build// build方法会调用XmlConfigBuilder的parseSqlSessionFactroy sqlSessionFactory

2021-04-18 20:23:48 104

原创 Tomcat关键组件介绍

Connector组件Tomcat的Connector组件,通常被称为Coyote。它包含了EndPoint,Processor,Adatper。EndPoint:它是coyote通信端点,即通信监听的接口,是具体Socket接收和发送处理器,是对传输层的抽象,因此EndPoint用来实现TCP/IP协议。Processor:协议处理接口,接收来自EndPoint的Socket,读取字节流解析成Tomcat Request和Response对象,并通过Adapter将其提交到容器处理,Proces

2021-04-18 20:17:18 279

原创 MySQL一条数据的物理存储及redolog

MySQL物理文件的概念一行数据在磁盘上存储的时候,包含哪些东西?变长字段的长度列表,null值列表,数据头,column01,column02的值,column0n的值如果有多个变长字段,如何存放他们的长度?varchar(10) varchar(5) varchar(20) char(1) char(1),一共五个字段,其中三个是变长字段。磁盘中存储的,必须在他开头的变长字段列表中存储几个变长字段的长度,是逆序存储。带NULL值是如何存储?一行数据里的NULL值不能直接存储,因为没必要,

2021-03-12 00:30:10 352

原创 MySQL之B+索引结构

线上数据库不确定性的性能抖动优化实践可能导致性能抖动的两个原因:执行一个查询语句,需要查询大量的数据到缓存页里去,此时就可能导致内存里大量的脏页需要淘汰出去刷入磁盘上,才能腾出足够的内存空间来执行这条查询语句。所以语句可能出现延迟,因为要等待大量脏页flush到磁盘,然后语句才能执行!redo log的日志文件在全部被写满的情况下,也会触发一次脏页的刷新。为什么呢?因为假设第一个日志文件的一些redo log对应的内存里的缓存页的数据没被刷新到磁盘缓存页中,如果mysql崩溃了,也没有 redo l

2021-03-12 00:13:33 214

原创 联合索引查询原理以及全值匹配规则

联合索引查询原理以及全值匹配规则等值匹配规则,和where字段的顺序无关最左侧列匹配,意味着不能跳过字段最左前缀匹配,意味着like只能匹配左确定部分范围查找规则,对联合索引最左侧的列进行范围查询才能使用索引。等值匹配+范围匹配当我们在SQL里进行分组时,如何才能使用索引对于group by后的字段,最好也是按照联合索引里的最左侧的字段开始,按顺序排列开来,这样的话,可以运用上索引来直接提取一组一组的数据,然后针对每一组的数据执行聚合函数就可以。本质上就是利用索引已经排好序的特点,避免针对

2021-03-12 00:02:06 763

原创 MySQL生产环境部署架构

MySQL生产环境部署架构常用的分库分表架构按业务id分库分表,建立索引映射表同时进行分库分表,数据同步到ES做复杂搜索。分库分表下如何分页假设用户现在要查询自己的订单,同时订单要求要支持分页,该怎么做?方案一:因为同一个用户的订单可能是分布在不同的库不同表的,需要建立一个索引表,(user_id, order_id),这个表对user_id进行分库分表后,同一个用户的数据就会进入到同一张表里,既然在同一张表里就可以利用mysql自带的分页机制。方案二:加载到内存之中,在内存中分页。对于主

2021-03-12 00:01:31 551 1

原创 利用执行计划进行性能优化

执行计划和性能优化const:意味着性能超高的常量级,直接可以通过聚簇索引或者二级索引+聚簇索引回源,轻松查到数据。这种情况的二级索引,必须是唯一索引。ref:select * from table where name = xxx,如果name是普通索引,则是ref。如果包含多个列的普通查询,那么必须是索引最左侧开始连续多个列都是等值比较才可以是属于ref方式。针对name is NULL,即使name是主键或者唯一索引,还是只能走ref,但是如果针对一个二级索引同时比较了一个值还有限定了IS NU

2021-03-12 00:00:46 244

原创 再谈explain

通过explain命令得到SQL执行计划ref:既然你是针对二级索引进行等值匹配,那么跟index_x1索引进行等值匹配的是什么?是一个常量或者是别的字段。const则是指常量值跟index_x1索引里的值进行等值匹配。rows:意思是返回给MySQL服务层的数据条数,即在数据库引擎层筛选后的数据。filtered:13.0,意思是MySQL服务层过滤掉部分,即rows经过其他条件筛选之后得到的数据量。rows * fitlered = 最终数据量。extra: using index意味着只是仅仅

2021-03-11 23:58:37 78

原创 你的系统是如何与MySQL打交道

一条更新SQL的执行全过程为什么不将修改落盘,而是使用BufferPool?因为数据库的update操作是随机IO,随机IO效率很低,如果直接落盘,那么MySQL支持的并发数量可能就会很少,而redo日志这些事顺序IO,比随机IO性能高。undo日志做什么用?各种日志如何控制大小,何时会去删除?普通的Java应用系统部署在机器上能抗多少并发?以大量的高并发线上系统的生产经验观察而言,一般Java应用系统部署在4核8G的机器上,每秒钟抗下500左右的并发访问量,差不多是比较合适的。但是如果你每个.

2021-03-11 23:51:02 93

原创 Undo log与 MVCC机制

Undo日志INSERT语句的undo log日志对应的类型是TRX_UNDO_INSERT_REC这条日志的开始位置主键的各列长度和值表idundo log日志编号undo log日志类型这条日志的结束位置假设现在需要回滚一条insert语句,只需要把undo log拿出来,就知道在哪个表里插入的数据,主键是什么,直接定位到哪个表和主键对应的缓存页,从里面删除掉之前insert语句插入进去的数据就可以了。MySQL运行时多个事务同时执行read uncommitted,读未提交

2021-03-11 22:34:00 1570 2

原创 缓存常见问题

Cache Aside Pattern读的时候,先读缓存,缓存没有再读数据库,读完数据库,放入缓存,同时返回响应。更新的时候,先删除缓存,再更新数据库。缓存双写不一致先修改数据库,再删除缓存,显然不行,万一删缓存失败则缓存不一致了先删缓存,再更新数据库。能解决低并发下的情况,高并发读时容易出现缓存不一致。解决方案:用队列将写请求和读请求串行化,再通过压缩相同读与相同写的方式优化,最后再配合降级,多少时间读不到就直接读数据库,但是不更新缓存。这个优化方案需要考虑实际场景的极端情况,防止过多请求

2021-03-10 21:47:59 96

空空如也

空空如也

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

TA关注的人

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