自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (1)
  • 收藏
  • 关注

原创 较多业步骤场景通用框架

我们工作的大部分时间都在写业务代码,如何写好业务代码必然是我们追求的一大目标,在编程方面,简单、易懂、可扩展性是衡量代码质量的通用标准,所以在工作中,我们能用java将产品经理的想法表达出来还不够,我们产出的内容最好还能让其它的工程师一目了然。本文以创建订单这个业务场景着手,提供一种通用完成创建和编辑业务对象的模式。此业务发起是从前端的一个post请求,就假设为,后端通过控制层接口,然后由处理相关的业务逻辑,再通过持久层入库,请求处理完之后返回给前端一个orderUuid,这是一种很常见的业务:对于。

2022-10-01 17:35:51 716 2

原创 线程重用导致ThreadLocal的数据混乱问题

设置为1,把工作线程池最大线程数设置为1,这样始终是同一个线程在处理请求,因此下一个请求的线程中会遗留上一次请求的信息。管理,最终它会是一个单例bean,为了避免线程安全问题,则不好在这些类中定义成员变量,于是我们会想到使用。中缓存数据是比较合适的做法,但,这么做有可能会出现用户信息错乱的Bug。的工作线程,而tomcat的工作线程是基于线程池的。线程池会重用固定的几个线程,我们将。,但是在测试中发现,偶尔有几次不是。仅第一次线程中的用户信息为。,后面每次新请求过来,线程。中,执行程序的线程是。

2022-09-25 15:54:33 1739

原创 使用MetadataReader解析注解

背景在工作3年以上的时候,在写业务代码的时候我们经常会自定义一些注解用于用于简化代码的开发。一个比较实用的例子见 上一篇博客 。注解其实只是作为一个标识,而真正起作用的代码需要我们自己定义,但是前提是我们要找到这个注解,并解析这个注解的相关信息,我们可以使用jdk提供的类来做,但是它不够灵活,这篇文章介绍另一种方式,也是spring解析注解用的方式 MetadataReader,它是spring提供的一个工具。MetadataReader介绍一、MetadataReader 的作用MetadataR

2022-05-27 15:46:53 398

原创 自定义注解缓存feign结果

一、背景在springcloud微服务架构中,可能会经常通过 feign 组件调用其它的微服务,feign的底层其实是模拟一个http请求,通过访问接口的方式调用远程服务,要经历三次握手建立TCP连接,在项目中是一个比较“耗时”的操作。如果经常请求一些很少变动的数据,或者在一定时间段内可容忍已过期的数据,那么则需要在调用feign之前能不能从缓存中获取,可以自定义注解,将feign返回的结果缓存到redis中一段时间。二、自定义注解项目中需要使用:redis,aspect1 - 定义一个注解标

2022-02-08 17:18:07 2698 2

原创 js函数调用的四种方式

javascript函数被调用的方式1 - 具名函数调用使用最多的一种方式,特点:定义函数的代码可以写在调用之后 f1(); function f1() { alert('具名函数f1被调用了') }2 - 变量定义函数调用使用变量定义一个函数,必须先定义变量,才能调用 let f2 = function () { alert('变量函数f2被调用了'); } f2();3 - 匿名函数自动调用匿名函数没有名字,函数写完可立

2022-02-07 22:02:08 7904

原创 springboot项目使用validation-api进行参数校验

一、引入依赖要使用参数校验注解,需要引入以下依赖,注意springboot2.0的web模块已经包含此依赖 <dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> </dependency>添加了这个jar包,仅

2022-02-07 17:27:23 2402

原创 读写csv的两种方式

读取csv文件读取为列表import csvwith open('members.csv', 'r', encoding='utf-8') as f: reader = csv.reader(f) # print(reader) 迭代器 print(next(reader)) for x in reader: print(x)读取为字典import csvwith open('members.csv', 'r', encoding='

2022-01-26 09:27:53 1259

原创 java程序运行机制

java语言是一种特殊的高级语言,它既具有解释型语言的先生,也具有编程型语言的特征,因为java程序要经过先编译、后解释两个步骤。参考《疯狂JAVA讲义》1 高级语言的运行机制计算机高级语言按程序的执行方式可以分为编译型和解释型两种。编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作类),并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译(compile)。编译生成的可执行性程序可以脱离开发环境.

