
Java
文章平均质量分 90
希望永不加班
人生如逆旅,我亦是行人。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
事件监听机制
相信大家都学过Java中的GUI,不知道你们对GUI中的事件机制有没有产生过好奇心,当我们点击按钮时,就可以触发对应的点击事件,这一过程究竟是如何实现的呢?本篇文章我们就来聊一聊Java中的事件监听机制。在了解事件监听机制之前,我们先来学习一个设计模式——观察者模式,事件监听机制的原理就是它。假设现在有一个需求,你正在运营一个有关天气的接口,要求是可以将天气信息推送出去,前提是接入了该接口的开发者才能收到天气信息,该如何实现呢?首先我们来创建一个类:该类模拟的是第三方开发者接入我们的数据接口,显示天气信息原创 2022-06-01 16:30:28 · 1275 阅读 · 2 评论 -
分布式Session解决方案
考虑一个场景,用户在进行下单操作之前后台需要校验该用户是否登录,若未登录则不允许提交订单,这在传统的单体应用中非常容易实现,只需在提交订单之前判断Session中的用户信息是否登录即可,但在分布式应用中,这显然是一个待解决的问题。分布式应用下Session存在的问题在分布式架构中,一个应用往往被划分为多个子模块,比如:登录注册模块和订单模块,当应用被拆分后,随之而来的便是数据的共享问题:一般我们都在登录注册模块中将用户的登录状态保存到Session中,然而当用户进行下单操作时,由于订单模块是独立的,原创 2022-05-28 11:45:27 · 1305 阅读 · 0 评论 -
Jenkins + Docker + Gitee自动化部署SpringBoot应用
阅读本篇文章需要你有Docker、Git、SpringBoot、Linux等基础知识。最近在做毕业设计,遇到一个问题,就是每次编写完一个功能点,就需要重新运行一下项目,然后进行测试,而且项目比较复杂,在本地运行会占用大量的运行内存,导致开发不畅。于是我想着使用Jenkins配合Gitee搭建一个自动化部署平台,并将代码托管到服务器上,这样减轻了本地的电脑压力,也解放了部署的流程。搭建Jenkins平台我们来搭建一下Jenkins平台,首先安装Docker:# 安装yum-utils工具sudo.原创 2022-02-23 09:33:18 · 2793 阅读 · 7 评论 -
接入支付宝支付服务
现如今的应用都少不了支付业务,本篇文章教你如何将支付宝接入到你的应用中。准备环境若是想接入真实的支付宝支付业务,需要大量的材料审核,所以,我们以支付宝提供的沙箱环境为例进行介绍,首先下载官方DEMO,地址为 https://opendocs.alipay.com/open/270/106291/:将JAVA版的DEMO下载好,它是一个Eclipse的项目,将其导入Eclipse打开,目录结构如下:在AlipayConfig类中有着大量的配置:public class AlipayConfig原创 2022-02-09 15:51:27 · 3095 阅读 · 0 评论 -
浅谈AQS
说到Java的并发编程包,就一定少不了一个东西,它就是AQS,可能有些同学是第一次遇到这个名词,没关系,并发包里的ReentrantLock你总用过吧?那么你有没有想过,为什么简简单单地调用lock()、unlock()方法就能够解决线程的安全问题呢?CAS我们都知道,Java还有一种线程同步的方式,synchronized关键字,使用它能够解决线程的安全问题,然而,由于synchronized底层是通过操作系统Mutex Lock来实现的,导致synchronized的效率比较低,被大家称为重量级锁。原创 2021-12-23 09:42:40 · 725 阅读 · 0 评论 -
Java并发之synchronized
synchronized关键字是Java并发中的一个重要内容,它能够解决多个线程之间访问资源的同步性。作用范围由于synchronized是关键字,所以它能够修饰三个地方的代码,分别是:实例方法、静态方法、代码块。实例方法当synchronized修饰某个实例的方法时,它的锁对象为当前对象实例:synchronized void test() { ......}因为锁对象是当前对象实例,所以若是对象实例不同,则无法保证线程同步。静态方法当synchronized修饰某个静态方法时原创 2021-12-23 09:40:15 · 745 阅读 · 0 评论 -
Java线程池的简单使用
对于资源池的技术,相信大家早就接触过,比如数据库连接池,常见的有c3p0、dbcp等等,而线程也有对应的池子,称为线程池。Java提供了Executors类来创建一个线程池,如:public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(10); Thread thread = new Thread(() -> { Sy原创 2021-12-23 09:39:38 · 1149 阅读 · 0 评论 -
ArrayList的扩容机制
在Java中,ArrayList是一个使用非常频繁的集合类型,它的底层是Object数组,所以它拥有数组所拥有的特性,比如支持随机访问,所以查询效率高,但插入数据需要移动元素,所以效率低。先来看看若是调用ArrayList的无参构造方法,会发生什么?transient Object[] elementData;private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList() {原创 2021-12-23 09:38:57 · 20037 阅读 · 9 评论 -
Spring中Bean的生命周期
在Spring中,一个Bean的生命周期要经过很长的一段步骤,这也是面试中的高频考点,下面就一起来看看吧。首先整体地梳理一下Bean的生命周期:创建Bean实例调用Bean中的setter()方法设置属性值检查Bean是否实现了Aware接口,若实现了,则调用对应的接口方法若容器中有BeanPostProcessor,则调用其postProcessAfterInitialization检查Bean是否实现了InitializingBean,若实现了,则调用其afterPropertiesSet原创 2021-12-23 09:37:36 · 770 阅读 · 0 评论 -
解析HashMap中的put方法
引言在Java集合中,HashMap的重要性不言而喻,作为一种存储键值对的数据结构,它在日常开发中有着非常多的应用场景,也是面试中的高频考点,本篇文章就来分析一下HashMap集合中的put方法。HashMap底层数据结构先来了解一下HashMap底层的数据结构,它实质上是一个散列表,在数据结构课程中,我们应该都学习过散列表,它是通过关键码值而直接进行访问的一种数据结构,比如存储这样的一个序列:5,12,7,6,1,3。我们首先需要设定一个hash函数,通过该函数就能够定位每个元素存储的位置,比如ha原创 2021-12-13 14:10:35 · 6331 阅读 · 3 评论 -
一文解决分布式事务
今天我们来聊一聊分布式事务,在传统的单体应用中,事务的控制非常简单,Spring框架都为我们做了封装,我们只需简单地使用@Transactional注解就能进行事务的控制,然而在分布式应用中,传统的事务方案就出现了极大的问题:的开源消息代理软件(亦称面向消息的中间件)消息中间件首先来聊一聊什么是消息中间件,以及消息中间件能帮助我们解决什么问题。消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统,简单来说,消息中间件能够为我们的系统提供异步处理能力。举个例子,某个系统在使用之前需要用户进行注册,用户在完成注册后需要发送短信和邮件提醒用户注册成功,如果按照同步的流程走,它应该是这样的:但这样有一个问题,当用户注册.原创 2021-08-21 10:29:56 · 1283 阅读 · 0 评论 -
浅谈缓存与分布式锁
对于一个大型网站而言,每天的访问量是巨大的,尤其遇到某些特定的时间点,比如电商平台的购物节、教育平台开学季。当在某个时间点遇到过量的并发时,往往会压垮服务器导致网站崩溃,因此,网站对于高并发的处理是至关重要的,其中缓存起着举足轻重的作用。对于一些不经常变化,或者热度很高的数据,可以将其存入缓存,此时当用户访问时将直接读取缓存而不查询数据库,从而大大提高了网站的吞吐量。缓存的使用首先来搭建一个简单的测试环境,创建一个SpringBoot应用,并编写一个控制器:@RestControllerpublic原创 2021-08-11 11:39:16 · 897 阅读 · 0 评论 -
Nginx+SpringCloud Gateway搭建项目访问环境
现如今的项目开发基本都是微服务方式,导致一个系统中会有很多的服务,每个模块都对应着不同的端口,为了方便访问,通常会让某个服务绑定一个域名,比如商品服务:product.xxx.com;订单服务:order.xxx.com,此时可以使用Nginx来搭建一个域名访问环境,基于前后端分离开发的项目经常会遇到跨域问题,使用Nginx也能轻松解决。安装Nginx首先拉取nginx的镜像:docker pull nginx:1.10然后随意地启动一个nginx实例:docker run -p 80:80 -原创 2021-08-07 13:57:12 · 3704 阅读 · 3 评论 -
手把手带你实现第三方应用登录
大家在自己做项目的时候有没有想过实现一个第三方应用登录呢?类似这种:本篇文章就来聊一聊该如何实现第三方应用登录。什么是OAuth2.0OAuth是一项协议,它为用户资源的授权提供了一个安全、开放而简易的标准,OAuth的授权不会使第三方触及到用户的账号信息(比如密码),因此OAuth是相对安全的。而OAuth2.0就是OAuth的延续,不过2.0更加关注客户端开发者的简易性。申请网站接入常见的第三方应用都支持第三方登录,比如:QQ、微信、微博、GitHub、Gitee等,要想申请第三方登录权限,原创 2021-08-03 16:07:39 · 12034 阅读 · 16 评论 -
前后端分离项目开发,助你打通任督二脉
本篇文章我们来实现一个简单的前后端分离功能——学生系统,前端采用Vue+ElementUI,后端采用SpringBoot+MyBatis。文章里不会介绍相应的技术内容,而是阐述整个前后端开发的流程环境准备在正式开始开发之前,我们先来准备一下开发环境,为了避免一些错误的发生,请保持与我的环境版本一致。首先下载node.js,来到官网:https://nodejs.org/zh-cn/download/releases/下载14.15.0的安装包,下载完成后一路next即可安装成功,安装成功后验原创 2021-07-22 12:48:11 · 4224 阅读 · 13 评论 -
SpringCloud Alibaba微服务解决方案
我们都知道,SpringCloud是微服务的一站式解决方案,是众多组件的集合,而因为SpringCloud中几乎所有的组件使用的都是Netflix公司的产品,其中大部分已经进入了停止更新或者维护阶段。我们需要一些别的组件来代替它们,基于此,SpringCloud Alibaba诞生了。本篇文章我们通过几个具体的业务场景,将SpringCloud Aibaba技术栈融入其中,来感受一下它的便利与强大。环境搭建创建父项目,修改pom文件:<?xml version="1.0" encoding="原创 2021-04-01 12:03:21 · 1353 阅读 · 4 评论 -
基于SSM框架实现一个完整的学生管理系统
这几天用SSM + Redis实现了一个较为完整的学生管理系统,感兴趣的同学可以下载来看看,项目注释写得很多,不失为一个学习的好项目。Github地址:https://github.com/blizzawang/stu_system由于项目中使用了Redis作为MyBatis的二级缓存,所以你还需要搭建一下Redis的环境,并修改RedisCache类中的主机ip:若是你不想使用Redis,或者你还没有学习过Redis,你可以选择在项目中移除掉Redis,将Mapper配置文件中关于Redis的配置原创 2020-10-09 13:12:22 · 4121 阅读 · 3 评论 -
SpringBoot中如何开启热部署
SpringBoot中默认jsp页面的部署方式使用的是生产模式部署,所以当我们对jsp页面进行修改了之后,就必须重新启动才能看到修改后的结果,这对于我们jsp页面的开发是非常不友好的,为此,我们可以开启SpringBoot的热部署,使得在不重新启动SpringBoot应用的情况下,也能马上看到我们对jsp页面的修改结果。要开启热部署,只需要在.yml文件中添加一项配置:server: jsp-servlet: init-parameters: development: true原创 2020-09-26 10:47:16 · 2013 阅读 · 2 评论 -
十分钟带你轻松入门Shiro
Shiro集成Spring首先集成Spring、SpringMVC和Shiro <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.18.RELEASE&l原创 2020-08-26 20:20:19 · 854 阅读 · 0 评论 -
SSM从0开始构建一个项目
本篇文章我们使用SSM框架(Spring + SpringMVC + MyBatis)从0开始构建一个项目,先来看看项目示意图:看起来相当简单的一个小demo,但涉及到的知识点可不少,我们应该把重心放到SSM框架之间的整合上,对于这个项目,你需要有SSM框架、jQuery、ajax、bootstrap、maven等基础。搭建基础环境这里我们使用idea进行开发,首先创建一个maven项目:给项目起个名字并指定路径:然后点击Finish即可。项目创建完成后,来到pom.xml文件,添加相应的原创 2020-08-19 12:30:39 · 2196 阅读 · 1 评论 -
轻松掌握Mybatis(上)
入门案例现有一张数据表:mysql> use mybatis;Database changedmysql> select * from tbl_employee;+----+-----------+--------+-------------+| id | last_name | gender | email |+----+-----------+------...原创 2020-04-28 18:18:33 · 1191 阅读 · 0 评论 -
什么?搞Java的你还不会Spring?一篇文章带你掌握
本篇文章将带你掌握Spring框架,满满的干货,内容有点多,希望你能有耐心看完,看完后一定会有所收获。Spring容器在SpringIOC容器读取Bean配置创建Bean之前,必须对它进行实例化。只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用。Spring提供了两种类型的IOC容器实现:BeanFactory:IOC容器的基本实现,是Spring框架的基础设施,面向Spr...原创 2020-03-09 19:10:33 · 24918 阅读 · 37 评论 -
简化Java编程的法宝,让工作更高效
上篇文章介绍到了HuTool项目中提供的一些组件,但HuTool的功能可远不止如此,接下来,我将介绍HuTool为我们提供的一些便捷工具。如果你没有看过之前的文章,也不要紧,这并不影响你对接下来的内容的理解,不过为了照顾直接看到第二篇的同学,还是有必要介绍一下HuTool的引入方式。在项目的pom.xml的dependencies中加入以下内容:<dependency> ...原创 2019-12-16 14:07:52 · 5055 阅读 · 1 评论 -
有了它,Java语法也可以变得甜甜的
简介Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。Hutool中的工具方法来自于每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;Hutool是项目中“util”包友好的替代,它节省了开发人员对项...原创 2019-12-09 11:18:47 · 9549 阅读 · 12 评论 -
【1024特辑】带你掌握框架的灵魂——反射技术
引言今天是10月24日,行业内的大牛小白都知道, 这是一个中国广大程序员的共同节日,1024是2的十次方,二进制计数的基本单位之一。程序员就像是一个个1024,以最低调、踏实、核心的功能模块搭建起这个科技世界,在此也向IT行业的前辈们致敬。这也是我第二次过程序员节,但是学习习惯不能丢,今天起了个早,写一篇博客开启这美好的一天吧。反射概述Java反射机制指的是在Java程序运行状态中,对于任...原创 2019-10-24 11:25:16 · 2339 阅读 · 0 评论 -
从入门到精通,Java学习路线导航
引言最近也有很多人来向我"请教",他们大都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,实在是每天回复很多人也很麻烦,所以在这里统一作个回复吧。Java学习路线当然,这里我只是说Java学习路线,因为自己就是学Java的,对Java理当很熟悉,对于其它方面,我也不是很了解。基础阶段首先是基础阶段,在基础阶段,我们必须掌握Java基础,Mysql数据库,Ora...原创 2019-11-12 19:34:42 · 161193 阅读 · 832 评论 -
深入Java源码剖析之Set集合
Java的集合类由Collection接口和Map接口派生,其中:List代表有序集合,元素有序且可重复Set代表无序集合,元素无序且不可重复Map集合存储键值对那么本篇文章将从源码角度讨论一下无序集合Set。HashSetHashSet实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 ...原创 2019-08-02 14:56:52 · 4030 阅读 · 1 评论 -
Java11新特性解读
在去年的9月26日,Oracle官方宣布Java11正式发布,这是Java大版本周期变化后的第一个长期支持版本,非常值得关注。Java9和Java10都在很短的时间内就过渡了,所以,Java11将是一个不可忽视的版本。从时间节点看,JDK11的发布正好处在JDK8免费更新到期的前夕,同时,JDK8、9也将陆续成为"历史版本"。那么,关于Java11的新特性到底有哪些呢?容我一一介绍。局部类型推...原创 2019-07-27 14:38:45 · 3107 阅读 · 3 评论 -
Java多线程详解
今天我们聊一聊多线程,谈到多线程,很多人就开始难受,这是一个一听就头疼的话题,但是,我希望你在看完这篇文章后能对多线程有一个深入的了解。案例那么,首先我就举一个电影院卖票的例子来模拟多线程。复仇者联盟4上映的那段时间电影院那可是门庭若市啊,那么我们假设现在有一个电影院正在上映复仇者联盟4,共有100张票,而它有三个售票窗口,我们来模拟一下这个电影院的售票情况。首先创建SellTicket类...原创 2019-07-29 17:18:03 · 5339 阅读 · 13 评论 -
深入Java源码剖析之字符串常量
字符串在Java生产开发中的使用频率是非常高的,可见,字符串对于我们而言非常关键。那么从C语言过来的同学会发现,在C中是没有String类型的,那么C语言要想实现字符串就必须使用char数组,通过一个个的字符来组拼成字符串。Java中是如何实现字符串的那其实在Java中,关于字符串的实现,其实用的也是char数组,这可以从源码中得到体现。/** * Initializes a ne...原创 2020-01-30 13:10:08 · 5012 阅读 · 6 评论 -
理解Java方法增强
在实际开发中,我们往往需要对某些方法进行增强,常用的方法增强的方式有三种。类继承 、方法覆盖必须控制对象创建,才能使用该方式装饰者模式方法加强必须和目标对象实现相同接口或继续相同父类,特殊构造器(传入被包装对象)动态代理我们来编写一个案例感受一下,新建一个Java项目。新建类Catpublic class Cat{ public void run(){ Sys...原创 2019-04-20 13:10:35 · 4705 阅读 · 0 评论