- 博客(298)
- 资源 (23)
- 问答 (1)
- 收藏
- 关注

原创 关于HashMap根据Value获取Key
Map中是一个key有且只有一个value.但是一个value可以对应多个key值.一般都是通过key,然后map.get(key)获得到value.如果想要反向想通过value获得key的值,提供一下两种方法:方法一: 1 package cn.itcast.mapgetkey; 2 3 import java.util.ArrayList;
2016-08-30 18:34:03
43049

原创 SpringMVC数据格式化
7.3、数据格式化在如Web /客户端项目中,通常需要将数据转换为具有某种格式的字符串进行展示,因此上节我们学习的数据类型转换系统核心作用不是完成这个需求,因此Spring3引入了格式化转换器(Formatter SPI) 和格式化服务API(FormattingConversionService)从而支持这种需求。在Spring中它和PropertyEditor功能类似,可以替代Proper
2016-07-23 22:16:25
2930

原创 程序编译与代码优化
一早期(编译期)优化1概述Java语言的“编译期”是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,just in time compiler)把字节码转变成机器码的过程;还可能是指使用静态提前编译器(AOT编译器,ahead of time
2016-05-31 15:20:23
4499
1
原创 mybatis源码解析 - mapper代理对象的生成
1、简单示例先看一个简单纯粹的mybatis demo(不集成spring等其他框架),代码结构很简单,如下图:完整代码地址:kingoe/boot-study;mapper层和我们平时说的dao层指的是同一个内容,都是数据库操作的封装,但是在没有集成mybatis时,dao层的接口都是需要我们手动去写其实现类,可在上图中我们却发现:我们并没有手动去实现PersonMapper接口,但工程却能实实在在的查询数据库,获取我们需要的数据,debug代码可以发现 PersonMapper实例是一个代.
2022-01-22 19:45:55
629
原创 Spring拓展接口之FactoryBean
1、是什么FactoryBean的源码比较简单,大家可以细读下其注释。/** * 实现此接口的bean不能用作普通bean。此bean暴露的对象是通过getObject()创建的对象,而不是它自身 */public interface FactoryBean<T> { /** * 返回此工厂管理的对象的实例(可能是共享的或独立的,取决于isSingleton()的返回值) */ @Nullable T getObject() thro
2022-01-22 14:35:54
398
原创 canal+Kafka实现mysql与redis数据同步
前言上篇文章简单介绍canal概念,本文结合常见的缓存业务去讲解canal使用。在实际开发过程中,通常都会把数据往redis缓存中保存一份,做下简单的查询优化。如果这时候数据库数据发生变更操作,就不得不在业务代码中写一段同步更新redis的代码,但是这种 数据同步的代码和业务代码糅合在一起 看起来不是很优雅,而且还会出现数据不一致问题。那能不能把这部分同步代码从中抽离出来,形成独立模块呢?答案是肯定的,下面通过canal结合Kafka来实现mysql与redis之间的数据同步。架构设计can
2022-01-02 20:06:08
2025
原创 canal入门
前言以前对canal仅仅是停留在书本的概念层面上,从没实际搭建操作过,这不趁着元旦假期,学习输出一波。在此也祝福大家新年快乐,希望2022年大家工作顺利,事业更进一步。在日常工作中,数据不仅仅是直接保存在数据库中,还会涉及到其他中间组件,比如需要将数据同步到ES中供检索使用,也会把最新数据同步刷新到Redis等缓存中,实现数据一致性。这时就可以用到阿里开源的框架Canal,他可以很方便地同步数据库的增量数据到其他的存储应用。1、什么是canal我们先来看下官网的介绍:...
2022-01-02 19:59:30
919
原创 使用TargetSources
1.使用TargetSourcesSpring提供了TargetSource的概念,由org.springframework.aop.TargetSource接口进行描述。这个接口负责返回一个实现连接点的“目标对象(target object)”。每当AOP代理处理一个方法调用时都会向TargetSource的实现请求一个目标实例。使用Spring AOP的开发者通常不需要直接和TargetSource打交道,但这提供了一种强大的方式来支持池化(pooling),热交换(hot swappable.
2021-10-24 22:44:05
1161
原创 面试官:Spring代理目标bean时为何通过TargetSource类型对目标bean封装?
在Spring代理目标bean的时候,其并不是直接创建一个目标bean的对象实例的,而是通过一个TargetSource类型的对象将目标bean进行封装,Spring Aop获取目标对象始终是通过TargetSource.getTarget()方法进行的。本文首先会讲解Spring Aop是如何封装目标对象到TargetSource中的,然后会讲解TargetSource各个方法的使用原理,接着会对Spring提供的常见的TargetSource的实现类进行讲解,最后会讲解如何实现自定义的TargetSou
2021-10-24 22:33:40
437
原创 Spring AOP 功能使用详解
前言AOP 既熟悉又陌生,了解过 Spring 人的都知道 AOP 的概念,即面向切面编程,可以用来管理一些和主业务无关的周边业务,如日志记录,事务管理等;陌生是因为在工作中基本没有使用过,AOP 的相关概念也是云里雾里;最近在看 Spring 的相关源码,所以还是先来捋一捋 Spring 中 AOP 的一个用法。相关概念在学习 Spring AOP 的用法之前,先来看看 AOP 的相关概念,Spring AOP 的详细介绍,请参考官网 https://docs.spring.io/spr
2021-10-21 16:15:11
734
原创 Spring 事务使用详解
前言什么是事务?根据 维基百科事务 介绍,数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。简单来说,事务就是将一系列操作当成一个不可拆分的执行逻辑单元,这些要么都成功,要么都失败。事务具有4个属性:原子性、一致性、隔离性、持久性。称为ACID特性。Spring 事务在使用Spring进行开发过程中,一般都会使用Spring来进行事务的控制,接下来就来看下Spring使用事务的详细过程,包括事务的传播方式等。本文根据官方文档的介绍,...
2021-10-21 15:45:55
5865
1
原创 Spring 事务初始化源码分析
前言在上篇文章Spring 事务使用详解中详细介绍了Spring事务的使用过程,今天就来看下Spring事务是如何来实现,比如Spring事务在初始化的时候做了什么,Spring事务是如何进行事务的提交和回滚的;为了避免篇幅太长,所以分开两篇文章进行分析,这篇文章先来分析下Spring事务是如何初始化的,在初始化的时候做了什么。注册 InfrastructureAdvisorAutoProxyCreator我们知道,想要使用Spring事务,就得开启Spring的事...
2021-10-21 14:52:52
223
原创 Spring 事务提交回滚源码解析
前言在上篇文章Spring 事务初始化源码分析中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring 是如何去获取事务,当目标方法异常后,又是如何进行回滚的,又或是目标方法执行成功后,又是怎么提交的呢?此外,事务的提交和回滚由底层数据库进行控制,而 Spring 事务行为可以传播,这个传播方式由 Spring 来进行控制,它是怎么控制的呢?这篇文章就来分析下 Spring 事务提交回滚的源码。TransactionInterceptor还记得在 Spring 事务初始化...
2021-10-21 14:49:47
457
原创 谈谈对线程安全的理解
如果这个是面试官直接问你的问题,你会怎么回答?一个专业的描述是,当多个线程访问一个对象时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的那么我们如何做到线程安全?实现线程安全的方式有多种,其中在源码中常见的方式是,采用synchronized关键字给代码块或方法加锁,比如StringBuffer查看StringBuffer的源码,你会看到是这样的:那么,我们开发中,如果需要拼接字符串,使用StringBuilder还是S
2021-10-17 21:34:33
259
原创 分布式锁实现方案
1、什么是锁在单进程环境中,存在多个线程可以同时改变某个变量,就需要对变量或代码块做同步,使其修改这种变量时能够线性执行,防止并发带来不可控的结果。而这种同步的本质就是通过锁实现的。为了实现多个线程在一个时刻同一个代码块只能有一个线程可执行,那么就需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余线程发现已经有标记后则等待标记的线程结束同步代码块取消后再尝试标记。这个标记可以理解为锁。不同地方实现锁不同,只要满足线程看到标记即可。...
2021-10-14 11:33:39
217
原创 mysql-锁
根据加锁的范围,MySQL里面的锁大致可以分为全局锁、表级锁和行锁三类。全局锁全局锁是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令:Flush tables with read lock (FTWRL)当需要让整个库处于只读状态时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都select出来存成文本。官方
2021-09-23 22:50:49
122
原创 tcp三次握手和四次挥手
1、为什么TCP采用3次握手而不是2次或4次握手原因1:双向连接,至少要三次握手其实问题本质是信道不可靠,但是通信双方需要就某个问题达成一致,而要解决这个问题,无论在消息中包含什么消息,三次通信是理论上的最小值。 所以三次握手不是TCP本身的要求,而是为了满足“在不可靠信道上可靠的传输信息”这一需求所导致的。三次达到了,后面想接着握手也好,发数据也好,跟进行可靠信息传输的需求就没关系了。前提1:TCP协议要保证双方可以通信即发送端接收端要确认自己发送的信息对方能接收到,对方发送的信息自己
2021-09-19 17:38:59
149
转载 SpringMVC 方法三种类型返回值总结,你用过几种?
SpringMVC 现在算是 Java 领域的一个基础性框架了,很多人天天用,可是对于 SpringMVC 方法的返回值,你又是否完全清楚呢?今天松哥就来和大家聊一聊 SpringMVC 中四种不同类型的返回值,看看有没有 get 到你的知识盲点?1. ModelAndView以前前后端不分的情况下,ModelAndView 应该是最最常见的返回值类型了,现在前后端分离后,后端都是以返回 JSON 数据为主了。后端返回 ModelAndView 这个比较容易理解,开发者可以在 ModelAndVie
2021-09-07 22:23:51
1405
原创 springboot跨域解决方案
1:为什么会出现跨域问题 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port) 简单说A应用只能访问A应用后台传来数据,
2021-09-07 14:16:14
160
原创 面试题之Java内存区域
基本问题介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式)1、运行时数据区域JDK1.8之前:JDK1.8:线程私有的:程序计数器 虚拟机栈 本地方法栈线程共享的:堆 方法区 直接内存 (非运行时数据区的一部分)2.1 程序计数器程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过
2021-08-21 17:34:10
234
原创 限流算法之计数器算法
计数器法是限流算法里最简单也是最容易实现的一种算法。假设一个接口限制一分钟内的访问次数不能超过100个,维护一个计数器,每次有新的请求过来,计数器加一,这时候判断,如果计数器的值小于限流值,并且与上一次请求的时间间隔还在一分钟内,允许请求通过,否则拒绝请求,如果超出了时间间隔,要将计数器清零。/** * 限流算法集合 */@Slf4jpublic class RateLimitUtils { //初始时间 private static long startTime =
2021-08-21 00:31:34
831
原创 Mybatis面试题-日更
什么是MyBatis的接口绑定?有哪些实现方式?接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。接口绑定有两种实现方式通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时
2021-08-20 00:38:27
98
原创 mybatis 一二级缓存简述
mybatis 为我们提供了一级缓存和二级缓存一级缓存:每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入Local Cache,最后返回结果给用户。一级缓存配置:<setting name="localCacheScope" val
2021-08-20 00:22:01
250
原创 Hystrix容错
Hystrix的容错主要是通过添加容许延迟和容错方法,帮助控制这些分布式服务之间的交互。还通过隔离服务之间的访问点,阻止它们之间的级联故障以及提供回退选项来实现这一点,从而提高系统的整体弹性。Hystrix主要提供了以下几种容错方法:1. 资源隔离,2.熔断,3. 降级。1 资源隔离 资源隔离主要指对线程的隔离。Hystrix提供了两种线程隔离方式:线程池和信号量。1. 线程隔离 - 线程池 Hystrix通过命令模式对发送请求的对象和执行请求的对象进行解耦,将不同类型的业务...
2021-08-18 23:53:47
632
原创 Hystrix原理讲解
目录前言:服务雪崩定义:雪崩应对策略:使用Hystrix解决雪崩:特色:设计原则前言:分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级. 而Hystrix的出现,给我们提供了另一种选择.服务雪崩定义:服务雪崩效应是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程.如果所示:上图中, A为服务提供者, B为A的服务调用者, ...
2021-08-18 23:43:20
166
转载 对于注册中心,ZooKeeper、Eureka 哪个更合适?
简介Eureka本身是Netflix开源的一款提供服务注册和发现的产品,并且提供了相应的Java封装。在它的实现中,节点之间相互平等,部分注册中心的节点挂掉也不会对集群造成影响,即使集群只剩一个节点存活,也可以正常提供发现服务。哪怕是所有的服务注册节点都挂了,Eureka Clients(客户端)上也会缓存服务调用的信息。这就保证了我们微服务之间的互相调用足够健壮。Zookeeper主要为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。曾经是Hadoop项目中的一个子项目,用来控制集群中
2021-08-18 18:03:47
205
原创 Java偷懒洗牌算法
public class Card { private String card; private String color; public Card(String card, String color) { this.card = card; this.color = color; } public String toString() { String ss= color+":"+card+" ";..
2021-08-18 15:15:29
128
原创 SpringBoot启动原理
正文我们开发任何一个Spring Boot项目,都会用到如下的启动类 123456 @SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }} 从上面代码可以看出,Annotation
2021-08-18 00:15:13
137
原创 spring注解之@Import注解的三种使用方式
1、@Import注解须知1、@Import只能用在类上,@Import通过快速导入的方式实现把实例加入spring的IOC容器中2、加入IOC容器的方式有很多种,@Import注解就相对很牛皮了,@Import注解可以用于导入第三方包,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷3、@Import注解有三种用法2、@Import的三种用法@Import的三种用法主要包括:1、直接填class数组方式2、ImportSelector方式【重点..
2021-08-18 00:01:46
379
原创 Springboot-importSelector
ImportSelector接口概述ImportSelector接口是至spring中导入外部配置的核心接口,在SpringBoot的自动化配置和@EnableXXX(功能性注解)都有它的存在。我们先来看一下ImportSelector接口的源码,如下所示。public interface ImportSelector { /** * Select and return the names of which class(es) should be imported based on *
2021-08-17 23:38:58
623
原创 Spring Boot 面试题
1、什么是 Spring Boot?多年来,随着新功能的增加,spring 变得越来越复杂。我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如果必须启动一个新的 Spring 项目,我们必须添加构建路径或添加 Maven 依赖关系,配置应用程序服务器,添加 spring 配置。因此,开始一个新的 spring 项目需要很多努力,因为我们现在必须从头开始做所有事情。Spring Boot 是解决这个问题的方法。Spring Boot 已经建立在现有 spri
2021-08-17 01:21:47
212
原创 springboot 自动装配
一、回顾在普通的Spring项目中的做法在没有使用Spring Boot之前,我们需要在xml文件中进行需要用到的Bean的配置(以最常用的mybatis的使用为例)。在使用到mybatis时,除了引入依赖外,我们需要配置相关的Bean(DataSource的bean、SqlSessionFactory的bean)而在用到Spring Boot后,我们只需要引入依赖,再加上少量的配置就可以完成自动装配。在properties文件中配置:这得益于Spring Boot的自动装配
2021-08-17 01:19:37
213
原创 使用FactoryBean定制实例化逻辑
对象实现org.springframework.beans.factory.FactoryBean接口,则成为它本身的工厂。FactoryBean接口是Spring IoC容器实例化逻辑的扩展点。假如初始化代码非常复杂,此时使用java编码比使用XML配置更容易表达。这种场景中,你可以创建自己的FactoryBean,在该类中编写复杂的初始化程序,然后将你的自定义FactoryBean插入到容器。FactoryBean接口提供了三种方法:Object getObject():返回此工厂创建的对象
2021-08-17 00:50:06
220
原创 Spring解决循环依赖
跳出源码地狱,Spring巧用三级缓存解决循环依赖-原理篇-Java知音概述使用两级缓存即可解决循环依赖问题,但是Spring还需要支持AOP,对象被AOP之后会生成一个新的对象,如果在将实例注入之后再进行AOP,那么两个地方的对象将不一致。因此使用三级缓存,将对象的AOP提前到实例化进行。三级缓存的过程尝试获取一个bean,发现bean不存在,于是实例化该bean,并放入三级缓存。 第二次尝试获取该bean,从三级缓存中找到bean,对该实例执行AOP,放入二级缓存并返回。 在初始.
2021-08-16 00:59:08
123
原创 java.lang.IllegalStateException: closed
使用okhttp3的时候遇到的异常:java.lang.IllegalStateException: closed。原因是流已经关闭,所以无法再进行操作。public abstract class myCallback extends Callback<Bundle> { @Override public Bundle parseNetworkResponse(Response response, int id) throws Exception { .
2021-08-14 17:28:55
2769
原创 HashMap面试指南
(1)HashMap的实现原理?此题可以组成如下连环炮来问你看过HashMap源码嘛,知道原理嘛? 为什么用数组+链表? hash冲突你还知道哪些解决办法? 我用LinkedList代替数组结构可以么? 既然是可以的,为什么HashMap不用LinkedList,而选用数组?你看过HashMap源码嘛,知道原理嘛?针对这个问题,嗯,当然是必须看过HashMap源码。至于原理,下面那张图很清楚了:HashMap采用Entry数组来存储key-value对,每一个键值对...
2021-08-13 00:23:06
124
原创 Spring基础面试题-同步更新
谈谈你对IOC 和 AOP 的理解?他们的实现原理是什么?IOC 叫做控制反转,指的是通过Spring来管理对象的创建、配置和生命周期,这样相当于把控制权交给了Spring,不需要人工来管理对象之间复杂的依赖关系,这样做的好处就是解耦。在Spring里面,主要提供了 BeanFactory 和 ApplicationContext 两种 IOC 容器,通过他们来实现对 Bean 的管理。AOP 叫做面向切面编程,他是一个编程范式,目的就是提高代码的模块性。Srping AOP 基于动态代理的方式实现
2021-08-13 00:15:37
135
原创 mysql数据库ACID实现原理
说到事物的四大特性原子性、一致性、隔离性、持久性,懂的人很多,但是稍微涉及细节,四大特性在数据库中的实现原理是怎么实现的?几乎很少有人能够答上来。所以这里着重讨论下mysql中的实现原理。问题一:Mysql怎么保证一致性的?OK,这个问题分为两个层面来说。从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性
2021-08-10 21:10:24
279
算法导论第三版高清完整PDF及其习题中文答案
2018-04-28
opencsv-2.3.jar
2016-10-26
mybatis逆向代码生成
2016-07-07
activiti-2
2016-06-22
activiti笔记1
2016-06-22
正则表达式
2016-06-01
从版本库pull下包位置不对?
2016-08-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人