![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 81
Meiko丶
这个作者很懒,什么都没留下…
展开
-
String的长度限制
String的长度限制想要搞清楚这个问题,首先我们需要翻阅一下String的源码,看下其中是否有关于长度的限制或者定义。String类中有很多重载的构造函数,其中有几个是支持用户传入length来执行长度的:public String(byte bytes[], int offset, int length) 可以看到,这里面的参数length是使用int类型定义的,那么也就是说,String定义的时候,最大支持的长度就是int的最大范围值。根据Integer类的定义,java...原创 2022-01-24 11:04:57 · 3475 阅读 · 0 评论 -
Spring Boot Admin
Spring Boot Admin(SBA)是一个开源的社区项目,用于管理和监控 Spring Boot 应用程序。应用程序可以通过 http 的方式,或 Spring Cloud 服务发现机制注册到 SBA 中,然后就可以实现对 Spring Boot 项目的可视化管理和查看了。Spring Boot Admin 可以监控 Spring Boot 单机或集群项目,它提供详细的健康 (Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Sprin...转载 2022-01-19 16:25:11 · 181 阅读 · 0 评论 -
java合成图片
场景前端有一个神器——canvas,这个画布标签可以处理各种图片的合成,可以精确到图片的具体坐标,加水印,去水印,简直不要太简单!那java后端可以处理吗?请大声的告诉他,能,必须能!今天小编告诉你一个神器——image-combiner,合成图片so easy!环境jdk1.8 spring boot搭建引入pom文件<dependency> <groupId>com.freewayso</groupId> <artifa转载 2022-01-19 16:07:24 · 925 阅读 · 0 评论 -
Mac 下 IDEA 中 SpringBoot 如何利用 DevTool 开启热部署
一、首先 pom.xml 中 依赖 和 构建 部分 二、IDEA 配置 注意这一步一定不要改错地方,认准 IntelliJ IDEA -> Preferences…三、退出 IDEA 编辑器,重启项目应用 配置很简单,一定要注意,特别是操作2 ,认准配置设置的地方认准 IntelliJ IDEA -> Preferences…...转载 2022-01-19 11:13:41 · 296 阅读 · 0 评论 -
springboot banner
PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛新年新气象,别光顾着打扮自己,也要打扮下自己吃饭的家伙SpringBoot的banner你在SpringBoot服务每次启动的时候是不是都能看到下面输出的日志(默认的图案格式) . ____ _ __ _ _ /\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )___ | '_ | '_| | '_ / _` | \ \ \ \...转载 2022-01-19 09:47:20 · 11436 阅读 · 0 评论 -
SpringBoot集成Druid
Druid是一个阿里开源的连接池组件加⼊了日志监控,不需要额外的界面开发详细介绍可以看官方文档:https://www.alibabacloud.com/help/zh/doc-detail/72987.htm在springboot 2.0 以上默认都是使⽤用Hikari数据源, Hikari与Druid都是当前⽐比较优秀的数据源com.alibaba.druid.pool.DruidDataSource 基本配置参数如下:连接池运行原理连接池初始化的时候按照initialSi.原创 2022-01-14 16:53:46 · 1831 阅读 · 0 评论 -
mybatis的#{}占位符和${}拼接符
#{}占位符:占位使用#{}意味着使用的预编译的语句,即在使用jdbc时的preparedStatement,sql语句中如果存在参数则会使用?作占位符,我们知道这种方式可以防止sql注入,并且在使用#{}时形成的sql语句,已经带有引号,例,select * from table1 where id=#{id} 在调用这个语句时我们可以通过后台看到打印出的sql为:select * from table1 where id=‘2’ 加入传的值为2.也就是说在组成sql语句的时候把参数默认为字符串。原创 2022-01-14 09:58:51 · 2650 阅读 · 0 评论 -
maven 详解
最近做了个项目,但是这个项目需要 30 多个 jar包。他只能从网上一个个去下载,下载完还要一个一个手动导e好不容易搞完了,结果却发现有些 jar 包版本竟然不兼容,搞了一天也没搞好。真的是“豆腐拌腐乳-越搞越糊涂!。”经过一个多月的疯狂加班,这个项目终于做好了,张三部署好测试环境之后就交给测试人员李四了。张三想着终于能好好摸鱼了,谁知道李四工作特认真,一会就测出来一堆 bug。张三只能立即去更改 bug,改完还要手动编译、打包项目。最多的时候一天打包了十几次,可把张三累坏了。...转载 2022-01-12 15:16:23 · 930 阅读 · 0 评论 -
获取spring容器对象,初始化bean,自定义bean Scope,FactoryBean,自定义类型转换,Enable开关等
一 如何获取spring容器对象1.实现BeanFactoryAware接口@Servicepublic class PersonService implements BeanFactoryAware { private BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.be转载 2022-01-12 12:16:51 · 1356 阅读 · 1 评论 -
SpringBoot+RabbitMQ 实现 RPC 调用
说到 RPC(Remote Procedure Call Protocol 远程过程调用协议),小伙伴们脑海里蹦出的估计都是 RESTful API、Dubbo、WebService、Java RMI、CORBA 等。其实,RabbitMQ 也给我们提供了 RPC 功能,并且使用起来很简单。今天松哥通过一个简单的案例来和大家分享一下 Spring Boot+RabbitMQ 如何实现一个简单的 RPC 调用。注意关于 RabbitMQ 实现 RPC 调用,有的小伙伴可能会有一些误解,心想这还转载 2022-01-11 11:13:09 · 1076 阅读 · 0 评论 -
ForkJoinPool
本文的主要目的是介绍 ForkJoinPool 的适用场景,实现原理,以及示例代码。说在前面可以说是说明,也可以说下面是结论:ForkJoinPool 不是为了替代 ExecutorService,而是它的补充,在某些应用场景下性能比 ExecutorService 更好。ForkJoinPool 主要用于实现“分而治之”的算法,特别是分治之后递归调用的函数,例如 quick sort 等。ForkJoinPool 最适合的是计算密集型的任务,如果存在 I/O,线程间同步,sleep() 等会转载 2022-01-10 19:53:46 · 833 阅读 · 0 评论 -
AtomicReference,AtomicStampedReference
AtomicReference1、使用场景:解决并发修改多个属性说到CAS理论,在java中我们第一个就想到了atomic类,一般常见的有AtomicInteger、AtomicBoolean等java.util.concurrent包下面的类,但是这个只能并发修改一个属性,如果我需要对多个属性同时进行并发修改,并且保证原子性呢?AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普原创 2022-01-06 10:27:56 · 817 阅读 · 0 评论 -
6个延时队列的实现方案
【编者的话】个人比较喜欢一些实践类的东西,既学习到知识又能让技术落地,能搞出个demo最好,本来不知道该分享什么主题,好在最近项目紧急招人中,而我有幸做了回面试官,就给大家整理分享一道面试题:“如何实现延时队列?”。下边会介绍多种实现延时队列的思路,文末提供有几种实现方式的GitHub地址。其实哪种方式都没有绝对的好与坏,只是看把它用在什么业务场景中,技术这东西没有最好的只有最合适的。延时队列的应用什么是延时队列?顾名思义:首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,也就是说..转载 2021-12-23 15:34:33 · 1016 阅读 · 0 评论 -
秒杀设计的注意点
高并发下如何设计秒杀系统?这是一个高频面试题。 这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功。这类活动商家绝大部分是不赚钱的,说白了是找个噱头宣传自己。虽说秒杀只是一个促销活动,但对技术要求不低。下面给大家总结一下设计秒杀系统需要注意的9个细节。掌握了这些,以后就可以和面试官好好聊一聊了。转载 2021-12-23 14:34:36 · 475 阅读 · 0 评论 -
SpringBoot整合Ehcache缓存
一、Ehcache介绍EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP API等特点。主要的特性有: 快速 简单 多种缓存策略 缓存数据有两级:内存和磁盘,因此无需担心原创 2021-12-23 12:15:55 · 552 阅读 · 0 评论 -
Mybatis-Plus整合多数据源
提出问题在平时开发中,经常会遇到在一个项目里需要使用多个数据源的情况,比如有一部分数据在数据源A,另一部分数据在数据源B,业务需要把这两部分的数据做合并然后从接口返回。又或者操作完数据源A后,需要切换数据源,操作数据源B。这样的需求,怎么实现?解决问题其实在mybatis-plus就有相关的实现,是一个基于SpringBoot快速集成多数据源的启动器。首先要搭建一个springBoot+Mybatis+Mybatis-Plus的项目,搭建项目就不演示了,比较简单。这里讲怎么使用多数据源,转载 2021-12-22 18:35:17 · 2546 阅读 · 0 评论 -
Dubbo 实战
一 为什么需要 dubbo很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮助的,那么,dubbo是怎么被提上日程的呢?在互联网的发展过程中,在以前,我们只需要一个服务器,将程序全部打包好就可以,但是,随着流量的增大,常规的垂直应用架构已无法应对,所以,架构就发生了演变。1 单一应用架构2 应用和数据库单独部署3 应用和数据库集群部署4原创 2021-12-17 14:40:40 · 1126 阅读 · 0 评论 -
springboot整合dubbo
一、本文示例说明1.1 框架版本Dubbo 版本<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.5</version></dependency>复制代码Spring Boot 版本<p转载 2021-12-17 14:37:52 · 488 阅读 · 0 评论 -
java参数校验的一些工具
一、前言今天和小伙伴们分享一个常用的工具类,共计四个方法,使用场景比较广泛,有用于校验某个对象或对象中指定属性为空值时,直接返回异常,常用语校验前端请求参数;也有当值不为空时,执行指定动作,可减少大量的if条件,如:mybatis请求参数设置;还有用于判断当值不为空时,替代为新值,完成后续动作。这样描述可能不够清晰,这里花哥列举了几个使用场景,更多的场景需要小伙伴们根据自己业务需求合理使用。//场景一,点击登录时,后端校验用户名if(StringUtils.isEmpty(name)){转载 2021-12-07 14:40:39 · 1262 阅读 · 0 评论 -
@ControllerAdvice,@ExceptionHandler,ResponseBodyAdvice
最近偶然间在看到 Spring 官方文档的时候,新学到一个注解 @ControllerAdvice,并且成功使用这个注解重构我们项目的对外 API 接口,去除繁琐的重复代码,使其开发更加优雅。展示具体重构代码之前,我们先来看下原先对外 API 接口是如何开发的。这个 API 接口主要是用来与我们 APP 交互,这个过程我们统一定义一个交互协议,APP 端与后台 API 接口统一都使用 JSON 格式。另外后台 API 接口对 APP 返回时,统一一些错误码,APP 端需要根据相应错误码,在页面弹转载 2021-12-06 14:12:07 · 590 阅读 · 0 评论 -
springboot日志
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupI.原创 2021-12-01 10:42:09 · 274 阅读 · 0 评论 -
Mybatis plus的多数据源@DS切换为什么不起作用了,谁的锅,@Transactional
由于使用了微服务,会有多个数据库的情况,有时业务需要,需要切换数据源,所以使用了Mybatis plus的@DS来切换多数据源yml数据库配置如下:spring: datasource: dynamic: primary: master datasource: master: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://user ...转载 2021-11-30 17:36:37 · 1202 阅读 · 0 评论 -
try-with-resource
在stackoverflow偶尔看到的一个关于try()...catch()的用法,通常我们使用try...catch()捕获异常的,如果遇到类似IO流的处理,要在finally部分关闭IO流,当然这个是JDK1.7之前的写法了;在JDK7优化后的try-with-resource语句,该语句确保了每个资源,在语句结束时关闭。所谓的资源是指在程序完成后,必须关闭的流对象。写在()里面的流对象对应的类都实现了自动关闭接口AutoCloseable;与JDBC编程一样,程序里打开的文件IO资源不属于内存里原创 2021-10-26 11:45:02 · 639 阅读 · 0 评论 -
内部类解析
一、什么是内部类?在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性 定义方式一致。一个内部类的例子:public class Outer { private int radius = 1; public static int count = 2; public Outer() { } class inner{ public void visitOuter() { .原创 2021-10-21 17:35:35 · 151 阅读 · 0 评论 -
float和double不适合做商品金额的运算原因分析
先看现象涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子:典型现象(一):条件判断超预期System.out.println(1f==0.9999999f);//打印:falseSystem.out.println(1f==0.99999999f);//打印:true 纳尼?典型现象(二):数据转换超预期floatf=1.1f;doubled=(double...原创 2021-10-21 11:45:16 · 551 阅读 · 0 评论 -
类加载的时机
类加载时机什么情况需要开始类加载过程的第一阶段:加载?Java虚拟机规范中并没有进行强制约束,这点可以交给虚拟机的具体实现来自由把握。但是对于初始化阶段,虚拟机规范则严格规定了以下几种情况必须立即对类进行初始化,如果类没有进行过初始化,则需要先触发其初始化。创建类的实例为了验证类加载,我们先配置一个JVM参数-XX:+TraceClassLoading 监控类的加载复制代码在IDE配置如下:demo代码:public class Clas..原创 2021-10-20 11:54:43 · 761 阅读 · 0 评论 -
MySQL之char、varchar和text的设计,int(3)与int(10)
MySQL之char、varchar和text的设计最近有表结构设计中出现了varchar(10000)的设计引起了大家的讨论,我们下面就来分析分析。首先我们先普及一下常识:1、char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节。2、同时char和varchar最...转载 2019-09-06 16:59:39 · 272 阅读 · 0 评论 -
Java 开发最容易写的 10 个bug
错误一:Array 转换成 ArrayListArray 转换成 ArrayList 还能出错?这是哪个笨。。。。。。等等,你先别着急说,先来看看是怎么回事。如果要将数组转换为 ArrayList,我们一般的做法会是这样List<String> list = Arrays.asList(arr);复制代码Arrays.asList() 将返回一个 ArrayList,它是 Arrays 中的私有静态类,它不是 java.util.ArrayList 类。如下图所示转载 2021-10-12 10:35:13 · 129 阅读 · 0 评论 -
lambda表达式详解
Lambda 表达式− Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)Lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。先看几个例子:1.使用lambda表达式实现Runnable2.使用lambda表达式实现Comparator...原创 2021-10-09 15:00:04 · 804 阅读 · 0 评论 -
安全对外的接口--加签验签
前言我们在求职面试中,经常会被问到,如何设计一个安全对外的接口呢? 其实可以回答这一点,加签和验签,这将让你的接口更加有安全。接下来,本文将和大家一起来学习加签和验签。从理论到实战,加油哦~密码学相关概念 加签验签概念 为什么需要加签、验签 加密算法简介 加签验签相关API 加签验签代码实现 公众号:捡田螺的小男孩本文已经收录到个人github,文章有用的话,可以给个star呀:github.com/whx123/Java…密码学相关概念明文、密文、密钥、加密、解密原创 2021-10-09 11:41:35 · 1452 阅读 · 0 评论 -
Collections.sort简介
第9版《Java核心技术卷Ⅰ》的第607页介绍了一个方法:Collections类中的sort方法可以对实现了List接口的集合进行排序。这个方法假定列表元素实现了Comparable接口。 查看Java官方文档可知,sort方法有两种重载形式。第一种重载是:static <T extends Comparable<? super T>> void sort(List<T> list) 根据官方文档的描述,这个方法将列表元素进行升序..原创 2021-09-09 15:04:43 · 12627 阅读 · 0 评论 -
jvm垃圾回收
一:概述程序计数器、虚拟机栈、本地方法栈,3个区域随着线程的生存而生存的。内存分配和回收都是确定的。随着线程的结束内存自然就被回收了,因此不需要考虑垃圾回收的问题。而Java堆和方法区则不一样,各线程共享,内存的分配和回收都是动态的。因此垃圾收集器所关注的都是这部分内存。接下来我们就讨论Jvm是怎么回收这部分内存的。在进行回收前垃圾收集器第一件事情就是确定哪些对象还存活,哪些已经死去。下面介绍两种基础的回收算法。1.1 引用计数算法给对象添加一个引用计数器,每当有一个地方引用它时计数器就+1原创 2021-08-23 18:15:47 · 271 阅读 · 0 评论 -
Java RMI
java本身提供了一种RPC框架——RMI(即RemoteMethodInvoke远程方法调用),在编写一个接口需要作为远程调用时,都需要继承了Remote,Remote接口用于标识其方法可以从非本地虚拟机上调用的接口,只有在“远程接口”(扩展java.rmi.Remote的接口)中指定的这些方法才可远程使用,下面通过一个简单的示例,来讲解RMI原理以及开发流程: 为了真正实现远程调用,首先创建服务端工程rmi-server,结构如下: 代码说明: 1.User.j...原创 2021-08-19 17:48:32 · 113 阅读 · 0 评论 -
Java 位操作
在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。位操作基础基本的位操作符有与、或、异或、取反、左移、右移这6种,它们的运算规则如下所示:符号 描述 运算规则 & 与 两个位都为 1 时,结果才为 1 I 或 两个位都是 0 时,结果才为 0 ^ 异或 两个位相同时为 0,相异为 1 ~ 取反 0 变 1,1 变 0 <<转载 2021-08-19 15:51:57 · 234 阅读 · 0 评论 -
jvm内存分区和TLAB
JVM回顾 JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area)运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。程序计数器(Program Counter Register)线...原创 2021-08-17 16:49:10 · 337 阅读 · 1 评论 -
springboot配置文件的加载位置和优先级
1.springboot配置文件的加载位置1.1 springboot启动会扫描一下位置的application.properties或者application.yml作为默认的配置文件工程根目录:./config/工程根目录:./classpath:/config/classpath:/加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容,形成互补配置也可以通过指定配置spring.config.location来改变默认配置,一般在项目已经打包原创 2021-08-13 18:37:18 · 518 阅读 · 0 评论 -
springboot ApplicationEvent和ApplicationListener
1前言在springboot启动的过程中会产生一系列事件,我们开发的时候可以自定义一些事件监听处理器.根据自己的需要在针对每个事件做一些业务处理.2Application Eventsspringboot 启动的时候会按顺序产生如下几种事件:1ApplicationStartingEvent :springboot应用启动且未作任何处理(除listener注册和初始化)的时候发送ApplicationStartingEvent 2ApplicationEnvironmentPrepared原创 2021-08-13 16:44:52 · 855 阅读 · 0 评论 -
Springboot中的@EnableAsync和@Async
在我们的日常开发中,我们偶尔会遇到在业务层中我们需要同时修改多张表的数据并且需要有序的执行,如果我们用往常的同步的方式,也就是单线程的方式来执行的话,可能会出现执行超时等异常造成请求结果失败,及时成功,前端也需要等待较长时间来获取响应结果,这样不但造成了用户体验差,而且会经常出现请求执行失败的问题,在这里我们一般会采用3种方式来处理,如下所示:在采用三种方式之前,我们所有来观察一下使用同步的方式实现的结果:1.我们定义一个TestController,如下所示:@RestController原创 2021-08-13 15:05:02 · 639 阅读 · 1 评论 -
CommandLineRunner和ApplicationRunner
前言:Spring Boot如何解决项目启动时初始化资源,在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等。为了达到这个目的,我们需要使用CommandLineRunner或ApplicationRunner接口创建bean,spring boot会自动监测到它们。这两个接口都有一个run()方法,在实现接口时需要覆盖该方法,并使用@Component注解使其成为bean。CommandLineRunner和Application原创 2021-08-13 11:47:32 · 1889 阅读 · 0 评论 -
java之program arguments与VM arguments
program arguments 中的值作为 args[] 的参数传入的,而 VM Arguments 是设置的虚拟机的属性。program arguments 是要传给你的应用程序的,它通过主函数中的 args 来传值。 VM arguments是系统的属性,要传给 java 虚拟机的。如图:是eclipse中的参数传递public class Test1 { public static void main(String[] args){//空格分隔 .转载 2021-08-13 11:16:08 · 1305 阅读 · 0 评论