Maven依赖管理与常用配置
maven依赖查找官网 https://mvnrepository.com/ dependencyManagementdependency 真正引入依赖,而 dependencyManagement 只是声明依赖版本等信息,并不实际引入。一般使用在父模块中,子模块声明这个依赖的时候,就不需要声明版本信息。其中的<type>pom</type>和<scope>import</scope>引入的不是代码依赖,而是版本管理信息 <relativePath/>空标签等价于 ,它告诉 Maven: 不要尝试从相对路径查找父 POM,直接去本地仓库和远程仓库寻找。 这是一种显式声明“父 POM 必须从仓库获取” 的方式,可以避免 Maven 因在相对路径查找而浪费时间和产生误导
shell
Shell 环境Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux 的 Shell 种类众多,常见的有: Bourne Shell(/usr/bin/sh或/bin/sh) Bourne Again Shell(/bin/bash) C Shell(/usr/bin/csh) K Shell(/usr/bin/ksh) Shell for Root(/sbin/sh)……本文关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。 在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin...
Spring 集成 Mybatis
Spring 集成 MybatisMybatis 官网 是一款持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 快速入门要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。 如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中: 12345<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version></dependency> 从 XML 中构建 SqlSessionFactor...
分布式基础
什么是分布式系统?我们应该都知道微服务是将一个大程序,才分为很多小程序。它强调按照业务能力(边界),将应用拆分成一个个独立、小型、自治的服务。 而将这些小服务部署到服务器上,它就是分布式部署。因为这些服务不在同一个进程,甚至很多不在同一个机器上。 但是那它们分别解决了什么问题?同时又带来了什么问题? 先看微服务解决了什么问题: 解耦业务,不用担心炸掉别人的业务。 独立迭代和发版,不用等所有业务完成测试,只需要测试自己的,然后独立发布部署就好。 技术栈自由,可以切换语言一个服务。 精准弹性扩缩容,对访问量大的服务多部署一些。 微服务带来的问题: 分布式事务 服务治理,雪崩,注册中心,熔断,服务发现,网关等。 排查问题困难,涉及到多个服务 开发环境配置要求高 再来看分布式部署解决了什么问题: 高可用(消除单点故障):一台挂了,另一台顶上,系统不宕机。 高性能(突破物理天花板):单台机器CPU/内存有上限,分布式可以把流量分摊到多台 异地容灾:把节点部署在不同机房甚至不同城市,应对地震、停电等极端灾害。 分布式部署带来的问题: 网络不可靠,永远要处理部分...
ForkJoin框架
Java Fork Join 框架对于简单的并行任务,你可以通过“线程池 +Future”的方案来解决;如果任务之间有聚合关系,无论是 AND 聚合还是 OR 聚合,都可以通过 CompletableFuture 来解决;而批量的并行任务,则可以通过 CompletionService 来解决。 CompletableFuturerunAsync 和 supplyAsync 方法CompletableFuture 提供了四个静态方法来创建一个异步操作。 1234public static CompletableFuture<Void> runAsync(Runnable runnable)public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)public static...
Java内存模型
Java 内存模型 关键词:JMM、volatile、synchronized、final、Happens-Before、内存屏障 Java 内存模型(Java Memory Model),简称 JMM。Java 内存模型的目标是为了解决由可见性和有序性导致的并发安全问题。Java 内存模型通过 屏蔽各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的内存访问效果。 物理内存模型物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对于虚拟机的实现也有相当大的参考意义。 硬件处理效率物理内存的第一个问题是:硬件处理效率。 绝大多数的运算任务都不可能只靠处理器“计算”就能完成,处理器至少需要与内存交互,如读取运算数据、存储运算结果,这个 I/O 操作是很难消除的(无法仅靠寄存器完成所有运算任务)。 由于计算机的存储设备与处理器的运算速度有几个数量级的差距 ,这种速度上的矛盾,会降低硬件的处理效率。所以,现代计算机都不得不 加入高速缓存(Cache) 来作为内存和处理器之间的缓冲。将需要用到的数据复制到缓存中,让运算能...
Java并发工具类
概述 JDK 的 java.util.concurrent 包(即 J.U.C)中提供了几个非常有用的并发工具类。 CountDownLatch 字面意思为 递减计数锁。用于控制一个线程等待多个线程。 CountDownLatch 维护一个计数器 count,表示需要等待的事件数量。countDown 方法递减计数器,表示有一个事件已经发生。调用 await 方法的线程会一直阻塞直到计数器为零,或者等待中的线程中断,或者等待超时。 CountDownLatch 是基于 AQS(AbstractQueuedSynchronizer) 实现的。 CountDownLatch 唯一的构造方法: 12// 初始化计数器public CountDownLatch(int count) {}; 说明: count 为统计值。 CountDownLatch 的重要方法: 123public void await() throws InterruptedException { };public boolean await(long timeout...
Java并发和容器
Java 并发和容器同步容器同步容器简介在 Java 中,同步容器主要包括 2 类: Vector、Stack、Hashtable Vector - Vector 实现了 List 接口。Vector 实际上就是一个数组,和 ArrayList 类似。但是 Vector 中的方法都是 synchronized 方法,即进行了同步措施。 Stack - Stack 也是一个同步容器,它的方法也用 synchronized 进行了同步,它实际上是继承于 Vector 类。 Hashtable- Hashtable 实现了 Map 接口,它和 HashMap 很相似,但是 Hashtable 进行了同步处理,而 HashMap 没有。 Collections 类中提供的静态工厂方法创建的类(由 Collections.synchronizedXXX 等方法) 同步容器的问题同步容器的同步原理就是在其 get、set、size 等主要方法上用 synchronized 修饰。 性能问题synchronized 的互斥同步会产生阻塞和唤醒线程的开销。显然,这种方式比没有使用 syn...
Java并发核心机制
Java 并发核心机制 Java 对于并发的支持主要汇聚在 java.util.concurrent,即 J.U.C。而 J.U.C 的核心是 AQS。 J.U.C 简介Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。从功能上,大致可以分为: 原子类 - 如:AtomicInteger、AtomicIntegerArray、AtomicReference、AtomicStampedReference 等。 锁 - 如:ReentrantLock、ReentrantReadWriteLock 等。 并发容器 - 如:ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet 等。 阻塞队列 - 如:ArrayBlockingQueue、LinkedBlockingQueue 等。 非阻塞队列 - 如: ConcurrentLinkedQueue 、LinkedTransferQueue...
Mybatis原理
Mybatis 原理 Mybatis 的前身就是 iBatis ,是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。本文以一个 Mybatis 完整示例为切入点,结合 Mybatis 底层源码分析,图文并茂的讲解 Mybatis 的核心工作机制。 Mybatis 生命周期 SqlSessionFactoryBuilderSqlSessionFactoryBuilder 的职责SqlSessionFactoryBuilder 负责创建 SqlSessionFactory 实例。SqlSessionFactoryBuilder 可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。 Configuration 类包含了对一个 SqlSessionFactory 实例你可能关心的所有内容。 SqlSessionFactoryBuilder 应用了建造者设计模式,它有五个 build 方法,允许你通过不同的资源创建 SqlSessionFactory 实例。 12345SqlSessionFa...







