Java
文章平均质量分 70
小方好方
这个作者很懒,什么都没留下…
展开
-
运行时替换静态类的方法
1、引入依赖 <dependency> <groupId>net.bytebuddy</groupId> <artifactId>byte-buddy-agent</artifactId> </dependency> <dependency> <groupId>net.bytebuddy</grou原创 2022-05-21 00:22:31 · 755 阅读 · 1 评论 -
使用jdk的spi机制实现接口的扩展和解耦
0、背景总所周知,SPI在很多地方都有着很好的实践,比如JDBC驱动的加载、dubbo等,SpringBoot项目的autoConfiguration也是类似的原理。这里就感觉用来做模块解耦也不错。比如我们做应用管理的一个服务,它具有应用安装、升级、扩容等功能,经常在安装、升级、扩容流程中应用要求做一些定制化的东西,比如安装数据库,需要初始化database;安装kafka,需要初始化topic;对kafka的消费者进行扩容,需要同步扩topic的分区等等。而对于做应用管理的服务来说,它不应该区别化的对待原创 2022-02-25 21:33:23 · 1563 阅读 · 0 评论 -
用byte数组传参的注意事项
先看一个dmeopublic static void main(String[] args) { String s1 = "hello world"; byte[] b = s1.getBytes(Charset.defaultCharset()); printByte(b); String s2 = new String(b, Charset.defaultCharset()); System.out.println(s2)原创 2020-06-23 00:23:41 · 3402 阅读 · 0 评论 -
数据脱敏工具advance-tool-datamask
1 简介对于什么是数据脱敏,以下解释来自百度百科数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业性敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户号等个人信息都需要进行数据脱敏。在大数据环境下隐私保护的需求越来越频繁的被提及,对于一些敏感的信息,市面上很多应用都有一...原创 2020-04-15 23:44:59 · 5010 阅读 · 0 评论 -
springboot2.x连接zookeeper
1、引入相关依赖 <properties> <java.version>1.8</java.version> <lombok.version>1.18.12</lombok.version> <zookeeper.version>3.6.0</zookeeper.v...原创 2020-03-31 02:03:50 · 915 阅读 · 0 评论 -
mac上安装zookeeper
1、下载2、解压配置环境变量(1)解压tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz为了方便将文件夹名称修改为zookeepermv apache-zookeeper-3.6.0-bin zookeeper(2)配置zookeeper的环境变量vim ~/.bash_profile配置ZOOKEEPER_PATH和PATHZOOKEE...原创 2020-03-31 00:00:10 · 290 阅读 · 0 评论 -
分析java8的LocalDateTime类及使用的注意事项
jdk8中新增的java.time包真的是不要太棒,jdk8以前的date存在着线程不安全、api难用等问题。来看看新的date有些什么特点:1、使用不可变对象保证线程安全LocalDateTime中有两个final修饰的成员,date表示日期(年月日部分),time表示时间(时分秒部分)。 /** * The date part. */ private fina...原创 2020-03-30 21:20:34 · 1181 阅读 · 0 评论 -
分布式事务学习(一)初步了解
1、简介1.1、背景我们所做的项目中经常涉及到服务A调服务B、服务B调服务C这种情况,当整个调用链路中某一个服务发生异常时,需要将所涉及所有服务做的修改都回滚掉才能保证整体事务的一致性。Spring所提供的声明式事务@Transcational只能保证服务在操作自身数据库时的事务一致性,而无法保证其他服务的事务与自身保持一致。1.2、我们真的需要分布式事务吗?引入任何一个技术之前我觉得都应...原创 2020-03-29 23:02:30 · 207 阅读 · 0 评论 -
使用排队论实现服务节点的动态扩展
1、背景通常我们的服务器面对高并发时会采取一些限流、熔断、降级的手段,条件允许的时候采取水平扩展提升系统的吞吐量。最近脑子一热在想若是不考虑水平扩展的成本,我们是不是可以设计一款支持动态扩展的系统,当并发量大达到限流上限时自动增加服务节点,当并发量很小时自动销毁空闲节点。其实想一想我们的服务模型,与如下的排队模型很相似。其实排队论就是为解决这类问题的,原理见参考2、实现服务指标的计算动...原创 2020-03-28 23:55:24 · 1586 阅读 · 0 评论 -
TreeMap底层原理学习(JDK1.8)
1、TreeMap构造 public TreeMap() { comparator = null; } public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; } public TreeMap(Map<...原创 2020-03-25 21:51:55 · 451 阅读 · 0 评论 -
LinkedHashMap底层源码分析(JDK1.8)
1、LinkedHashMapLinkedHashMap直接继承自HashMap,底层仍然是数组+链表+红黑树的结构,重写了HashMap的get、remove、foreach等方法。LinkedHashMap.Entry继承自HashMap.Node,增加了属性before和after,增加了一些双链表相关的操作。从下图中可以看出HashMap.Node、LinkedHashMap.Ent...原创 2020-03-25 20:34:15 · 172 阅读 · 0 评论 -
Java消息中间件相关面试题
1、topic和queue的区别2、如何保证消息的可达性和唯一消费3、为什么要使用消息中间件?一般说法:解耦与复用异步削峰参考原创 2020-03-23 18:23:05 · 552 阅读 · 0 评论 -
SpringBoot2.x中加载除application.properties资源文件方式
1、@PropertySource注解方式自定义资源文件custom.properties@Configuration@PropertySource(value = "custom.properties")public class EnvironmentTest implements CommandLineRunner{ @Value("${test.param1:}") ...原创 2020-03-23 00:03:40 · 272 阅读 · 0 评论 -
mybatis-plus-generate中VelocityEngine初始化失败问题
mybatis-plus-generate包中提供了逆向数据库的功能,其中用到了velocity模板引擎技术。但是发现直接main函数中运行逆向代码完全没问题,一旦我想打成jar发布运行就抛出如下异常。[Thread-5] ERROR org.apache.velocity - The specified class for ResourceManager (org.apache.velocit...原创 2020-03-22 20:34:42 · 2166 阅读 · 0 评论 -
ConcurrentHashMap底层原理学习(JDK1.8)
其实ConcurrentHashMap与HashMap非常相似,只是将一些操作变成个了线程安全的。下面看putval方法 final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); ...原创 2020-03-20 20:11:11 · 294 阅读 · 2 评论 -
Springboot2.x全局异常处理+参数校验+多语言
1、背景通常web项目是需要三者同时协调其作用的,例如业务抛出一个账号不能为空的异常,由全局异常处理捕获后返回多语言。2、多语言配置配置messageSource,指定多语言文件的路径@Configuration@ConfigurationProperties(prefix = "spring.i18n")public class I18nConfig { private S...原创 2020-03-20 19:38:44 · 2132 阅读 · 0 评论 -
ThreadLocal跨线程问题
1、问题通常复杂的处理流程中,我们会使用一些异步处理的手段,那么这种场景下ThreadLocal即可能出现获取失败的问题。public class ThreadLocalTest { public static void main(String[] args) { ThreadLocal<String> threadLocal = new ThreadLo...原创 2020-03-20 16:51:47 · 1323 阅读 · 0 评论 -
Springboot2.x中的hibernate-validator(2)POST请求
1、ConstraintViolationException与MethodArgumentNotValidException一般情况下我们会发现对GET请求的入参做参数校验时抛出ConstraintViolationException异常,而对POST请求的RequestBody做参数校验时会抛出MethodArgumentNotValidException异常。这与Spring中绑定GET参数...原创 2020-03-19 00:21:06 · 505 阅读 · 0 评论 -
Springboot2.x中的hibernate-validator(1)GET请求
1、自动配置springboot中早已默认集成hibernate-validator,首先看下自动配置是如何配置validator的。ValidationAutoConfiguration@Configuration( proxyBeanMethods = false)@ConditionalOnClass({ExecutableValidator.class})@Condit...原创 2020-03-18 22:00:26 · 826 阅读 · 0 评论 -
Java非关系型数据库Redis相关面试题
1、Redis常见数据结构String字符串、Hash、List、Set、Zset2、zset的底层实现ziplist/skiplist参考3、持久化方案RDB:默认,周期性的保存快照方式AOF:对每条写入命令作为日志记录,以append-only模式写入日志文件。参考4、rehashrehash是指对hash表进行扩容或收缩。为了让哈希表的负载因子(load factor...原创 2020-03-18 16:41:53 · 241 阅读 · 0 评论 -
ThreadLocal使用场景与原理分析
1、ThreadLocal变量线程局部变量,是每一个线程所单独持有的,其他线程不能对其进行访问。当使用ThreadLocal维护变量的时候,为每一个使用该变量的线程提供一个独立的变量副本,即每个线程内部都会有一个该变量,这样同时多个线程访问该变量并不会彼此相互影响,因此他们使用的都是自己从内存中拷贝过来的变量的副本, 这样就不存在线程安全问题,也不会影响程序的执行性能。2、使用场景每个线...原创 2020-03-18 15:42:09 · 4992 阅读 · 0 评论 -
Java关系型数据库相关面试题
1、手撕sql有学生表、课程表、成绩表,计算平均成绩大于等于60的学生id、学生姓名和平均成绩。select s.s_id,s.s_name,avg(sc.score)from score scleft join student s on sc.s_id=s.s_idgroup by s.s_id having avg(sc.score>=60)可能引发问题(1)几种join...原创 2020-03-16 21:37:10 · 448 阅读 · 0 评论 -
Java并发相关面试题
1、ConcurrentHashMap原理,如何保证线程安全参考使用CAS和synchronized保证线程安全2、红黑树原理参考3、synchronized(1)synchronized是可重入锁。可重入锁顾名思义表示可重新反复进入的锁,但仅限于当前线程。是为了解决自己锁死自己的情况。一个类中的同步方法调用另一个同步方法,假如 Synchronized 不支持重入,进入 meth...原创 2020-03-15 23:45:40 · 128 阅读 · 0 评论 -
HashMap底层原理学习(JDK1.8)
1、简介hashMap所继承或者实现的接口HashMap中有个Node的内部类,这其实就是一个单链表的结构和TreeNode,传说中的红黑树其他成员:transient Node<K,V>[] table; 存储hash节点的数组transient Set<Map.Entry<K,V>> entrySet; 将数组转为Set结构,方便keySe...原创 2020-03-15 00:30:14 · 177 阅读 · 0 评论 -
ArrayList底层原理学习
一直以来,ArrayList都是一个熟悉的陌生人一样的存在,用都会用,也知道底层是数组,再深入问细节就懵逼。1.构造方法public ArrayList()public ArrayList(int initialCapacity)public ArrayList(Collection<? extends E> c)jdk1.8中ArrayList的无参构造创建的是一个空数组,...原创 2020-03-14 19:20:32 · 158 阅读 · 0 评论 -
Arrays.asList创建的ArrayList并非java.util.ArrayList
项目中有遇到过对Arrays.asList生成的ArrayList进行add操作时报出UnsupportedOperationException异常。这是因为此ArrayList并非彼ArrayList。这里生成的ArrayList是Arrays的私有静态内部类。与java.util.ArrayList非常类似,都继承自AbstractList。但是仅重写了toArray、get、set、...原创 2020-03-14 16:21:59 · 214 阅读 · 0 评论 -
@RestControllerAdvice全局异常处理起作用的原理
0、首先定义一个简单的全局异常处理类@RestControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler public Object handle(Exception e) { return "error by my ExceptionHandler"; }}现在...原创 2020-03-13 23:37:59 · 3881 阅读 · 6 评论 -
钩子线程ShutdownHook
1. 什么是Java的钩子线程2. 应用场景JVM关闭时指定程序执行相应的动作,如在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。3. 栗子4. 钩子起作用的时机首先,要知道钩子并不是所有情况下都能起作用,在一些复杂的tomcat应用中钩子有可能并不会执行。应用得当钩子可能是个高大尚的东西,应用不当可能就是灾难,...原创 2020-02-07 18:14:16 · 206 阅读 · 0 评论