202108-08 手把手教你怎么创建spring项目 创建Spring项目通过spring.io生成初始代码,配置如下下载好会得到一个.zip文件,解压导入IDEA就可以开始了,这是基础的项目结构让我们打开src/main/java/geektime/spring/hello/hellospring/HelloSpringApplication.java,修改成如下代码packagegeektime.spring.hello.hellospring;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springfra... 继续阅读 >
202108-08 详解记录Java Log的几种方式 目录一、System.out.println(最简单)二、java.util.logging(相对简单)三、log4j(最强大)四、commons-logging(全称:JakartaCommonsLogging)五、slf4j(全称:SimpleLoggingFacadeforJava,简单日志门面)在Java中记录日志的方式有如下几种:一、System.out.println(最简单)1、输出到控制台:System.out.println("XXX");2、输出到指定文件:importjava.io.PrintStream;PrintStreamps=newPrintStream("D:\\tes... 继续阅读 >
202108-08 Java并发编程之ThreadLocal详解 目录一、什么是ThreadLocal?二、ThreadLocal的使用场景三、如何使用ThreadLocal四、数据库连接时的使用五、ThreadLocal工作原理六、小结七、注意点一、什么是ThreadLocal?ThreadLocal叫做线程本地变量,ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,则每个线程都可以访问自己内部的副本变量。二、ThreadLocal的使用场景1.当对象进行跨层传递的时候,使... 继续阅读 >
202108-08 Java微信授权登陆的实现示例 前提:微信公众平台:注册微信认证的公众号也就是服务号,拥有跟高级权限的微信接口。(注册服务号需要一些企业信息,需自己或者公司解决)注:2018年12月起订阅号不能认证升级为服务号。但可以将你的订阅号迁移至另一个公众号,需300元费用。准备公众号的:APPID与 APPSECRET二、服务号注册成功后,如果项目也有服务号的公众号平台,跟项目负责人沟通将你个人的微信号添加为服务号的管理找到左边导航栏最下面的基本配... 继续阅读 >
202108-08 java进阶之了解SpringBoot的配置原理 目录一、SpringBoot的特点二、了解容器的功能三、原配置文件的引入四、自动配置原理五、修改默认配置(约定大于配置)六、总结一、SpringBoot的特点首先我们要知道SpringBoot在底层已经为我们添加好了很多依赖。比如我们常用的Tomcat,Spring,SpringMVC这些,甚至连mysql数据库的依赖也为我们添加好了不过SpringBoot2.5.0使用的mysql依赖版本是8.0.25的,如果还在使用mysql5版本的小伙伴们就需要在项目的pom.xml文件中... 继续阅读 >
202108-08 浅谈JAVA并发之ReentrantLock 目录1.介绍2.源码剖析2.1上锁(获取资源)2.2释放资源2.3公平锁与非公平锁的区别1.介绍结合上面的ReentrantLock类图,ReentrantLock实现了Lock接口,它的内部类Sync继承自AQS,绝大部分使用AQS的子类需要自定义的方法存在Sync中。而ReentrantLock有公平与非公平的区别,即'是否先阻塞就先获取资源',它的主要实现就是FairSync与NonfairSync,后面会从源码角度看看它们的区别。2.源码剖析Sync是ReentrantLock控制同步的基础。... 继续阅读 >
202108-08 Java虚拟机JVM类加载机制(从类文件到虚拟机) 目录一、类加载机制简介二、类加载机制过程 2.1、加载(Load)2.2、连接(Linking)2.3、初始化(Initialize)三、类加载器Classloader 3.1、类加载器简介3.2、类加载器分类3.3、双亲委派一、类加载机制简介什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位... 继续阅读 >
202108-08 又又???UG啦!理智分析Java NIO的ByteBuffer到底有多难用 目录一、前言二、API三、Netty的数据容器3.1工作原理四、内存池化五、字节级操作六、引用与释放一、前言ByteBuf是Netty当中的最重要的工具类,它与JDK的ByteBuffer原理基本上相同,也分为堆内与堆外俩种类型,但是ByteBuf做了极大的优化,具有更简单的API,更多的工具方法和优秀的内存池设计。二、APINetty的数据处理API通过两个组件暴露——抽象类ByteBuf和接口ByteBufHolder。ByteBufAPI的优点:它可以被用户自定... 继续阅读 >
202108-08 java boolean占用内存大小说明 答案:4B或1B详细1、如果boolean是单独使用:boolean占4个字节。2、如果boolean是以boolean数组形式使用:boolean占1个字节解释1、JVM没有提供boolean类型专用的字节指令,而是使用int相关指令来代替。2、对boolean数组的访问与修改,会共用byte数组的baload和bastore指令。分析结论上面的第一个结论是说:boolean在底层实际调用int,那么既然int占4个字节,boolean页自然占4个字节。即boolean类型占4个字节。上面的第2个结论是说... 继续阅读 >
202108-08 java如何用递归方法求阶乘 java用递归方法求阶乘一个正整数的阶乘,是所有不大于该数的正整数的积,并且0的阶乘为1,n的阶乘写作n!,由1808年基斯顿·卡曼(ChristianKramp,1760~1826)引进这个表示法。java代码://用递归方法求阶乘publicclassFactorial{publicstaticvoidmain(String[]args){intN=5;for(intn=0;n<=N;n++){intfact=factorial(n);System.out.println(n+"的阶乘值是... 继续阅读 >
202108-08 Java 程序员掌握 Spring Boot非常有必要 SpringBoot从天而降SpringBoot是企业级开发的整体整合解决方案,在现在企业项目开发中使用非常普遍,SpringBoot2.0的推出又激起了一阵学习SpringBoot热潮,给企业开发带来了巨大的变革,可以说现在是Java程序员到了必须学习SpringBoot的时候。Spring已经足够好了?Spring框架真的太好了,任何一个java开发用过之后都会像上瘾一样,爱不释手。会在遇到新问题的时候,或者找到某一个方法的时候,都会去看一下spring是不是已... 继续阅读 >
202108-06 浅谈java安全编码指南之死锁dead lock 目录不同的加锁顺序使用private类变量使用相同的Order释放掉已占有的锁不同的加锁顺序我们来看一个不同加锁顺序的例子:publicclassDiffLockOrder{privateintamount;publicDiffLockOrder(intamount){this.amount=amount;}publicvoidtransfer(DiffLockOrdertarget,inttransferAmount){synchronized(this){synchronized(target){if(amount<transferAmount... 继续阅读 >
202108-06 详解java安全编码指南之可见性和原子性 目录不可变对象的可见性保证共享变量的复合操作的原子性保证多个Atomic原子类操作的原子性保证方法调用链的原子性读写64bits的值不可变对象的可见性不可变对象就是初始化之后不能够被修改的对象,那么是不是类中引入了不可变对象,所有对不可变对象的修改都立马对所有线程可见呢?实际上,不可变对象只能保证在多线程环境中,对象使用的安全性,并不能够保证对象的可见性。先来讨论一下可变性,我们考虑下面的一个例子:publicfin... 继续阅读 >
202108-06 浅谈java安全编码指南之堆污染 目录产生堆污染的例子更通用的例子可变参数产生堆污染的例子有同学可能会问了,既然JDK5引入了泛型,为什么还会出现堆污染呢?这是一个好问题,让我们看一个例子:publicvoidheapPollution1(){ListnormalList=Arrays.asList("www.flydean.com",100);List<Integer>integerList=normalList;}上面的例子中,我们使用Arrays.asList创建了一个普通的List。这个List中包含了int和String两种类型,当我们将List赋值给List的... 继续阅读 >
202108-06 java并发编程工具类JUC之LinkedBlockingQueue链表队列 java.util.concurrent.LinkedBlockingQueue是一个基于单向链表的、范围任意的(其实是有界的)、FIFO阻塞队列。访问与移除操作是在队头进行,添加操作是在队尾进行,并分别使用不同的锁进行保护,只有在可能涉及多个节点的操作才同时对两个锁进行加锁。队列是否为空、是否已满仍然是通过元素数量的计数器(count)进行判断的,由于可以同时在队头、队尾并发地进行访问、添加操作,所以这个计数器必须是线程安全的,这里使用了一个... 继续阅读 >
202108-06 浅谈java object对象在heap中的结构 目录对象和其隐藏的秘密Object对象头数组对象头整个对象的结构对象和其隐藏的秘密java.lang.Object大家应该都很熟悉了,Object是java中一切对象的鼻祖。接下来我们来对这个java对象的鼻祖进行一个详细的解剖分析,从而理解JVM的深层次的秘密。工具当然是使用JOL:@Slf4jpublicclassJolUsage{@TestpublicvoiduseJol(){log.info("{}",VM.current().details());log.info("{}",ClassLayout.parseClass(... 继续阅读 >