2022-01-23 13:31:53 226

原创 爬虫入门项目-网页内容爬取

一、知识准备此项目为爬虫入门初级项目,只需要懂得python基本语法及常用模块即可完成。python基本语法,常用模块json,time参考:https://blog.csdn.net/jisuanji12306/article/details/122530277?spm=1001.2014.3001.5502xpath语法,lxml第三方模块参考:https://blog.csdn.net/jisuanji12306/article/details/122637264?spm=

2022-01-22 15:26:33 213

原创 爬虫入门3-在lxml中使用xpath语法

谷歌浏览器安装 xpath-helper(win操作系统)如果可以翻墙上外网,直接到谷歌的插件市场安装即可,如果没有翻墙条件,按归如下步骤也可安装成功。先下载安装包和插件伴侣 https://download.csdn.net/download/jisuanji12306/77324329运行插件伴侣.exe,并将插件解压到桌面将刚才解压好的文件夹移到一个专门存放谷歌浏览器插件的文件夹下,最好不要放在桌面上打开浏览器扩展程序标签页 chrome://extensions/,点击加载已解压的

2022-01-22 15:00:13 631

原创 爬虫入门2-使用requests模块

安装 requests 模块requests中文文档使用 requests发送get请求发送post请求使用headers

2022-01-22 10:38:34 336

原创 python基础项目-控制台ATM

一、项目概况1、功能说明控制台ATM机项目是一个python入门项目,主要是用于熟悉python语法和常用模块的初级项目,它使用面向过程的编程方式,只要懂了python语法就可以完成这个项目,非常适合初学python者练手。整个项目的功能有:注册,登录,查看余额流水,存款取款等操作。涉及到python的知识点包括且不限于:list的使用,dict的使用,常用内置模块os、time、json,文件操作,闭包与装饰器等。2、效果截图3、获取源代码gitee 克隆项目下载源代码后,选择使用pych

2022-01-20 21:49:24 1274

原创 python常用内置模块

使用模块当import一个模块时,自动做三件事:1. 运行一遍该模块内的所有代码(保证这个模块没有bug)2. 生成一个名称空间,这个名称跟模块名同名3. 让运行程序连接名称空间,后续就可以使用模块中的变量/函数python文件中自带变量:__name__,如果py文件是以程序的方式运行,__name__ = 'main',如果以模块的方式运行,__name__ = 文件名time - 时间模块import timetime.sleep(2) # 程序暂停,单位秒# 获取时间戳p

2022-01-18 23:13:54 514

原创 爬虫入门1-urllib包基本使用

使用request模拟请求res = request.urlopen('https://www.baidu.com')print(type(res)) # <class 'http.client.HTTPResponse'>print(res.read())请求头设置User-Agent防止反爬虫from urllib import requesturl = 'https://www.baidu.com/'header = { 'User-Agent':'Mozill

2022-01-17 23:17:03 254

原创 函数语法笔记

定义和使用函数def f1(): print('我是一个函数')print(f1) # <function f1 at 0x10bd5beb0>print(type(f1)) # <class 'function'>f1() # 调用函数def f2(): print('我是一个带返回值的函数') return 'hello world'print(f2()) # hello worlddef f3(a, b): return a

2022-01-14 15:56:42 238

原创 python条件控制

1 - 顺序执行2 - 条件执行单分支 ifnumber = int(input('请输入分数'))if number == 10: #注意冒号一定要写 print('恭喜你中奖啦')print('游戏结束')双分支 if … else …number = int(input('请输入分数'))if number == 10: print('恭喜你中奖啦')else: print('谢谢光临')print('游戏结束')多分支score =

2022-01-13 21:49:47 222

原创 python数据类型

参考资料 http://c.biancheng.net/python/base/一个变量是由3个东西组成的:1.数据类型(type)2.内存地址(id)3.值(value)可以把变量理解为是一个"仓库":数据类型就是仓库的类型变量值就是仓库里的东西内存地址就是仓库的位置变量名(标识符),相当于是给你自己取名字,你的名字可以随便取吗???沈70 (带阿拉伯数字)沈&^% (带特殊符号)人民币 (人民币有特别的含义)都是不行的,因为正常的中文名都是汉字组成.这是一种规则.

2022-01-12 17:02:20 130

原创 springboot项目中使用异步线程池

