自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Brain_L的博客

积跬步,行千里

  • 博客(34)
  • 收藏
  • 关注

原创 自定义springboot starter和自定义条件注解

新建工程新建工程,com.example.myboot。MybootProperties@ConfigurationProperties(prefix = "myboot")public class MybootProperties { private String status; private String msg; public String getStatus() { return status; } public void setStatus

2020-05-30 17:53:53 1021

原创 FactoryBean与ObjectFactory

FactoryBeanpublic interface FactoryBean<T> { //获取对象 T getObject() throws Exception; //获取对象类型 Class<?> getObjectType(); //是否单例,默认true default boolean isSingleton() { return true; }}FactoryBean是一种特殊的bean,本身又是个工厂,实现了

2020-05-27 20:02:40 547

原创 spring boot自动配置

@Import用途声明一个bean@Import({xxxBeanClass.class}),beanName为全类名导入@Configuration注解的配置类@Import({xxxConfiguration.class})导入ImportSelector的实现类@Import({xxxImportSelector.class}),beanName为全类名导入ImportBeanDefinitionRegistrar的实现类@Import({xxxImportBeanDe

2020-05-26 22:50:39 379

原创 spring boot aop

spring boot 开启aop引入starter<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>配置spring.aop.auto=true # Add @EnableAspectJAutoProxy.spring.a

2020-05-25 21:56:33 287

原创 mysql事务、锁、MVCC

事务特性(ACID)原子性 Atomicity。每个事务中的操作,要么都成功,要么都失败一致性 Consistency。事务执行前后,数据库中的数据应该保持一致隔离性 Isolation。事务之间应该是隔离的,事务之间互不影响、干扰持久性 Durability。事务一旦提交,便会将修改持久化到数据库数据库事务隔离级别:读未提交:read uncommitted读已提交:read committed可重复读:repeatable read串行化:serializable事务带来的问

2020-05-11 12:25:49 187

原创 mysql组合索引

定义不同于对某列建立索引,可以同时对多个列建立索引,也称复合索引、联合索引。测试表CREATE TABLE `test` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `c1` int(10) NOT NULL COMMENT 'c1', `c2` int(10) NOT NULL COMMENT...

2020-04-11 17:58:05 385 1

原创 mysql explain详解

定义在查询语句前加上explain,Mysql就不会去执行查询语句,而是返回sql语句的执行计划,帮助我们查看索引是否真正使用等重要信息。测试表CREATE TABLE `primary_table` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `c1` bigint(20) unsigned NO...

2020-04-08 22:07:53 691

原创 Mysql索引

索引的几种候选实现方式:二叉搜索树、B-tree、B+tree二叉搜索二叉搜索由于其特性(当前节点的值大于左子树所有子节点的值,小于右子树所有子节点的值)可以用来进行二分查找。每次将搜索范围缩减一半,二叉树的深度越大,搜索时间约长、IO次数越多。B树平衡多路搜索树,可以有多个子节点。每次查找范围可以划分的更小。每个节点存储多个数据,减少IO交互。树深度相应降低,每个叶子节点的高度...

2020-03-28 12:11:38 168

原创 @Autowired和@Resource

@Autowiredspring提供的注解按类型注入,byType当同一类型有多个bean时,配合@Qualifier指定注入某个bean当@Autowired修饰的属性不是一定要注入时,可以指定required=false@ResourceJ2EE提供的注解可以byName,也可以byType,或同时byType和byName,如果什么都不指定,默认为byNa...

2020-03-22 09:51:58 184

原创 wait、notify、notifyAll

本文总结下wait、notify、notifyAll,其实是为了试试markdown。。。wait释放所持有的锁,线程阻塞。能释放,那必须先持有,和synchronized配合使用。线程调用wait方法,会进入锁对象的等待池,等待被唤醒。由于线程进入等待,需要捕获InterruptedException,防止被打断,无法继续进行。notify线程释放,唤醒锁对...

2020-03-21 10:37:46 149

原创 mysql的一次报错排查

昨天工作时,因为一个sql没注意,搞了半天才解决,现在记录下。业务场景比较复杂,查询的sql也复杂了些。业务逻辑最复杂的地方在其中的一个子查询那,结果最终的结果怎么都不对,以为是子查询那出了问题,对业务逻辑梳理了半天,发现子查询的sql结果是对的。最后发现出错在外面的group by上,晕死。不知道是因为没在意还是误操作,本来是group by a被写成了group by a, b,导致最终的...

2020-03-14 17:55:38 284

原创 动态代理

动态是相对于静态而言,何为静态,即编码时手动编写代理类、委托类。而动态呢,是不编写具体实现类,等到使用时,动态创建一个来实现代理的目的。为什么有了静态代理还需要动态代理呢?静态代理毕竟是你手动编码的,如果需要对很多个方法进行一些公共处理(比如耗时,日志等),你需要在每个方法处修改代码,而且逻辑上都是相通的。如果使用动态代理的话,你只需要指定规则,那么动态代理就可以根据你指定的规则进行处理。...

2020-02-11 23:39:51 242

原创 记PowerMockito whenNew的一个坑

被测试类:class A { public void handle() { B b = new B(); }}测试handle方法,而我不想真正去执行new B()操作,那么可以使用PowerMockito.whenNew:@RunWith(PowerMockRunner.class)@PrepareForTest({A.class})//此处写...

2019-12-20 11:15:24 14138 12

原创 记一次编译报错——no project xxx : Formatting violations found in the following files

下载了spring-boot-v2.2.2.RELEASE后,按照网上说的方法进行编译,命令为mvn -Dmaven.test.failure.ignore=true -Dmaven.test.skip=true clean install报错如下:根据提示,执行 mvn spring-javaformat:apply问题解决。...

2019-12-09 19:16:59 7107 3

原创 【Java并发】CyclicBarrier

CyclicBarrier从字面意思上来看,循环栅栏,这篇文章就来分析下是到底是如何实现循环和栅栏的。属性private final ReentrantLock lock = new ReentrantLock();/** Condition to wait on until tripped */private final Condition trip = lock.newCo...

2019-12-03 10:10:25 170

原创 【Java并发】CountDownLatch

ReentrantLock为独占锁,也即排他锁,同一时刻只能有一个线程持有锁。现在来看几种共享锁。CountDownLatchpublic CountDownLatch(int count) { if (count < 0) throw new IllegalArgumentException("count < 0"); this.sync...

2019-12-02 16:01:57 161

原创 【Java并发】ReentrantLock

前篇写了JUC的基础AQS,其中介绍了它提供的很多模板方法,但是在实际编程中我们不会直接使用它,而是会使用它的各种实现。本文将介绍在实际使用中出现频率很高的一种并发锁——ReentrantLock。从名字上来看,ReentrantLock具有两个特性,一个是可重入,一个是锁。public class ReentrantLock implements Lock, java.io.Seria...

2019-12-01 21:10:02 159

原创 【Java并发】AQS

AQS依赖于提供一个原子变量(state)用来表示当前锁对象的同步状态,并且提供了三个对state变量原子操作的方法getState() setState() compareAndSetState()/** * Returns the current value of synchronization state. * This operation has memory semant...

2019-11-26 17:11:05 242

转载 【Java基础】Lambda表达式

看到一篇Lambda表达式的文章,自己写应该没这个写的好,特转载记录。

2019-11-01 17:09:56 155

原创 【Java基础】EnumSet

当需要使用位运算时,可能你会如此定义private final static int FIRST = 1;private final static int SECOND = 1 << 1;private final static int THIRD = 1 << 2;使用时进行与或运算。但是定义多了之后,会很乱、臃肿,编写容易出错。EnumSet可以实现类似的...

2019-10-31 14:19:56 292 1

原创 【Java基础】枚举

Java的枚举和C/C++中的枚举作用上类似,实现上不一样。本文主要探讨下Java中枚举的实现与应用。如果要定义常量,可能会这样定义:private static final int SUCCESS = 0;一旦这样的定义多了之后,就很难管理,容易出错,甚至重复定义。用枚举的话就很简洁清晰。枚举原理分析public enum EnumTest { SUCCESS, ...

2019-10-30 23:33:21 331

原创 几种单例模式的对比

单例模式有好几种实现方式:饿汉式、懒汉式、DCL、静态内部类、枚举等。本文主要探讨几种实现方式是否实现了真正意义上的单例——只创建一个对象。创建对象有这么几种方式:new、克隆、序列化、反射。几种单例模式实现时都会将构造函数声明为private,所以new这种方式此时认为不可用,那么着重看其他几种是否能保证真正的单例。序列化@Slf4jpublic class Sing...

2019-10-25 17:27:52 256

原创 CopyOnWriteArrayList

ArrayList和LinkedList都不是线程安全的,如果需要线程安全的List,可以使用Collections.synchronizedList来生成一个同步list,但是这个同步list的方法都是通过synchronized修饰来保证同步的,并发性能不高。那么如果提高并发性能呢?比如某些场景下,对List的读操作远多于写操作,那么CopyOnWriteArrayList就派上用场了。...

2019-10-15 22:39:17 153

原创 【Java基础】LinkedHashMap

HashMap是根据key的hash值进行散列存储的,每个节点间是无序的。而LinkedHashMap可以实现有序的存储键值对。LinkedHashMap是继承于HashMap的,所以它的很多属性和方法都是HashMap中的,那么它是怎么实现有序存储的呢?1、属性/** * The head (eldest) of the doubly linked list. */tra...

2019-10-13 13:38:01 263

原创 ThreadLocal

1、ThreadLocal是什么?顾名思义,线程级的本地变量,也就是线程之间是隔离的,不共享。适合不同线程存储各自的上下文。webapp中应用较多。2、ThreadLocal中的属性和方法private final int threadLocalHashCode = nextHashCode();private static AtomicInteger nextHashCo...

2019-08-04 09:58:44 164

原创 【Java基础】四种引用(强引用、软引用、弱引用、虚引用)

java中的引用类似C/C++中的指针,都是指向内存中的某个对象,通过该引用可以直接操作对应的对象。引用和GC有着直接关系,根据可达性分析算法(从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用),一个对象没有引用关联,则GC可以将其回收。1、强引用引用的默认方式,即是强引用,创建一个对象并把这个对象赋给一个引用变...

2019-08-04 09:14:25 357

原创 【Java基础】初始化时代码块执行顺序

本文讲下类在初始化加载时,静态代码块、构造代码块、构造函数以及有父类时的执行顺序。1、无父类时看个例子就一目了然了。public class TempTest { private static final Logger LOGGER = LoggerFactory.getLogger(TempTest.class); static { LOGGE...

2019-07-12 11:12:24 432

原创 【Java基础】HashMap

本文jdk版本为1.8。基本属性/** * The default initial capacity - MUST be a power of two. */ //默认初始化容量16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16/** * The maximum capacity, ...

2018-11-09 13:51:18 188

原创 【Java基础】ArrayList和LinkedList

一、ArrayList从名字上来看就是以数组为基础的List。来看源码:public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{/** * De...

2018-11-07 14:36:23 198

原创 【Java基础】String、StringBuilder、StringBuffer

String、StringBuilder、StringBuffer是经常会被拿来比较的三个类,本文主要研究三者之间的区别。本文所用jdk为jdk1.8.0_151。一、String源码String的源码和注释已经列举了很多用法及原因,所以开头先贴出部分源码及注释,一些常用方法如charAt等本文暂不讨论。/** * The {@code String} class repres...

2018-10-30 11:09:04 170

原创 【Java基础】try、catch、finally

本文通过几个示例来研究try、catch、finally和return结合起来的各种情况。示例1: public String finallyTest() { String s = null; try { System.out.println("Enter try block"); s = "try block"; //String .valueOf(nu...

2018-10-22 16:19:12 244

原创 【Java基础】equals和hashcode

一、equalsequals是Object类的其中一个方法,默认的实现方法为 public boolean equals(Object obj) { return (this == obj); }可以看到,默认方法仅仅是判断是否为同一对象。因为各个类都是继承自Object类,所以各个类可以根据需要自己重写equals方法,如String类等。String...

2018-10-12 14:50:52 164

原创 【Java基础】a+=1与a=a+1

偶然在某个地方看到这个问题,第一反应是两者是有区别的,但是要说的很详细,一时又想不起来。所以在此记录下来。首先,java中整数的默认类型是int型,浮点数的默认类型是double型。数值的转换分为隐式转换和显式转换,隐式转换即jvm帮你去做转换,显式即你自己需要进行强制类型转换。什么时候进行隐式转换呢,存储范围小的向大的转换,如int向long转换(long a = 10;),进行算术...

2018-10-09 21:48:28 7045 1

原创 【Java基础】int和Integer

Java中存在8种基本数据类型:byte(8位)、short(16位)、int(32位)、long(64位)、float(32位)、double(64位)、char(16位,0x0000~0xffff)、boolean(true/false)java中不存在无符号数字类型,即C中的unsigned int等数据类型均有其对应的包装类,数字类型的包装类均继承自Numbers。int对应的包装类为...

2018-10-08 17:19:38 236

空空如也

空空如也

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

TA关注的人

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