- 博客(417)
- 资源 (53)
- 收藏
- 关注
原创 StackOverflowError 栈溢出实战
栈溢出的原因在解决栈溢出问题之前,我们首先需要知道一般引起栈溢出的原因,主要有以下几点:是否有递归调用,循环依赖调用是否有大量循环或死循环全局变量是否过多局部变量过大,如:数组、List、Map数据过大问题现象我们一个很老的接口(近一年没有动过)在线上运行一段时间后报了StackOverflowError栈溢出,其他接口又能正常提供服务,错误日志:java.lang.Stack...
2019-11-28 11:37:47 2206 1
原创 Mybatis 源码(六)Mybatis-Spring框架实现原理
我在使用mybatis-spring过程中一直有一个疑问,在Mybatis 源码(一)总揽中我提到过,SqlSession和Mapper对象的声明周期是方法级别的,也就是每个请求的SqlSession和Mapper对象是不一样的,是一个非单例的Bean。但是与Spring集成后,为什么我们可以直接注入Mapper对象,如果通过直接注入的话Mapper对象却成了单例的了?我们带着疑问来看下Myba...
2019-11-28 11:35:47 389
原创 Mybatis 源码(五)Mybatis 中的数据读写
数据读写的本质不管是哪种ORM框架,数据读写其本质都是对JDBC的封装,其目的主要都是简化JDBC的开发流程,进而让开发人员更关注业务。下面是JDBC的核心流程:注册 JDBC 驱动(Class.forName(“XXX”);)打开连接(DriverManager.getConnection(“url”,“name”,“password”))根据连接,创建 Statement(conn....
2019-11-28 11:35:01 317
原创 Mybatis 源码(四)Mybatis Excuter框架
我们在上一章介绍到,Mybatis会将所有数据库操作转换成iBatis编程模型,通过门面类SqlSession来操作数据库,但是我们深入SqlSession源码我们会发现,SqlSession啥都没干,它将数据库操作都委托给你了Excuter,如图:Excuter框架类图BaseExecutor在BaseExecutor定义了Executor的基本实现,如查询一级缓存,事务处理等不变的...
2019-11-28 11:34:02 356
原创 Mybatis 源码(三)Mybatis 代理模块
在使用Mybatis的时候大家可能都有一个疑问,为什么只写Mapper接口就能操作数据库?它的主要实现思想是:使用动态代理生成实现类,然后配合xml的映射文件中的SQL语句来实现对数据库的访问。Mybatis编程模型Mybatis是在iBatis上演变而来ORM框架,所以Mybatis最终会将代码转换成iBatis编程模型,而 Mybatis 代理阶段主要是将面向接口编程模型,通过动态代理转...
2019-11-28 11:33:22 258
原创 Mybatis 源码(二)Mybatis 初始化
Mybatis 初始化是由SqlSessionFactoryBuilder来完成的,主要的工作解析XML文件,并将解析的类容封装到Configuration类中,最后将Configuration类封装到SqlSessionFactory中并返回,自此初始化完成。完成对XML文件解析的是XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder三个类...
2019-11-28 11:32:45 275
原创 Mybatis 源码(一)总揽
整体架构这只是MySql的一个逻辑划分架构。接口层:通SqlSession类提供对数据库访问能力,隐藏了后续复杂的处理逻辑。核心处理层:主要负责执行SQL,并返回结果。基础支撑层:对一些基础功能进行封装,为核心处理层提供服务。代码结构Mybatis的代码结构非常工整,堪称完美的java编程规范教科书,当我们深入源码我们会发现,Mybatis的注释量相当少,那是因为基本上我们可以...
2019-11-28 11:32:03 313
原创 Mybatis 配置详解
完整配置mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><confi...
2019-11-28 11:31:25 309
原创 JDBC 核心要点
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。初始化H2数据库public class BaseTest { protected ...
2019-11-28 11:29:24 263 1
原创 mybatis-plus 2.x升级3.x注意点
2.0到3.0主要升级的点:升级 JDK 8 + 优化性能 Wrapper 支持 lambda 语法模块化 MP 合理的分配各个包结构重构注入方法,支持任意方法精简注入模式全局配置下划线转换消灭注入 AS 语句改造 Wrapper 更改为 QueryWrapper UpdateWrapper重构 分页插件 消灭固定分页模型,支持 Mapper 直接返回 IPage 接口新增 Res...
2019-11-28 11:28:16 3528 3
原创 Spring 源码(十一)Spring流程汇总
Spring 容器初始化流程Spring 容器初始化流程大致流程如下:this():注册内置的BeanPostProcessor的BeanDefinition到容器register(annotatedClasses):注册配置类 BeanDefinition 到容器prepareRefresh():初始化前的准备工作,列如对系统属性或者环境变量进行验证obtainFreshBeanF...
2019-11-28 11:20:33 751
原创 Spring 源码(十)Spring Aware自动装配原理
Spring Aware自动装配有两种实现方式:在初始化Bean的initializeBean方法中执行invokeAwareMethods方法通后置处理器ApplicationContextAwareProcessor来实现的,它实现了BeanPostProcessor接口invokeAwareMethods我们在初始化Bean的时候,为了保证一部分Aware必须在后置处理器post...
2019-11-28 11:19:37 461
原创 Spring 源码(八)循环依赖源码解析
循环依赖是指两个或者多个Bean之前相互持有对方。在Spring中循环依赖一般有三种方式:构造函数循环依赖setter方法循环依赖prototype 范围的依赖处理构造函数循环依赖在Spring中构造函数循环依赖是无法解决的,因为构造函数依赖其实是方法间循环调用的一种,会发生死循环。但是在Spring中会直接抛出BeanCurrentlyInCreationException异常。源...
2019-11-28 11:18:36 381 1
原创 Spring 源码(九)@Autowired注解实现原理(Spring Bean的自动装配)
@Autowired注解的实现过程,其实就是Spring Bean的自动装配过程。通过看@Autowired源码注释部分我们可以看到@Autowired的实现是通过AutowiredAnnotationBeanPostProcessor后置处理器中实现的。AutowiredAnnotationBeanPostProcessor 类图PriorityOrdered:确认 AutowiredA...
2019-11-28 11:17:14 1497
原创 Spring 源码(七)Spring 事务源码解析
注册后置处理器开启对事务的支持@EnableTransactionManagement@EnableTransactionManagement注解的主要作用是开启对事务的支持,源码如下:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TransactionManagementC...
2019-11-28 11:13:57 352
原创 Cglib 与 JDK动态代理
AOP 代理的两种实现:jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到;cglib是子类,private的方法照样不会出现在子类里,也不能被拦截。JDK 动态代理。具体有如下四步骤:通过实现 InvocationHandler 接口创建自己的调用处理器;通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;通过...
2019-11-28 11:13:11 421
原创 Spring 源码(六)Spring AOP源码解析
AOP 面向切面编程,相对于OOP面向对象编程。Spring AOP存在的目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,且类继承只能是单继承,阻碍更多的行为添加到一组类上,AOP弥补了OOP的不足。Spring支持AspectJ的注解式切面编程,基本定义如下:使用@AspectJ声明一个切面。使用@After、@Be...
2019-11-28 11:12:22 562
原创 Spring 源码(五)初始化所有单例Bean,并注册到容器(Bean的生命周期)
在这之前我们先来看下refresh()方法,它完整的描述了整个ApplicationContext的初始化过程。这里看起来更像是对容器进行初始化的模板或者提纲。@Overridepublic void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonit...
2019-11-28 11:11:13 339
原创 Spring 源码(四)解析配置类
我们要找出所有符合条件的业务Bean,首先我们需要知道在Spring中什么样的Bean是符合条件的,是需要容器来管理的:使用组件标注注解的Bean(@Controller、@Service、@Repository、@Component),一般项目里面使用。使用@Bean注解标准的方法,一般导入第三方组件的时候使用。使用@Import注解导入的Bean,一般快速导入一批组件时使用。doP...
2019-11-28 11:09:20 275
原创 Spring 源码(三)注册配置类 BeanDefinition 到容器
调用链路:registerBeanDefinition:861, DefaultListableBeanFactory (org.springframework.beans.factory.support)registerBeanDefinition:315, GenericApplicationContext (org.springframework.context.support)reg...
2019-11-28 11:08:13 268
原创 Spring 源码(二)注册内置的BeanPostProcessor的BeanDefinition到容器
发起注册调用链路:registerAnnotationConfigProcessors:163, AnnotationConfigUtils (org.springframework.context.annotation)registerAnnotationConfigProcessors:134, AnnotationConfigUtils (org.springframework.con...
2019-11-28 11:06:28 357
原创 Spring 源码(一)Spring 容器的入口
Spring 容器的初始化ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);当我们完成一个ApplicationContext的实例化时就完成了Spring容器的初始化,而AnnotationConfigApplicationContext的构造方法也就是Spring容器的入...
2019-11-28 11:05:06 562
原创 Spring Bean 的初始化和销毁的三种方式(Spring Bean 的生命周期)
Spring 容器中的 Bean 是有生命周期的,Bean 的生命周期是指 Bean 创建----> 初始化----> 销毁 的过程,并且 Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。 下面是常用的三种指定特定操作的方法:通过 元素的init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;通过实现Ini...
2019-11-28 11:04:22 489
原创 Spring 核心注解
@Configuration 配置类注解声明一个类是配置类,等同于配置文件中的applicationcontext.xml。加载Spring配置的两种方式:ClassPathXmlApplicationContext XML方式ApplicationContext app = new ClassPathXmlApplicationContext("applicationcontext....
2019-11-28 11:03:29 596 1
原创 Spring Bean 的注册和注入的几种常用方式和区别
Spring 注册Bean:包扫描 + 组件标注注解(@Controller、@Service、@Repository、@Component),一般项目里面使用。使用@Bean注解,一般导入第三方组件的时候使用。使用@Import注解,一般快速导入一批组件时使用。使用FactoryBean接口 + @Bean注解。包扫描 + 组件标注注解(@Controller、@Service、@...
2019-11-28 11:02:47 1824 1
原创 Spring 模块介绍
一、核心容器(Core Container)Spring-Core:核心工具类,Spring其他模块大量使用Spring-Core。Spring-Beans:Spring定义Bean的支持。Spring-Context:运行时Spring容器。Spring-Context-Support:Spring对第三方包的集成支持。Spring-Expression:使用表达式语言在运行时查询...
2019-11-28 11:01:53 232
原创 Java中的指令重排
在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分3种类型:编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。内存系统的重排序。...
2019-11-28 10:57:20 6690 6
原创 Java内存模型
线程之间的通信和同步线程之间的通信和同步是并发编程领域的关键问题。线程之间的通信通信是指线程之间以何种机制来交换信息。线程之间的通信一般有两种方式:共享内存和消息传递。在java中典型的消息传递方式就是wait()和notify()。线程之间的同步同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线...
2019-11-28 10:56:43 147
原创 线程安全的单例模式
懒汉式加方法锁public class Singleton { private static Singleton singleton = null; private Singleton() { } public static synchronized Singleton getInstance() { if (Objects.isNull(s...
2019-11-28 10:56:06 175
原创 并发情况如何提升同步代码块的性能
使用并发编程的目标是为了提升系统性能,引入多线程后,其实会引入额外的开销,如线程之间的协调、增加的上下文切换,线程的创建和销毁,线程的调度等等。过度或不恰当的使用,可能会导致多线程程序性能甚至比单线程还要低。影响性能的因素上下文切换是指CPU 从一个进程或线程切换到另一个进程或线程。一次上下文切换花费5000~10000个时钟周期,几微秒。在上下文切换过程中,CPU会停止处理当前运行的程序,...
2019-11-28 10:55:20 434
原创 并发安全
在并发的情况下使用和调度一个类,这个类总是能表现出正确的行为,那么我们就说这个类是并发安全的类。类线程安全的表现为: 操作的原子性和内存的可见性。怎么才能做到类的线程安全栈封闭所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态。无状态没有任何成员变量的类,就叫无状态的类让类不可变我们常见的不可变类有:String,包装类,LoacalDateTime。让状态不可变,两种方式...
2019-11-28 10:28:59 224
原创 CompletionService 源码解析
CompletionService的主要作用是:按照异步任务的完成顺序,逐个获取到已经完成的异步任务。主要实现是在ExecutorCompletionService中。类图核心内部类private class QueueingFuture extends FutureTask<Void> { QueueingFuture(RunnableFuture<V> tas...
2019-11-28 10:12:14 249
原创 CompletableFuture 组合式异步编程
CompletableFuture是jdk1.8引入的一个新特性。 它主要是为了解决多个Future结果之间的依赖关系。比如:将两个异步计算合并为一个——这两个异步计算之间相互独立,同时第二个又依赖于第一个的结果。等待Future集合中的所有任务都完成。仅等待Future集合中最快结束的任务完成(有可能因为它们试图通过不同的方式计算同一个值),并返回它的结果。通过编程方式完成一个Fu...
2019-11-28 10:11:36 271
原创 FutureTask 源码解析
Future接口和实现Future接口的FutureTask类,代表异步计算的结果。FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给 Executor执行,也可以由调用线程直接执行(FutureTask.run())。类图核心属性/** * * Possible state transitions: * NEW ->...
2019-11-28 10:04:12 311
原创 JAVA中常见的线程池
Executor框架最核心的类是ThreadPoolExecutor,它是线程池的实现类,详情请看ThreadPoolExecutor 源码解析。Executors还为我们提供了4种常见的线程池,他们都是基于ThreadPoolExecutor而来,还有一个是WorkStealingPool是基于ForkJoinPool的。FixedThreadPool使用方式ExecutorService...
2019-11-28 10:03:39 386
原创 ThreadPoolExecutor 源码解析
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。合理地使用线程池能够带来3个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一分...
2019-11-28 10:02:28 410
原创 JAVA并发容器-写时复制容器
写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以写时复制容器也是一种读写分离的思想,读和写不同的容器。如果读的时候有多个线程正在向容器添加数据,读还是会读...
2019-11-28 10:00:49 545
原创 JAVA并发容器-ConcurrentSkipListMap,ConcurrentSkipListSet
ConcurrentSkipListMap其实是TreeMap的并发版本。TreeMap使用的是红黑树,并且按照key的顺序排序(自然顺序、自定义顺序),但是他是非线程安全的,如果在并发环境下,建议使用ConcurrentHashMap或者ConcurrentSkipListMap。ConcurrentSkipListSet其实是TreeSet的并发版本。TreeSet底层使用红黑树,并且按照k...
2019-11-28 10:00:04 506
原创 JAVA并发容器-阻塞队列
在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两 种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁 (入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方......
2019-11-28 09:58:28 263
原创 JAVA并发容器-ConcurrentLinkedQueue 源码分析
在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两 种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁 (入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。ConcurrentLinkedQueue是一个非阻塞的基于链表节点的无界线程安全队列,它遵循先进先出的原则,并采用...
2019-11-28 09:57:01 439 1
consul_1.7.3_windows\mac\linux.zip
2020-06-02
git-flow-plus-4idea-1.0.7.zip
2020-05-07
ScreenToGif.rar
2020-03-13
logback 中文手册
2017-03-30
汽车电子控制系统实例
2012-08-25
CAN技术规范
2012-08-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人