为了提高cpu的使用率,spring服务器项目中会经常用到多线程,因此使用线程池是必备的,以下创建和使用多线程是方式是多年工作中总结出来的,算是一个不错的实践配置线程池创建配置类:AsyncConfig.java,项目中使用到的多线程都将由它创建/** * 使用异步方式@Async来执行异步,而不是通过自定义的 applicationEventMulticaster 来执行异步 * 目的是对监听事件的更灵活的控制 */@Configuration@Slf4jpublic class A.

2021-12-20 10:44:27 1319

原创 spring方法调用导致事务失效原因及解决方案

spring方法调用导致事务失效原因及解决方案1、事务失效场景复现背景我们在平时的工作中写业务逻辑的时候,有可能会遇到这么一个场景:在一个循环中处理事务问题。在使用声明式事务的情况下我们有两种选择,要么把@Transanal注解放在整个循环的方法上,这样的话每次循环的事务都会被管理到,缺点是使用了长事务,会导致锁表问题,影响效率。另一种方案是将每一次循环抽出一个方法,然后把@Transanal注解加在这个方法上。这样spring只管理了本次循环的事务,解决了长事务问题,但是有事务失效的风险。下面

2021-02-06 14:52:20 2170 1

原创 父子组件实现数据的双向绑定

使用情景:一般情况下我们使用一个组件,可以通过prop给这个组件传值,组件可以使用emit来改变使用者的数据。如果频繁修改同一个数据,那么可以使用v-model进行父子组件数据的双向绑定。常用于处理输入的文本编辑组件。下面的html代码复制到一个文件中运行即可显示效果一、使用prop和emit实现双向绑定<!DOCTYPE html><html> <he...

2020-03-29 23:54:34 1748 1

原创 FactoryBean的使用方法及作用

