开发经验
文章平均质量分 58
凌兮~
技术是一种艺术,需要我们去发现
展开
-
spring常用的4种加载资源的前缀
‘classpath:’ 类路径中加载资源,可以加载所有classpath目录所包含的资源例 Resource fileClasspath = applicationContext.getResource("classpath:test.txt"); this.outResource(fileClasspath);‘file:’ 文件系统中加载资源,可以加载所有文件系统中有权限访问的资源例 Resource fileResource = applicationContext.ge.原创 2021-07-25 08:53:39 · 291 阅读 · 0 评论 -
Springboot线程池ThreadPoolTaskExecutor与@Async详解使用
Springboot整合ThreadPoolTaskExecutor线程池ThreadPoolExecutor: 这个是java自己实现的线程池执行类,基本上创建线程池都是通过这个类进行的创建ThreadPoolTaskExecutor:这个是springboot基于ThreadPoolExecutor实现的一个线程池执行类在springboot当中,根据官方文档官方文档的说明,如果没有配置线程池的话,springboot会自动配置一个ThreadPoolTaskExecutor线程池到bean当原创 2021-05-19 11:14:48 · 2784 阅读 · 1 评论 -
java线程池使用最全详解
线程池使用前言在执行一个异步任务或并发任务时,往往是通过直接new Thread()方法来创建新的线程,这样做弊端较多,更好的解决方案是合理地利用线程池,线程池的优势很明显,如下:降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;提高系统响应速度,当有任务到达时,无需等待新线程的创建便能立即执行;方便线程并发数的管控,线程若是无限制的创建,不仅会额外消耗大量系统资源,更是占用过多资源而阻塞系统或oom等状况,从而降低系统的稳定性。线程池能有效管控线程,统一分配、调优,提供资源原创 2021-05-18 15:16:22 · 76585 阅读 · 9 评论 -
Java中内部类与非公有类的区别
最近在看Java相关知识的时候发现Java中同时存在内部类以及非公有类概念,而且这两个类都可以不需要单独的文件编写,可以与其他类共用一个文件。现根据个人总结将两者的异同点总结如下,如有什么不当地方,欢迎大家指正。1、非公有类和内部类对应的文件名与这两种类的类名无关;2、一个源文件中可以包含多个非公有类或者内部类;3、非公有类不能使用public关键字(一般前面不加关键字),内部类可以使用public、private、protected关键字;4、非公有类中可以添加0到多个内部类;5、非公有类是包可翻译 2021-05-07 15:48:02 · 436 阅读 · 0 评论 -
RunTime.getRunTime().addShutdownHook()用法
前言Runtime.getRuntime().addShutdownHook(shutdownHook);这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。测试代码: /** * jvm关闭时的执行钩子函数测试 */ @Test public void shutDown原创 2021-05-06 17:56:30 · 421 阅读 · 0 评论 -
CopyOnWriteArrayList详解及使用
前言CopyOnWriteArrayList它是ArrayList的线程安全的变体,大概原理就是:初始化的时候只有一个容器,很长一段时间,这个容器数据,数量等没有发生变化的时候,大家(大多数线程)都是读取(假设这段时间里只发生读取操作)同一个容器中的数据,这样大家读取到数据都是唯一,一致,安全的,但是后来有人往里面增加了一个数据,这个时候CopyOnWriteArrayList底层实现添加的原理是先copy出一个容器(简称副本),再往新的容器里添加这个新的数据,最后把新的容器的引用地址赋值给之前旧的容器地原创 2021-04-28 00:34:11 · 5224 阅读 · 2 评论 -
DecimalFormat 基本使用(数字格式化)
前言在实际开发中,需要把数字显示固定一种格式,比如浮点型0.22或者千分位22,222,222,这时就可以用到java的DecimalFormat类去格式化。DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。DecimalFormat 包含一个模式 和 一组符号符号含义:0 一个数字#一个数字,不包括 0. 小数的分隔符的占位符, 分组分隔符的占位符; 分隔格式。-缺省负数前缀。% 乘以 100 和作为百分比显示? 乘以 1000 和作为千原创 2021-04-22 13:57:33 · 1659 阅读 · 0 评论 -
获取Spring的ApplicationContext几种方式
获取Spring的ApplicationContext几种方式获取Spring中的Bean方式常用的有五种,如下所示。方法1:在初始化时保存ApplicationContext对象ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId");注意:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。原创 2021-04-19 23:10:36 · 5723 阅读 · 0 评论 -
java 注解中元注解Inherited的使用方法
前言Inherited是标注元注解的意思的,使用此注解声明出来的自定义注解,如果注解在类上面,子类会自动继承此注解,不带有元注解的自定义注解,子类是无法继承父类上的类注解。谨记,使用@Inherited声明出来的注解,只有在类上使用才会有效,对方法和属性等其他无效。测试案例package com.lyj.demo.pojo.annotationTest;import java.lang.annotation.Inherited;import java.lang.annotation.Retent原创 2021-04-17 10:09:37 · 1773 阅读 · 0 评论 -
@PostConstruct与@PreDestroy使用
前言源码@Documented@Retention (RUNTIME)@Target(METHOD)public @interface PostConstruct {}@Documented@Retention (RUNTIME)@Target(METHOD)public @interface PreDestroy {}@PostConstruct@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。从源码可以看出,@PostConstru原创 2021-04-15 16:45:39 · 4502 阅读 · 0 评论 -
java深拷贝的几种方式
@PostConstruct 与@PreDestory使用源码:@Documented@Retention (RUNTIME)@Target(METHOD)public @interface PostConstruct {}@PostConstruct是java的注解,并不是Spring提供的注解,@PostConstruct注解是用来修饰一份非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次,PostCons原创 2021-04-14 10:38:46 · 16661 阅读 · 6 评论 -
transtent、volatile、final修饰符的正确使用
transient大家都知道对象只要实现了Serializable接口,这个对象就可以被序列化,序列化方式有两种方式: - 实现Serializable(自动序列化) - 实现Externalizable(没有自动序列化,需要自己指定某某序列化,具体使用,看后面案例) 只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密原创 2021-04-13 16:41:25 · 173 阅读 · 0 评论 -
TP90、TP95、TP99性能指标含义及计算
前言在性能测试中,我们经常会选择 TP90、TP95 或者 TP99 等水位线作为性能指标。首先,我们先解释一下 TP90、TP95 和 TP99 的含义:TP90,top percent 90,即 90% 的数据都满足某一条件;TP95,top percent 95,即 95% 的数据都满足某一条件;TP99,top percent 99,即 99% 的数据都满足某一条件;在这里,我们之所以说其“满足某一条件”,是因为在计算的时候,我们既可以向前计算也可以向后计算,例如:1, 2, 3, …,翻译 2021-04-09 13:52:19 · 8544 阅读 · 0 评论 -
如何减少长时间的 GC 停顿?
如何减少长时间的 GC 停顿?垃圾回收是非常重要的,但处理不好,反而会成为性能杀手,采用以下步骤确保GC停顿时间最少且最短,一般50ms以下。长时间的GC停顿对应用非常不友好,不仅影响服务的级别(SLA),而且用户的体验也会下降,对核心应用程序的服务造成不可估量的损害。以下针对各种原因进行分析及解决方法1.高速率创建对象如果应用程序的对象创建率很高,那么为了跟上它,垃圾回收率也会升高,高垃圾回收率也会增加GC停顿时间,因此,优化应用程序以创建更少的对象是减少GC停顿的有效策略,但它是个耗时工作,并原创 2021-04-01 18:22:56 · 516 阅读 · 0 评论 -
GC日志分析神器-GCEasy详解
前言GCEasy是一款非常好用的在线分析GC日志的工具,打开官网,直接上传gc日志,也可以更加上门的要求进行压缩上传。JVM memory size(jvm内存大小区域)JVM memory size ,GCEasy展示了年轻代、老年代、元空间。JVM给分配的大小和程序运行过程中使用的峰值大小。从JVM memory size展示的信息,我们可以判断是否需要做下面的几件事情。是否需要修改JVM内存(-Xms、-Xmx、-Xmn…)相关配置,比如年轻代和老年代峰值远远小于分配的大小,这个时候我原创 2021-04-01 17:22:32 · 10064 阅读 · 0 评论 -
JVM的GC日志详解分析及配置(一)
JVM GC日志参数案例:2021-03-25T13:00:41.631+0800: 4.013: [GC (Allocation Failure) [PSYoungGen: 419840K->20541K(472064K)] 419840K->20573K(996352K), 0.0118345 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]详细内容如下:2021-03-25T13:00:41.631+0800:GC发生的时间点。原创 2021-03-31 16:24:28 · 979 阅读 · 0 评论 -
JConsole远程连接
JConsole是基于JMX的可视化监视、管理工具。可以很方便的监视本地及远程服务器的java进程的内存使用情况。下面介绍如何连接远程服务器,进行远程java程序的监控。1、使用hostname -i 查看远程主机的hostname。如果显示为 127.0.0.1,需要进行修改。vim /etc/hosts修改127.0.0.0.1 为服务器真实的外网ip。2、被监控的程序运行时给虚拟机添加一些运行的参数无需认证的远程监控配置-Dcom.sun.management.jmxremote.p翻译 2021-03-26 10:05:39 · 2162 阅读 · 0 评论 -
JMX详解及JConsole使用
JMXJMX(Java Management Extensions)是一个应用程序植入管理功能的框架,是一套标准的代理和服务,服务是JDK官方提供的Java程序性能监控程序。支持远程访问,支持扩展,即自定义监控的性能参数。提供网络、API、客户端三个层次的调用。实际上,Java平台使用JMX作为管理和监控的标准接口,任何程序只要按JMX规范访问这个接口,就可以获取所有的管理和监控信息。常用的运维监控如Zabbix、Nagios等工具对JVM本身的监控都是通过JMX获取的信息。应用场景中间件软件WebL原创 2021-03-25 15:08:55 · 1292 阅读 · 2 评论 -
fastjson SerializerFeature详解
依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version></dependency>SerializerFeature属性原文链接翻译 2021-03-24 15:57:39 · 340 阅读 · 0 评论 -
IntelliJ IDEA 高级调试技巧及多线程调试技巧
一、条件断点二、回到"上一步"三、多线程调试四、远程调试五、临时执行表达式/修改变量的运行值条件断点条件断点就是当满足某个条件(通常是表达式)时,debug断点才会生效;这在循环中debug是非常有用的;例如我们想要在循环体中调试:当某个变量满足某个条件时,需要断点调试,来查看详细的执行流程及变化情况。我们说过,IDEA中的debug功能是非常强大的,要使用条件断点也非常简单,下面这张图片中 Condition中的内容代表当name为eamon:23时,程序执行到断点处停下来。在断点的红原点处原创 2021-03-24 15:22:23 · 2350 阅读 · 0 评论 -
Windows安装配置Gradle
选择菜单栏的File->Open。在打开的窗口选择对应Gradle项目的build.gradle文件,然后点击OK。3. 在Open Project窗口中,点击Open as Project。4. 在Import from Gradle窗口,配置你的Gradle项目,然后点击ok。5. 在Open Project窗口,点击Open Existing Project按钮。6. 最后,在New Project窗口根据自己需要选择This Window或New Window即可。..原创 2021-03-23 19:52:25 · 358 阅读 · 1 评论 -
idea如何从gitlab上拉取项目到本地
1 点击 VCS > Checkout from Version Control > Git2原创 2021-03-23 19:09:39 · 6141 阅读 · 2 评论 -
Java Stream流之求和
BigDecimal:BigDecimal bb =list.stream().map(Plan::getAmount).reduce(BigDecimal.ZERO,BigDecimal::add);int、double、long:double max = list.stream().mapToDouble(User::getHeight).sum();原创 2021-03-23 18:50:59 · 1715 阅读 · 0 评论 -
Java生成十位时间戳(当天零点和当前时间)
/** * 获取当天的零点时间戳(13位) * * @return 时间戳 */ public static long getZeroPointDate() { // 获取今天零点时间戳 long nowTime = System.currentTimeMillis(); long dailyStartTime = nowTime - ((nowTime + TimeZone.getDefault().g...原创 2021-03-23 18:35:20 · 3946 阅读 · 0 评论 -
intellij idea 生成可执行jar 运行提示没有主清单属性
第一步 file–>project structure 弹框后选中Atifacts—> + ---->jar---->from module with dependenceis第二步 选择一个Main Class,然后指定META-INF/MANIFEST.MF的路径为src下(注意不要放到main/java目录下,否则打成的jar中META-INF/MANIFEST.MF不含有Main Class信息)第三步 点击apply —》 OK...原创 2021-03-23 17:30:23 · 236 阅读 · 0 评论 -
Springboot启动maven和gradle项目的几种方式
前言在大家学习java过程中,都知道StringBuilder是线程不安全的,StringBuffer是线程安全的,但StringBuilder比StringBuffer效率高,那到底是怎么安全的呢?测试代码 public static void main(String[] args) { StringBuilder builder = new StringBuilder(); StringBuffer buffer = new StringBuffer();原创 2021-03-22 15:53:27 · 1046 阅读 · 0 评论 -
JVM内存模型及类加载运行机制
前言:getCausepublic Throwable getCause()返回此 throwable 的 cause;如果 cause 不存在或未知,则返回 null。(该 Cause 是导致抛出此 throwable 的throwable。)此实现返回由一个需要 Throwable 的构造方法提供的 cause,或者在创建之后通过 initCause(Throwable) 方法进行设置的 cause。虽然通常不需要重写此方法,但子类可以重写它,以返回一个通过某些其他方式设置的 cause。这适用原创 2021-03-22 14:51:44 · 443 阅读 · 0 评论 -
IDEA启动项目或者Debug调试启动系统较慢
@Autowired作用在普通方法上,会在注入的时候调用一次该方法,如果方法中有实体参数,会对方法里面的参数进行装配,并调用一次该方法。这个可以用来在自动注入的时候做一些初始化操作。package com.lyj.demo.components;import com.lyj.demo.service.StudentService;import org.springframework.beans.factory.annotation.Autowired;import org.springframew原创 2021-02-23 13:46:07 · 325 阅读 · 0 评论 -
SpringBoot2.0读取yml配置文件的值(application.yml)
由于项目需要,我们有时候会把一些动态的参数配置放置在yml文件里,例如外围系统的url,然后对其进行访问。这个时候,就需要在SpringBoot2.0下读取YML文件的属性值maven依赖<!-- 支持 @ConfigurationProperties 注解 --> <dependency> <groupId>org.springframework.boot</groupId> &原创 2021-02-05 13:48:55 · 877 阅读 · 0 评论 -
Map集合中value()方法与keySet()、entrySet()区别
在Map集合中values():方法是获取集合中的所有的值----没有键,没有对应关系,KeySet():将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取keyentrySet():Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。 Map.Entry表示映射关系。entrySet():迭原创 2021-02-05 13:39:15 · 229 阅读 · 0 评论 -
ApplicationEvent和ApplicationListener的使用(事件发布和责任链模式)
spring的事件(ApplicationEvent)为bean和bean之间的消息通信提供了支持。当bean处理完一个事件之后,希望另一个bean能够知道并做相应的处理。这时另一个bean监听当前bean所发送的事件。spring的事件流程如下:自己的event需要继承 ApplicationEvent,并且写相应的构造函数定义一个监听器listener,实现ApplicationListener接口,重写onApplicationEvent方法使用ApplicationContext容器发布事原创 2021-02-05 11:28:15 · 997 阅读 · 1 评论 -
Jackson 框架的高阶应用
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社 区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一 。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jacks原创 2021-02-05 10:56:19 · 299 阅读 · 0 评论 -
springboot 启动没有日志
操作:1、修改日志等级,找到logback-boot.xml文件2、找到 ,修改日志等级,添加标准输出<root level="INFO"> <appender-ref ref="STDOUT"/></root>3、就可以了。翻译 2021-02-04 16:54:08 · 1504 阅读 · 1 评论 -
Java修饰符 transient,volatile,final使用原则
Java 修饰符transient参考链接transient,意为短暂的,瞬时的。我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不翻译 2021-02-04 15:31:57 · 300 阅读 · 0 评论 -
SpringBoot的Bean之@ConditionalOnBean与@ConditionalOnClass
bean的条件注入,除了前面一篇博文中介绍的通过@Conditional注解配合Condition接口的实现之外,还提供了更多简化的注解使用方式,省略了自己实现Condtion接口,本篇博文主要介绍下面几个常用的注解使用方式@ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnClass@ConditionalOnMissingClassI. Bean的存在与否作为条件当Bean不存在时,创建一个默认的Bean,在Spring的生态中翻译 2021-02-04 09:34:21 · 1100 阅读 · 0 评论 -
Spring之@Nullable、@NonNull注解
@NonNull可以标注在方法、字段、参数之上,表示对应的值不可以为空@Nullable注解可以标注在方法、字段、参数之上,表示对应的值可以为空以上两个注解在程序运行的过程中不会起任何作用,只会在IDE、编译器、FindBugs检查、生成文档的时候有做提示;我使用的IDE是STS,不会做自动的检查,只有安装了FindBugs插件并运行后会做对应的提示...原创 2021-02-04 09:11:58 · 935 阅读 · 0 评论 -
fastjson 对象转json报错
ionException将对象转为json时报错com.fasterxml.jackson.databind.exc.InvalidDefinitionException:No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable原创 2021-02-03 13:20:01 · 491 阅读 · 0 评论 -
@Repository和@Mapper注解的区别
@Mapper@Mapper注解是mybatis的注解,是用来说明这个是一个Mapper,对应的xxxMapper.xml就是来实现这个Mapper。然后再server层使用@Autowired注解引用进来,会出现这样的情况,但是并不影响使用。这是因为@Autowired是spring的注解,提示找不到相应的bean。如果有强迫症的同学,可以使用@Resource注解,因为这个是JDK的注解。@Repository@Repository注解是Spring的注解,使用该注解和@Autowired注原创 2021-02-03 11:13:26 · 2029 阅读 · 0 评论 -
JAVA性能优化:35个小细节让你提升代码的运行效率(java面试)
1.鼓励使用java8的函数式进行开发,主意其不变性特性。说明:函数式开发在多核服务器上运行效率跟核数呈正相关,而传统java代码是没有此特性的。2.推荐使用IDEA作为开发工具,git作为版本控制工具。说明:IDEA作为当前最强大的java开发工具,其效率,性能,智能都是目前顶尖的,开发人员需要克服一下由传统的eclipse,sts,myeclipse转变到idea的不适应。3.IDEA安装lombok插件,在每个实体类上加上lombok的注解:@Data, @Builder,@NoArgsCo原创 2021-02-03 10:29:22 · 739 阅读 · 1 评论 -
long(Long)与int(Integer)之间的转换
/** * long(Long)与int(Integer)之间的转换 */ @Test public void typeTest() { // 一.将long型转化为int型,这里的long型是基础类型: long a = 10; int b = (int) a; System.out.println(b); // 二.将Long型转换为int 型的,这里的Long型是包装类型: ...原创 2021-02-03 09:29:33 · 401 阅读 · 0 评论