Java
文章平均质量分 89
刘水镜
【欢迎阅读我的最新专栏——《SpringBoot趣味私房课》https://www.imooc.com/read/75】【欢迎加入「开发者」技术交流群:168965372】【群链接:https://jq.qq.com/?_wv=1027&k=Inxd5Aa9】
展开
-
比你更懂你的自动配置
上一篇我们从 run() 方法切入,分析了 Spring 容器的启动流程。今天我们拿 @SpringBootApplication 注解开刀,我们来看看这个注解为我们做了什么。可以看到,@SpringBootApplication 是一个组合注解。原创 2023-03-12 17:30:05 · 316 阅读 · 1 评论 -
为啥一个 main 方法就能启动项目
在 Spring Boot 出现之前,我们要运行一个 Java Web 应用,首先需要有一个 Web 容器(例如 Tomcat 或 Jetty),然后将我们的 Web 应用打包后放到容器的相应目录下,最后再启动容器。在 IDE 中也需要对 Web 容器进行一些配置,才能够运行或者 Debug。而使用 Spring Boot 我们只需要像运行普通 JavaSE 程序一样,run 一下 main() 方法就可以启动一个 Web 应用了。这是怎么做到的呢?原创 2023-03-05 11:58:05 · 5187 阅读 · 1 评论 -
(文末有彩蛋,不看白不看)兑现一下之前答应读者的事
大家过年好呀!(我)明天就要开工上班啦!在假期的最后一天踢了会球,简单吃点东西,晚上来兑现答应一位读者的事情。开整!前情提要这篇文章缘起于「开发者」技术交流群中一位读者遇到的问题:简单来说,就是 Spring Boot 3 + Swagger3 的组合用之前的方式配置有问题。趁着假期还在,咱们把问题解决了,也算是兑现之前的承诺。问题重现我们先来复现一下这位读者描述的问题,首先下载《Spring Boot趣味实战课》Swagger 章节的相关源码:https://github.com/liush原创 2023-01-30 15:59:31 · 366 阅读 · 1 评论 -
Volatile:JVM 我警告你,我的人你别乱动!
Volatile 的意思是,易变的,动荡不定的,反复无常的。volatile 的作用就是告诉 JVM,被我修饰的变量它非常善变,你要给我盯好了,一旦有风吹草动要立马通知大家;另外,你不要自作聪明的调整它的位置(为了性能重排序),它可是说翻脸就翻脸的主儿。最后,留一个小问题:内存可见性的那个程序中,就算 flag 没有被 volatile 修饰,线程顶多不是第一时间读到 flag 的修改,但也不应该一直读不到呀,这是为啥?这太反直觉了!开动你的脑筋思考一下吧!...原创 2022-08-08 11:10:20 · 339 阅读 · 1 评论 -
为什么 ThreadLocal 可以做到线程隔离?
ThreadLocal的get()方法其实和set()方法逻辑很相似,先从当前线程的threadLocals属性中取,如果该属性为null,那么就初始化。OK,从效果上看,ThreadLocal确实是线程隔离的,那么,它是如何做到线程隔离的呢?当线程结束时,会调用当前线程实例的exit()方法,将threadLocals设置为null,以便垃圾回收器将其回收掉。进入到两个方法内部后发现,不管执行哪个分支,最终是把值保存到了当前线程的threadLocals属性中。...原创 2022-07-25 09:30:00 · 385 阅读 · 2 评论 -
Java 程序在 JVM 中是怎样执行的?(一定要看到最后)
代码很简单,一个类,main()方法调用a()方法,a()方法中定义了一个int变量a,然后调用b()方法,b()方法中new了一个User对象b。一个方法被执行的时候,会创建一个栈帧,用来存放局部变量表、方法出口等信息。堆堆可谓是与程序员打交道最多的一块区域了,也是JVM中最大的一块内存区域了。面向对象的核心成员就是对象和对象的行为(也就是方法),而堆和栈刚好是管着两块儿的。b()方法执行结束,b变量销毁,断开对User实例的引用,出栈。.........原创 2022-07-16 19:20:07 · 788 阅读 · 4 评论 -
上个厕所的功夫,就把定时任务的三种调度策略说得明明白白
Spring Task 无疑是 Spring 环境下单机定时任务的首选。它用起来非常简单,功能也够用。Spring Task 有三种模式,分别是:fixedDelay、cron 和 fixedRate。话不多说,我们先看代码:这三种模式的用法都很简单,使用方式也很类似。那么它们究竟有什么不同呢?下面我们通过一个五星级豪华公测的故事来说明一下。话说某地有一个五星级豪华厕所,大家都喜欢来这里如厕。因此坑位经常供不应求,需要排队如厕。一天,厕所外有四个人排队,每个人如厕需要的时间如下:从第一个人开始如厕进行计时原创 2022-07-03 18:35:57 · 1946 阅读 · 1 评论 -
一个99%的人都说不清楚知识点——Spring 事务传播行为
面试过很多人,大部分都能把事务的四个特性及隔离级别说得七七八八,但当问到 Spring 的传播行为时,就基本上没人能说出个一二三了。我们都知道,一个事务要么成功,要么失败。但当若干个事务配合完成一个复杂任务时,就不能简单的这样一刀切了。我们需要根据任务之间的亲疏关系来指定哪些任务需要联动回滚,哪些任务即使失败也不会影响其他任务。要解决这个问题,就需要了解事务的传播行为了。Spring 中有七种事务的传播行为,如下表所示:Spring 可以通过 @Transactional 注解的 propagation 属原创 2022-06-28 20:14:17 · 460 阅读 · 4 评论 -
面试官:生产环境中 CPU 利用率飙高怎么办?
生产环境中 CPU 利用率飙高的情况该如何排查?你是否在面试的时候也被问到过类似的问题呢?今天,我们就一起研究一下。问题排查让 CPU 燥起来首先,我们需要让 CPU 燥起来。写一个死循环来疯狂占用 CPU 资源:public class CPU { public static void main(String[] args) { Thread thread = new Thread(() -> { while (true) {原创 2022-03-25 22:39:54 · 1228 阅读 · 1 评论 -
写了那么多 Java 代码,却不一定见过它的真面目
我们都知道那句著名的宣传语——「一次编写, 到处运行(Write Once, Run Anywhere)」,这是对 Java 平台无关性的精准概括。字节码 + JVM 使其平台无关,与此同时也衍生出另一个无关性——语言无关性。像 Kotlin、Groovy、Scala、Clojure、JRuby 等语言都可以运行在 JVM 之上。理论上只要能将源代码编译成符合 JVM 规范的字节码,任何语言都可以在 JVM 中运行。字节码是连接语言和 JVM 的关键桥梁,今天我们就一起聊聊这个关键人物。概览我们创建.原创 2022-02-02 14:52:49 · 2184 阅读 · 1 评论 -
Spring Boot 整合各种常用技术的代码都在这了
SwaggerJUnitSpring MVCRestFul APISpring Data JPAMyBatisTransactionRedisRedis LockDruidLog BackGlobal ExceptionSpring TaskDevtoolsActuatorGitHub 地址原创 2020-06-16 08:40:08 · 822 阅读 · 2 评论 -
菜鸟译文——JDK6和JDK7中substring()方法的对比
substring(int beginIndex, int endIndex)方法在JDK6和JDK7中是不同的。了解他们的区别可以让我们更好的使用这个方法。方便起见,以下用substring() 代替 substring(int beginIndex, int endIndex)。 1. substring()做了什么?substring(int beginIndex, int en...翻译 2015-03-31 22:55:33 · 1674 阅读 · 7 评论 -
菜鸟学Java——搭建一个完整的Java开发环境
作为一个Java程序员,配置一个java开发环境是必备的技能,今天给广大菜鸟初学者补上一课。环境的配置,大概就分三个1,JDK 2,Tomcat(或者其他的)3,eclipse(或者myeclipse)。下面我们就一个一个慢慢配置。 配置JDK编写Java程序需要建立Java开发环境,其中Sun的Java SDK是必不可少的。可以去Sun的官网下载,在此不再赘述。安装好SDK后需要简单...原创 2013-09-09 21:58:09 · 4049 阅读 · 23 评论 -
菜鸟学SSH——提高用户体验之404处理
只要做过WEB开发人对于“404”已经再熟悉不过了吧。当我们访问的资源不存在时,它就会跑出来跟你打招呼啦。但是默认情况下,404页面比较简陋,不是很友好。而且一般用户不知道404是个神马东东,还以为是程序写的有问题呢。这样一来用户体验就打折扣了。所以通常情况下,我们都需要对这些常见的错误进行处理。 Tomcat默认的404页 为了提升用户体验,我们需要简单的配置一下,来让...原创 2014-10-29 17:11:45 · 4126 阅读 · 14 评论 -
菜鸟学Java——如何更好的进行单元测试——JUnit
测试在软件生命周期中的重要性,不用我多说想必大家也都非常清楚。软件测试有很多分类,从测试的方法上可分为:黑盒测试、白盒测试、静态测试、动态测试等;从软件开发的过程分为:单元测试、集成测试、确认测试、验收、回归等。 在众多的分类中,与开发人员关系最紧密的莫过于单元测试了。像其他种类的测试基本上都是由专门的测试人员来完成,只有单元测试是完全由开发人员来完成的。那么今天我们就来说说什么是单元测试...原创 2014-06-18 21:23:32 · 47773 阅读 · 17 评论 -
菜鸟学SSH——基于注解的SSH将配置精简到极致
很早之前就想写一篇关于SSH整合的博客了,但是一直觉得使用SSH的时候那么多的配置文件,严重破坏了我们代码整体性,比如你要看两个实体的关系还得对照*.hbm.xml文件,要屡清一个Action可能需要对照applicationContext*.xml和struts*.xml文件。总之过多的配置文件坏破坏代码的整体性,会打乱代码的连续性,因为很多情况下你需要一边看Java代码,一边看xml的配置,采...原创 2014-08-19 08:22:27 · 29670 阅读 · 32 评论 -
菜鸟学SSH——Spring事务管理
Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作。今天一起学习一下Spring的事务管理。Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如...原创 2013-12-17 17:33:41 · 28872 阅读 · 28 评论 -
菜鸟要做架构师——java性能优化之for循环
完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的。今天就来说一下java代码优化的事情,今天主要聊一下对于for(while等同理)循环的优化。作为三大结构之一的循环,在我们编写代码的时候会经常用到。循环结构让我们操作数组、集合和其他一些有规律的事物变得更加的方便,但是如果我们在实际开发当中运用不合理,可能会给程...原创 2014-11-27 18:06:13 · 36810 阅读 · 40 评论 -
菜鸟学Java——Java内存分析
我们常说的Java内存主要分为四大块(寄存器不在考虑之内,我们无法用代码来操控它):stack(栈)、heap(堆)、data segment(数据区)、code segment(代码区)。它们的主要用途如下图所示: 而在上面四个当中,我们经常谈论的是右边那两个家伙——stack和heap。今天我们就来聊聊Java代码在运行的过程中,在stack和heap中到底是什么样子的...原创 2014-11-30 13:52:12 · 4489 阅读 · 19 评论 -
菜鸟学SSH——Hibernate动态模型+JRebel实现动态创建表
项目用的是SSH基础框架,其中有一些信息很类似,但又不尽相同。如果每一个建一个实体的话,那样实体会太多,如果分组抽象,然后继承,又不是特别有规律。鉴于这种情况,就打算让用户自己配置要添加的字段,然后生成对应的表。需要动态配置的部分实例:上图只是一小部分,一个一个组合起来大概有三百多。每一项对应一个实体,显然不好,就算是按照规律归归类还是有不少,于是就想到了在运行期来确定这些...原创 2014-10-20 10:39:11 · 5491 阅读 · 9 评论 -
菜鸟学Java——WEB项目测试好帮手,Maven+Jetty
做WEB开发,测试是一件很费时间的事情。所以我们就应该用更简单、更快捷的方式进行测试。今天就向大家介绍一个轻量级的容器——jetty。今天说的etty是Maven的一个插件jetty-maven-plugin,与Maven配合起来使用非常的方便,它的配置也非常的简单,下面我们就看看它怎么用吧! 在pom.xml 文件的<project>标签下加入如下代码:<buil...原创 2014-05-30 08:07:44 · 4392 阅读 · 20 评论 -
菜鸟学Java——重新认识泛型
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 规则和限制1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容...原创 2014-10-28 02:35:12 · 4732 阅读 · 15 评论 -
菜鸟好文推荐(十五)——9个基于Java的搜索引擎框架
在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友欢心,你也会在百度上寻找正规的整容医疗机构(尽管有很大一部分广告骗子)。那么如果在你自己开发的网站系统中需要能让用户搜索一些重要的信息,并且能以结构化的结果展现给用户,下面分享的这9款Java搜索引擎框架或许就可以帮助到你了。1、Java 全文搜索引擎框架 Lu原创 2015-08-31 22:24:57 · 4973 阅读 · 3 评论 -
菜鸟学Java——JSP内置对象之request
书接上回,上次跟大家概括的说了说JSP的九种常用内置对象。接下来就该聊聊它们各自的特点了,今天先说说request吧。下面是request的一些常用方法: isUserInRole(String role):判断认证后的用户是否属于逻辑的role中的成员。getAttribute(String name):返回name指定的属性值,如不存在则返回null。getAtt...原创 2013-07-09 20:11:01 · 3478 阅读 · 19 评论 -
菜鸟学Spring Cloud——创建服务提供者(Eureka)
书接上回软件环境Windows 10JDK 1.8IDEA 2018.2Spring Boot 2.1.0.RELEASESpring Cloud Greenwich.M1步骤创建工程创建工程的具体步骤在上回书中已经详细展示,这里就不赘述了,只是在选择依赖的环节稍有不同,这次需要分别选择左侧Web中的Web依赖和左侧Cloud Discovery中的Eureka Discov...原创 2018-11-06 09:18:22 · 1661 阅读 · 6 评论 -
菜鸟学Spring Cloud——创建注册中心(Eureka)
文章目录扯一扯软件环境步骤创建工程pom文件配置声明为注册中心属性配置yamlproperties坑效果下集预告扯一扯以下内容将引起极度舒适,请在女朋友的陪同下观看。什么?你没有女朋友?哦,不好意思,我忘了,程序员是没有女朋友的。那就好好学习吧,女朋友总会有的。软件环境Windows 10JDK 1.8IDEA 2018.2Spring Boot 2.1.0.RELEASESpr...原创 2018-11-03 10:27:55 · 6974 阅读 · 4 评论 -
菜鸟带你看源码——看不懂你打我ArrayList源码分析(基于java 8)
文章目录看源码并不难软件环境成员变量:构造方法核心方法看源码并不难如何学好编程?如何写出优质的代码?如何快速提高自己的编程能力?等等一系列的问题下面,我们通常都会看到一个相同的答案——看源码。But,每次点开JDK的源代码,不到五分钟就又关上了。为啥呢?因为看不懂,因为太枯燥等等。总结成一句话就是——看源码是一件很痛苦的事情。其实,之所以觉得看源码很痛苦,看不下去,不是因为源码太难。其实写J...原创 2018-10-23 11:25:57 · 3432 阅读 · 7 评论 -
菜鸟学Spring Boot——简单到令人发指的CRUD
前情提要上回书说到,用Spring Boot写了一个Hello World小例子,那么今天就来完成上篇结尾留下的增删改查的实例。软件环境Windows 10JDK 11IDEA 2018.2Maven 3.5.4MySQL 8.0.12代码pom文件中需要添加一下依赖:&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springfra原创 2018-10-16 09:59:52 · 1318 阅读 · 1 评论 -
菜鸟学Spring Boot——Hello Spring Boot
闲聊本文的目的是让没接触过Spring Boot感受一下它令人发指的方便、快捷、高效率,第一次接触Spring Boot是在16年上半年的事情了,那时候还在日企工作,当时正准备重构一个老项目,太君将Spring Boot引入了进来。那时候Spring Boot在国内还没有太多人用呢,如今它早已火得一塌糊涂。初次见面就被它简洁高效深深吸引,时隔两年多才来跟大家分享,深感惭愧!闲言碎语不要讲,表一...原创 2018-10-15 09:04:00 · 748 阅读 · 2 评论 -
菜鸟调错——POI导出Excel报错No such file or directory
POI 3.8版本导出excel问题 使用poi 3.8版本导出excel时,在本地和测试环境都是好使的,但是部署到线上环境(linux+tomcat)后直接报错,报错日志如下:java.lang.RuntimeException: java.io.IOException: No such file or directory at org.apache.poi.xssf.strea原创 2016-09-12 10:10:53 · 11653 阅读 · 6 评论 -
菜鸟学习JVM——垃圾回收算法
Java垃圾回收算法所有的垃圾回收算法都是为了解决三个问题: * 哪些内存需要回收 * 什么时候回收 * 怎么回收引用计数法(Reference Counting) 引用计数法原理很简单,给每个对象分配一个计数器,当被引用时就加一,引用失效就减一。计数器为零时,则说明该对象不可能再被使用。引用计数法效率不错,大部分情况下是个不错的算法,但它有一个非常明显的缺点,就是无法回收互相引用的对象,从原创 2016-05-20 00:34:54 · 7463 阅读 · 12 评论 -
菜鸟学SSH——Hibernate核心接口
在使用Hibernate的时候,我们通常都会用的Configuration、SessionFactory、Session、Transaction、Query和Criteria等接口。通过这些接口可以,不仅可以存储与取出持久化对象,还可以对事务进行管理。下面对着几个接口一一介绍:几个接口之间的层次关系如下图: Configuration:Configuration是Hiberna...原创 2014-02-22 19:17:14 · 3712 阅读 · 24 评论 -
菜鸟学习JVM——分代回收
分代回收上篇文章介绍了几种垃圾回收的算法,但这些算法当中并没有一个是完美的,可以代替其他所有算法,他们各自有各自的优势。因此JVM需要根据垃圾回收对象的特性,选择合适的回收算法。JVM中大部分对象的生命周期非常短,朝生夕灭;还有一些对象,他们的生命周期很长,有的甚至长生不老、寿与JVM齐。于是就有了分代的概念。分代新生代(Young Generation) +Eden +原创 2016-05-24 14:56:21 · 7842 阅读 · 12 评论 -
菜鸟学设计模式——小单例有大秘密
单例模式大家并不陌生,也都知道它分为什么懒汉式、饿汉式之类的。但是你对单例模式的理解足够透彻吗?今天我带大家一起来看看我眼中的单例,可能会跟你的认识有所不同。下面是一个简单的小实例://简单懒汉式public class Singleton { //单例实例变量 private static Singleton instance = null; //私有化的构造方法,保证......原创 2013-06-17 08:58:56 · 21746 阅读 · 179 评论 -
菜鸟调错——启动Tomcat报错“Unsupported major.minor version xxx ”
最近项目更新JDK,由之前的1.7更新到1.8。下载并安装好新的JDK以后,编译、启动Tomcat的时候,报错了,提示:“Unsupported major.minor version xxx ”。具体解决的过程就不在这详细说明了。跟大家分享一下解决方案吧。 首先,出现这个错误是因为编译的JDK版本,跟运行时所用的JDK版本不一致所导致的。所以解决方案就是统一JDK的版本。具体如下:1...原创 2016-01-19 00:35:49 · 7456 阅读 · 8 评论 -
菜鸟调错——Hibernate 4.3.x 注解常见错误及解决方案
编程的过程免不了遇到各种错误,各种问题,而遇到问题,解决问题的这个过程我认为是最让人兴奋的事情。越棘手的问题,解决以后带来的快感也越大。当一个问题你搞了一下午或者一天,甚至几天,当你解决的那一刻你会觉得你又获得了重生。甚至会感觉此时此刻整个世界都是你的。啊哦,扯的有点远了。言归正传,今天我们要说的是关于Hibernate的一些常见错误。大家都知道Java项目更新一个版本可能与之前的版本有很大的...原创 2014-09-16 21:34:12 · 9165 阅读 · 14 评论 -
译文——Java中的继承和组合
阅读英文的能力对于程序员来说,是很重要的。这几年也一直在学习英文,今天心血来潮,就在网上找了一篇简短的博文翻译一下。水平一般,能力有限,还请各位看官多多指点。译文:本文将会举例说明Java中继承和组合的概念。首先举一个继承的例子,然后展示一下如何用组合来改善继承的设计。最后概括一下如何在它们之间做出选择。1. 继承假设我们有一个Insect类。这个类包含两个方法:一个是...翻译 2014-08-09 08:08:55 · 3574 阅读 · 5 评论 -
菜鸟学Java——Jboss瘦身
大家在用Jboss的时候可能跟我一样,觉得Jboss启动实在太慢!比起Tomcat几乎秒启的速度,Jboss几乎让人无法忍受。加上本人电脑配置比较低,Jboss启动最快的时候也是一分多钟,慢的时候四分多钟!这实在是太让人抓狂了。而且为了避免缓存的影响,会经常重启Jboss,这就导致调试程序的时间有很大一部分花在了Jboss的启动上。这显然是很不科学的,其实我们可以通过精简Jboss里面的包以及配置...原创 2014-01-28 14:46:13 · 4310 阅读 · 16 评论 -
菜鸟学Java——Jboss简介
简介JBoss是全世界开发者共同努力的成果,一个基于J2EE的开放源代码的应用服务器。 因为JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用它,而不用支付费用。2006年,Jboss公司被Redhat公司收购。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3.0的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,...原创 2014-01-15 09:05:58 · 5624 阅读 · 25 评论 -
菜鸟学SSH——Struts2国际化手动切换版
国际化(internationalization,i18n)和本地化(localization,l10n)指让产品(出版物,软件,硬件等)能够适应非本地环境,特别是其他的语言和文化。程序在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。 国际化原理:国际化资源文件:用不同国家的语言描述相同的信息,并放在各自对应的.properties属性文件中,程序根据运行时环境决定加载哪...原创 2013-11-20 08:03:12 · 12079 阅读 · 41 评论