FactoryBean 的使用方法自定义 MyFactoryBean ,只需要实现 FactoryBean 接口即可package com.jack.factoryBean;@Componentpublic class MyFactoryBean implements FactoryBean&lt;MyService&gt; { @Override public MyService...

2019-01-19 23:19:08 4964 2

原创 线程间通信的几种实现方式

线程间通信的几种实现方式首先,要短信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。我们来基本一道面试常见的题目来分析:题目:有两个线程A、B,A线程向一个集合里面依次添加元素&amp;quot;abc&amp;quot;字符串,一共添加十次,当添加到第五次的时候,希望B线程能够收到A线程的通知,然后B线程执行相关的业务操作。方式一:使用 volatile 关键字基于 volatile...

2019-01-13 07:43:41 188466 20

原创 简单实现一个死锁例子

简单实现一个死锁例子public class TestDeadLock { public static void main(String[] args) { Object lock1 = new Object(); Object lock2 = new Object(); new Thread(new Runnable() { ...

2019-01-09 21:14:06 1886

原创 MyBatis二级缓存巧妙使用装饰器模式与builder模式

MyBatis二级缓存巧妙使用装饰器模式与builder模式mybatis在查询数据时使用一级缓存和二级缓存来提交查询效率,并减少数据库压力。一级缓存也称为本地缓存,是默认开启的,它的生效范围为sqlSession,在实际的生产项目中,由于数据库连接是从连接池中获取,几乎每次使用的session都不同,因此很少能使用到一级缓存。二级缓存也称为全书缓存,它的生效范围在一个namespace中...

2019-01-06 11:17:17 788

原创 彻底理解三次握手和四次挥手

三次握手在进行网络通信之前,套接字Socket之间的连接可以分为四个步骤:服务器监听,客户端请求服务,服务器确认,客户端确认,进行通信。而这些确认的步骤就需要使用“三次握手”来完成,三次握手的本来目的其实就是为了确认几种能力即:服务器端和客户端分别验证需要通信的服务器和客户端发包及收包的能力,而确认这些信息至少需要三次的数据交换即“三次握手”。客户端服务端...

2019-01-05 12:51:21 265 2

原创 学习如何创建自定义线程池

java.util.concurrent.Executors 线程池工厂类提供了很多创建线程池的方法,常见的方法如下:newFixedThreadPool(int nThreads) : 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。 newSingleThreadExecutor() : 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运...

2018-09-12 22:26:26 1600

原创 使用ForkJoin并行计算,实现一个Master-Worker并行计算框架

java.util.concurrent 包提供了一种将一个大任务分割成一个个小任务,并行执行这些小任务以提高效率的框架 ForkJoin。它的使用很简单,自己在程序中实现 compute() 方法即可,这个工具类也是使用空间换时间的思路。代码清单一:ForkJoin的使用package com.jack.jucstudy;import java.util.concurrent.Ex...

2018-09-09 11:43:30 628 1

原创 使用LockSupport实现线程中的通信,实现Future模式的一个例子

java.util.concurrent.locks.LockSupport 类,故名思义,是一个线程辅助类,它的一个重要功能就是实现线程间的通信,阻塞唤醒等,它与Object 的 wait方法和notify方法相比,有很多优势,目前我就发现俩:1、不需要显示地加锁,不需要很多的try--catch,代码更加简洁2、使用LockSupport唤醒线程不需要关心阻塞和唤醒的先后顺序   ...

2018-09-06 23:38:45 330

原创 使用ReentrantLock和Condition配合实现阻塞队列

    今天学习了 ReentrantLock 和 Condition之后, 发现使用 ReentrantLock  和 Condition 配合使用实现线程间的相互通信比Object的wait和notify方法更灵活。写了一个小例子加深映象:package com.jack.jucstudy;import java.util.ArrayList;import java.util.Lis...

2018-09-04 23:32:12 1645

原创 使用DelayQueue模拟一个缓存工具类

关于集合类,我们平时用的较多的有ArrayList,HashMap,TreeSet等,java集合框架还提供了一个常用接口Queue,在java.util.concurrent包下有大量队列的实现类,可见队列在并发编程里广泛使用,大致类图如下:java.util.concurrent包下提供了很多实用的类,DelayQueue便是其中之一,它是一种延迟队列,主要用于缓存和任务处理等。下面是...

2018-09-02 21:57:59 503

原创 java枚举类的作用

java枚举类可以简单地理解为一种特殊的java类,它的主要用途如下:1、作为类型安全的常量。如下,public enum Color { RED, GREEN, BLANK, YELLOW; public static void main(String[] args) { System.out.println(Color.RED);//RED }}之所以打印结果为RED,是因为我们没...

2018-02-23 20:35:56 9317 5

原创 Mysql外键级联动作(删除和更新)

在实际开发中,我们创建表和表之间关联的时候很少用到外键,但是有时候需要用到外键,准确地说是用到外键的级联动作,例如你有一张用户表,存了一些用户的基本信息user表,如果这张表中的属性过多,我们可能需要另一张表也用来存储用户的信息,比如存一些登录信息,就叫login_user表,很明显这时候在login_user中设置一个外键去关联user表更合适,虽然不用外键也可以达到效果(使用触发器当然也行),

2017-08-13 17:49:03 4701

原创 Mysql数据库中数据类型的长度是什么

在mysql中新建数据表的时候会有长度一说,其实用建表语句建数据表的时候也有涉及例如:CREATE TABLE user(uid int(4),name varchar(255),passward varchar(20)birthday data)不知道你有没有注意这个数据类型后面的括号有什么玄机,今天看了《Mysql 5.6 从零开始学》这本书,算是把这个地方搞清

2017-07-30 16:18:09 14469 7

原创 Java使用Redis缓存

以前不知道redis缓存如何使用,今天在网上找了一些步骤然后在本地eclipse上部署了一个redis项目,以下作为总结redis服务跟Tomcat和activemq很相似,如果要在本地使用redis,得先有redis服务才行,所以首先先下载redis。1、下载redis,并安装在自己的电脑上,我的电脑是Win7 64位的,下载解压后就在D盘2、配置redis的内存大小和密码,

2017-04-15 13:23:35 1291

原创 学习设计模式之模板模式

模板模式,顾名思义这种模式就是提供一种模板,一种什么模板呢?模板模式封装了一个算法步骤,并允许子类为一个或多个方法提供实现。模板模式可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。简单的说,父类就是一个模板,子类继承父类之后,可以直接使用父类提供的方法和算法步骤,也可以重写父类的方法或实现父类中的抽象方法来自定义自己的特色。举个例子,泡咖啡和泡茶有相同的步骤和相似的方法。我们可以

2017-03-21 08:29:31 235

xpath helper插件

谷歌浏览器xpath-helper及插件安装包

2022-01-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除