Java生态
文章平均质量分 68
Java生态
波波老师
初心易得,始终难守!愿成长的路上不忘初心!
展开
-
slf4j+logback源码加载流程解析
performInitialization()方法表示执行初始化,点进去会调用到LoggerFactory的bind方法,如下代码所示。然后点进去,会走到LoggerFactory的getILoggerFactory方法,如下代码所示。StaticLoggerBinder类加载时会执行初始化,如下代码所示。如上述代码所示,在项目中通常会这样创建一个Logger对象去打印日志。原创 2023-12-30 17:42:08 · 910 阅读 · 0 评论 -
浅谈设计模式之装饰器、代理、工厂方法模式
带你读懂几种常见的设计模式 第二弹今天的文章继续介绍设计模式。上一弹中介绍了简单工厂模式和策略模式,本文将介绍装饰器模式、代理模式和工厂方法模式。1、装饰器模式装饰模式的思想是:层层包裹。包裹就是装饰,那到底什么是层层包裹呢?有什么实际例子吗?java的io模块中采用了这一种思想,比如下面这段代码。BufferedReader reader =newBufferedReader(newInputStreamReader(newFileInputStream("F:...原创 2020-12-31 13:09:18 · 357 阅读 · 0 评论 -
浅谈设计模式之单例模式、适配器模式、抽象工厂模式
带你读懂几种常见的设计模式 第三弹本文已经是设计模式系列的第三篇文章了,今天来讲讲单例模式、抽象工厂模式和适配器模式。1、单例模式单例模式让一个类最多只有一个实例。具体的做法是: 让类的构造方法私有化 提供一个用于获取该类实例的静态公共方法给别的类访问 如果是在多线程的环境下,还要考虑线程安全性,防止产生多个实例 单例模式有多种实现方式: 饿汉式 懒汉式 双重检查锁 静态内部类 1.1、饿汉式饿汉.原创 2020-12-31 13:24:24 · 556 阅读 · 0 评论 -
浅谈设计模式之简单工厂、策略模式
带你读懂几种常见的设计模式 第一弹1、设计模式的六大原则单一职责原则 每个类的职责尽量单一。这个在实际项目中很难做到。 开闭原则 对扩展开放,对修改关闭。这个原则还是很重要的。 里氏代换原则 只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。这个原则挺不好理解的。 依赖倒转原则 针对接口编程,依赖于抽象而不依赖于具体。 接口隔离原.原创 2020-12-31 12:59:12 · 347 阅读 · 0 评论 -
MBG真香 Spring Boot集成Mybatis Generator插件
!-- Java接口和实体类生成路径targetMapperPackage是生成的接口包名targetModelPackage是生成的实体类包名-->原创 2020-05-23 11:51:32 · 1217 阅读 · 1 评论 -
mybatis工作原理
一、相较于Hibernate,mybatis的优势在哪里?Hibernate缺点:1、运行效率低,内存占用比较严重2、针对单一对象的增删改查,适合Hibernate,而Hibernate在批量操作时处于弱势3、虽然Hibernate引入一二级缓存、lazyload、查询缓存等更多优化空间(对于那些改动 不大且经常使用的数据,可将他们放入缓存中),但Hibernate对于持久层封装过...原创 2018-09-07 12:36:30 · 16230 阅读 · 6 评论 -
mybatis if标签判断参数map中是否存在某个key
<!-- 动态更新--> <update id="updateBook" parameterType="map"> update book <trim prefix="set" suffixOverrides=","> <if test="_parameter.containsKey('bookName...原创 2018-10-28 10:38:28 · 13166 阅读 · 3 评论 -
Mybatis递归查询实践
在我们开发企业应用时,有这样一种常见的业务场景:有一张数据库表,里面保存着所有的报表(也可以是其它实体)与报表分类,表的关键列如下所示:列名含义id主键name报表名称或分类名称pid父ID,当父ID为null时为顶级目录由于分类是可以无限层级的(实际上不超过10层),因此该表实际上存储的是一个树结构,即一个目录下面可以有多个目录或报表,类似于操作系统的文件系统现有如下问题:当我们已知报表ID时,如果查找该报表上面的所有层级目录?首先依靠一条SQL是很难查原创 2022-02-18 22:33:17 · 1058 阅读 · 0 评论 -
最详细的mybatis结合mysql和oracle批量增删改
最近总结了一下mybatis框架结合mysql数据库和oracle数据库的批量增删改语句在sql映射文件中的写法,批量操作的重要性就不必强调了,这里主要以实战为主,废话不多说,直接上代码!1、准备工作1、实体类public class Book implements Serializable{ private int id; private String bookName; p...原创 2018-08-29 12:08:16 · 1357 阅读 · 0 评论 -
mybatis xml开发实战
1、使用sql标签和include标签<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.asiainfo.bi.icmp.common.dao.mapper.SampleDataMapp原创 2020-06-15 18:00:08 · 335 阅读 · 0 评论 -
mybatis-plus入门教程
1、引入依赖(springboot工程)<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version> </dependency>2、定义实体类import com.baomidou.m.原创 2020-05-23 18:21:30 · 492 阅读 · 0 评论 -
BIO、NIO、AIO三种IO模型的理解
本文将对三种IO模型做简单的介绍和总结。1、BIO模型我们都知道,在做Java网络编程时,服务端的accept方法和read是阻塞的,直到有新连接进来或有数据可以读取,在阻塞期间线程不能干别的事情,这就是传统的BIO(blocking-io,同步阻塞IO)模型,显而易见,BIO模型在高并发场景下会面临服务端线程数过多浪费系统资源和频繁上下文切换问题。BIO模型图如下:2、NIONIO,no blocking-io,或new io,是同步非阻塞IO。这里介绍一下什么是同步,什么是阻塞:同步指原创 2022-03-27 20:36:04 · 2289 阅读 · 0 评论 -
Java NIO三大组件Buffer、Channel、Selector保姆级教程 附聊天室核心代码
1、NIO简介NIO(non-blocking IO或new IO),是同步非阻塞IO.关于BIO、NIO和AIO的原理与区别请看我写的这篇文章:BIO、NIO、AIO三种IO模型的理解 本文只介绍NIO三大组件的原理及使用。NIO三大组件分别是:Buffer、Channel、Selector,是JDK1.4提供的新API,NIO相关的类都放在java.nio包下,且对java.io包下BIO相关的很多类进行了改写。NIO是面向缓冲区(或面向块的),而BIO是面向流(字符流或字节流)的。数据读取到一原创 2022-04-05 19:53:00 · 1607 阅读 · 0 评论 -
用Java Swing+NIO实现了一个C/S聊天室程序 支持群聊私聊功能
说明这篇文章,或者说我实现的这个C/S模式的聊天项目,主要是为了方便大家学习Java NIO的。由于NIO的优势在于单机能处理的并发连接数高,因此特别适合用于聊天程序的服务端。为什么使用Java Swing来做UI界面呢?虽然我们大家都知道,Java Swing现在已经过时了,并且Java的优势不在于图形界面,但我的需求并不需要漂亮美观的界面,并且Java语言实现C端界面的首选就是Java Swing了,只不过我只用了相对简单的UI组件和组件交互逻辑,但这也足够了。效果演示话不多说,先来演示一下我做原创 2022-04-17 22:37:48 · 2082 阅读 · 3 评论 -
2022年Java中高级工程师200道精选面试题学会就能进大厂
你好,相信你一定能期待这份面试题,这份面试题是我花数个月整理出来的,内容涵盖了各方各面,特别是JVM、Mysql、多线程高并发、Redis、Spring这几个专题,是博主精心整理的亲身被面过的阿里、京东、虾皮、蚂蚁等一些大厂的面试题,学会进大厂真的不是梦!关注博主公众号,回复关键字“面试题”,即可免费拿到这份面试题!目录:1、面试题1、JVM2、集合3、多线程4、Redis5、消息队列6、Mysql7、Spring8、Mybatis9、设计模式10、计算机网络11、数据结构原创 2022-04-05 22:39:35 · 479 阅读 · 5 评论 -
精心整理200道最新Java中高级工程师高频面试题
你好,相信你一定很期待这份面试题,这份面试题是我花数个月整理出来的,内容涵盖了各方各面,特别是JVM、Mysql、多线程高并发、Redis、Spring这几个专题,是博主精心整理的亲身被面过的阿里、京东、虾皮、蚂蚁等一些大厂的面试题,学会进大厂真的不是梦!精彩内容截图:光看截图看不够?别急,下面即将解锁这200道面试题的题目与答案,想进大厂?靠它准没错!文章目录1、面试题1、JVM2、集合3、多线程4、Redis5、消息队列6、Mysql7、Spring8、Mybatis9、设计模式10、原创 2022-04-06 21:59:06 · 2003 阅读 · 0 评论 -
tomcat部署方式之修改server.xml文件部署
server.xml<?xml version="1.0" encoding="UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distribut...原创 2019-09-05 17:31:51 · 5091 阅读 · 0 评论 -
单点登录原理与实现
1、tomcat session原理1.1、什么是Session对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap;1.2、Session的目的Http协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session的主要目的就是为了弥补Http的无状...原创 2020-04-17 17:37:39 · 482 阅读 · 0 评论 -
JavaWeb跨域问题及解决方案
1、什么是跨域跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的1.) 资源跳转: A链接、重定向、表单提交2.) 资源嵌入: <link>、<script>、<img>、<frame>等dom标签,还有样式中background:url()、@font-face()等文件外链3.) 脚本请求: js发起的ajax...原创 2020-04-17 21:53:44 · 666 阅读 · 0 评论 -
dubbo xml配置解析入口源码分析
首先,dubbo是依赖于spring进行配置的,那么,配置dubbo的其中一种方式就是通过spring的applicationContext.xml文件。不过问题是,spring容器启动时,一般只会解析applicationContext.xml中spring自己认识的元素,如bean元素,并将其注册为beanDefinition,那么spring是如何识别dubbo元素的呢?如dubbo:service。原创 2022-10-08 09:00:00 · 1074 阅读 · 0 评论 -
fastjson序列化保留对象类型信息
一般的json框架在序列化对象时,会序列化对象的实例属性,而反序列化时,通常需要指定Class对象才能反序列化为原来的类型,但有时候我们无法手动指定Class对象,比如将一些自定义对象写入redis时,然后再从redis查的时候,就不能反序列化为某个具体写死的类型。因此,我调研了一下fastjson框架,发现它可以在序列化时保留对象类型信息,然后在反序列化时根据json字符串中的类型信息自动生成对象,用法很简单,只需要WriteClassName和SupportAutoType结合使用即可。原创 2022-12-19 19:02:41 · 1153 阅读 · 0 评论 -
浅谈IK中文分词器的使用
1、引入依赖<dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency>2、IKUtil工具类import com.asiainfo.biapp.aiop.web.product.config.原创 2020-07-07 16:42:55 · 843 阅读 · 0 评论 -
Java如何获取Process子进程的进程ID?
java可以通过Runtime.getRuntime().exec()执行一个操作系统的命令,在操作系统层面执行命令也就创建了一个进程,Java中用Process类表示进程,如何获取进程ID呢?Process是一个抽象类,然后它并没有直接为我们提供获取进程ID的属性或方法。下面来介绍一下在两种最常用的操作系统(windows、linux)上用Java执行本地命令后,如何获取对应的进程ID。原创 2022-09-24 19:18:21 · 2948 阅读 · 0 评论 -
Java后台管理应用:如何在树结构上做模糊查询?
开发企业后台管理应用时,经常会遇到一种场景:在树结构上做模糊查询。比如:公司组织架构树、分类树等,通常是在页面上的文本框中输入一个关键字,例如"数据",然后在公司组织架构树中过滤出名字包含数据的部门,且保持树结构不变。公司的一级部门、二级部门、三级部门等等,名字都有可能包含"数据",比如一级部门叫大数据部门,二级部门叫数据分析部门或数据开发部门等等,这些都是符合要求的。下面我将造出一个简单的分类树,并实现在树结构上模糊查询的功能(这里为了简单,将树的层级固定为三级,但实际上树的层级是未知的且远远不止三原创 2022-02-20 11:14:26 · 5214 阅读 · 21 评论 -
并发执行n个异步任务并获取它们的返回值,怎么实现?
在开发企业应用时,有如下这种常见的业务场景:假如现在有100个task,平均每个task执行耗时约为50ms,如果是串行执行,则100个task将耗时5s,这对于一个性能要求比较高的接口来说是灾难。因此,最简单的改造方式是并发执行。但我们要获取到这100个task的执行结果(少一个都不行),才行执行后续操作,如何实现?我总结了如下四种方式:通过Thread+FutureTask+Callable Task通过线程池+Callable Task通过CountDownLatch+Runnable原创 2022-02-19 20:47:40 · 1453 阅读 · 0 评论 -
关于lambda表达式不能处理递归这件事
为什么lambda表达式不能处理递归呢?因为lambda表达式本身就是匿名函数的写法,当函数名省略了之后,自己调用自己就比较困难了。可以利用反射机制获取Method对象递归调用自己,但是比较繁琐完全没必要。当我们既要用递归来解决问题又不想写一个单独的方法时,我们可以用函数式编程,但lambda表达式实现递归比较麻烦,因此我们干脆不用lambda表达式了,而用lambda表达式的退化版-匿名内部类。如下代码所示,使用匿名内部类计算阶乘。java.util.function.Function<In原创 2022-02-15 21:44:26 · 573 阅读 · 0 评论 -
如何优雅地使用StopWatch打印任务运行耗时?
StopWatch是一个专门用于在代码中统计并打印任务运行耗时的工具类,很多第三方Jar都内置了此类,比如Spring框架、Apache lang3、guava等。下面以Spring框架中的StopWatch为例,用代码介绍一下StopWatch的使用。// 可以给每个StopWatch实例起一个id,当输出多个StopWatch实例的信息时可以用此ID进行区分StopWatch watch = new StopWatch("watch1");// 同一时刻只能运行一个任务,即同一个S.原创 2021-12-25 20:19:59 · 1620 阅读 · 0 评论 -
Hibernate5.0 EntityManager转SqlQuery并返回Map结果集
Query query = entityManager.createNativeQuery("select * from message"); query.unwrap(org.hibernate.SQLQuery.class) .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);List<Map<Strin...原创 2019-05-16 17:24:09 · 1652 阅读 · 1 评论 -
centos7安装java
1、首先将java8的linux版本压缩包通过ftp传到linux服务器上2、创建安装目录mkdir /usr/java/3、解压至安装目录tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/java/4、设置环境变量打开文件vim /etc/profile在末尾添加export JAVA_HOME=/usr/jav...原创 2019-05-08 17:25:57 · 362 阅读 · 0 评论 -
Java多线程与并发知识点梳理
1、多线程基础1.1、线程生命周期1.1.1、新建1.1.2、就绪当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行1.1.3、运行1.1.4、阻塞阻塞分为三种:等待阻塞(o.wait->等待对列): 运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中 同步阻塞(lock->锁池) 运行(running)的线程...原创 2020-06-20 22:01:52 · 507 阅读 · 0 评论 -
浅谈Java IO流
1、概述1、输入和输出 输入流可以理解为向内存输入,输出流可以理解为从内存输出2、典型的数据源(数据媒介) 文件 管道 网络连接 内存缓存 System.in, System.out, System.error 3、并发IO要注意的问题: 在同一时刻不能有多个线程同时从InputStream或者Reader中读取数据,也不能同时往OutputStream或者Writer里...原创 2019-08-10 22:22:33 · 589 阅读 · 0 评论 -
Java实现将多个文件打入tar.gz包中
首先要明确tar.gz这种格式文件的含义。.tar文件只是用来打包,没有压缩。而.gz则采用了gzip压缩。以·tar.gz为后缀的文件是一种压缩文件,在Linux和macOS下常见,也可以使用后缀名.tgz表示。那么Java如何实现将多个文件打进tar包,然后再gzip压缩呢?打tar包我借助了apache的commons-compress依赖,而gzip压缩我直接使用了JDK原生的GZIPOutputStream类。commons-compress依赖如下。 &..原创 2021-03-16 18:11:33 · 1341 阅读 · 0 评论 -
为什么重写equals一定要重写hashcode?
Object类默认的equals比较规则就是比较两个对象的内存地址。而hashcode是本地方法,java的内存是安全的,因此无法根据散列码得到对象的内存地址,但实际上,hashcode是根据对象的内存地址经哈希算法得来的原创 2018-05-24 23:55:10 · 102253 阅读 · 61 评论 -
彻底搞懂为什么重写equals还要重写hashcode?
hashCode方法主要是为了给HashMap使用。设计hashcode最重要的因素是:对同一个对象调用hachCode()应该产生同样的值(前提是对象的信息没有被改变)。正确的equals方法有如下特性:自反性;对称性;传递性;一致性;之所以有规定,是为了使诸如HashMap这样的哈希表正常使用。具体规定如下:equals相等,hashcode一定相等。equals不等,hashcode不一定相等。hashcode不等,quals一定不等。hashcode相等equals不一定相等原创 2020-12-30 08:45:02 · 12532 阅读 · 39 评论 -
Java中>>和>>>的区别?
首先,这两个符号都是移位操作符,那么我们就先来谈谈移位操作符。移位操作符只能处理整数类型。先来谈谈int类型吧。int类型占4个字节(一共32位),第一位表示符号位,其它位为数值为。那么它最大能表示2^31-1(即2147483647),最小能表示-2^31(即-2147483648)。为什么最小值不是-2^31-1,而是-2^31?负数在计算机中以补码表示(符号位不变,原码取反再加1),因此10000000000000000000000000000000表示最大的负数,为-2^31。...原创 2020-12-27 17:33:50 · 2360 阅读 · 2 评论 -
List<? extends T>和List<? super T>的区别
List<? extends T> 这里T是泛型,而?是通配符,"? extends T"表示T是父类,?是子类,该list只能容纳T类型及T类型的子类原创 2020-12-07 11:22:52 · 1770 阅读 · 4 评论 -
HashSet底层原理
HashSet底层完全就是在HashMap基础上包装了一层,只不过存储的时候value是存储的一个Object静态常量,取的时候只返回key因为底层是hashmap,存储的又是key,所以没有get()方法,只能通过遍历获取源码解读 private transient HashMap<E,Object> map; public HashSet() { map = new HashMap<>(); } pu.原创 2020-08-12 17:10:29 · 421 阅读 · 0 评论 -
阿里easyexcel教程
1、引入依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency>2、ExcelUtilimport com.alibaba.excel.EasyExcel;impor.原创 2020-08-02 15:43:50 · 833 阅读 · 0 评论 -
Apache HttpClient教程
如果是安全的https网站,可以正常访问,但如果是不安全的https网站,在进行SSL证书校验时,浏览器会提示不安全的https链接,从而导致HttpClient无法正确访问该网站,因此需要绕过https。除非该网站同时支持两种协议。原创 2020-08-02 15:38:50 · 1405 阅读 · 0 评论 -
java获取classpath路径下的文件
注意:观察文件是否被编译进入target/class目录下//方式一InputStream in = JSONUtil.class.getClassLoader().getResourceAsStream("jackson/book.json");//方式二URL url = JSONUtil.class.getClassLoader().getResource("jackson/book.json");File file = new File(url);...原创 2020-08-02 15:35:25 · 906 阅读 · 0 评论