自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

java scala

学无止境

  • 博客(56)
  • 收藏
  • 关注

原创 Quarkus初探

快速体验Quarkus

2024-04-10 15:51:30 853 1

原创 从ReentrantLock来学习AQS

众所周知,AQS是Java用来构建同步工具的基本组件,我们常用的ReentrantLock,Semaphore等同步器都是基于AQS来构建的,这里我们从ReentrantLock这个最简单的同步锁来入手,学习AQS的基本思想。JDK源码基于JDK17,对比一下与JDK1.8在细节上有一些不同。这里假定各位对AQS有一些基本了解,不再对AQS的原理进行介绍。

2023-09-12 15:44:48 171

原创 StructuredTaskScope

需要注意的是StructuredTaskScope与ForkJoinPool不同,ForkJoinPool是为计算密集型任务设置的,StructuredTaskScope默认使用虚线程,主要面向I/O密集型。是为了解决主线程和子线程之间的可见性(observability),消除因取消和关闭而产生的常见风险,例如线程泄漏和取消延迟而引入的一个新组件。参考:https://openjdk.org/jeps/453。方法,该方法需要分别调用另外两个方法。这段代码有以下几个问题。

2023-08-30 13:52:23 377

原创 Java虚线程 简介

虚线程是JDK19中新引入的一个功能,在JDK19中是Preview。旨在帮助开发者以更简单、清晰的方式开发出高性能,吞吐量更大的应用程序。

2023-08-14 11:27:10 201

原创 Using deprecated ‘-debug‘ fallback for parameter name resolution. Compile the affected code with ‘-p

Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection

2023-07-05 17:16:06 3849 10

原创 structs1.x到SpringBoot3

struts1.x到Springboot3

2023-06-15 16:58:26 794

原创 SpringBoot3 - Openfeign 4.0 Migration

针对Springboot3.0.x,对应的spring-cloud-openfeign的版本为4.0.x,如果你使用spring-cloud-dependencies来管理依赖,需要使用2022.0.x

2023-04-07 13:14:11 1432

原创 SpringBoot3 - Spring Doc 2.0 Migration

SpingBoot3需要spingDoc2进行适配

2023-03-30 14:23:41 758

原创 SpringBoot3 - Spring Security 6.0 Migration

最近在做SpringBoot2.x到3.0的升级。其中最主要的一部分是packageName的变更,另外一部分是对一些废弃/删除的类进行替换。大部分升级都比较顺利,但是在SpringSecurity上遇到了不少坑。先看一下下面的代码这段代码在6.0有两个问题,一是标记为废弃,二是方法被移除,这两个问题我们一个个看。

2023-03-27 15:13:52 4312

原创 Mockito mockStatic, mockConstruction

之前项目中都是使用PowerMock的mockStatic和whenNew来mock 静态方法和构造函数。但是在升级jdk17的过程中发现PowerMock已停止维护且不支持jdk17,我们转而将Mockito升级,使用Mockito中提供的。

2023-03-01 15:53:43 6274

原创 Feign源码浅析

创建一个公用的httpClient肯定是很多码农都遇到过的任务,提供了一个简单优雅的方式。首先要区别一点,是spring封装的,和原始的Feign在用法上有一定的区别。Sping提供的封装固然用起来简单,但是其中的依赖或许会给我们的工程带来很多麻烦。这里我们把重点放在原始的,看看他是如何为我们创建httpClient的。上述事例中展示了一种Feign的用法,这种指定baseUrl的形式最终会生成一个,如果baseUrl不固定,Feign还提供了一种的实现深入探究的创建和使用就是这么简单,但是在这简单的

2022-12-05 16:25:28 250

原创 Spring @Conditional注解

背景团队所负责的一个项目由于功能的不断累加目前变的十分庞大,打算将其拆分成若干个单独的service,在这之中有一些共用的bean(例如interceptor, datasource等)需要移到一个公共的module中。但是这个公共的module已经被其他service依赖,为了避免对其他service产生未知的影响,需要对bean的加载进行一些限制做到按需加载,为此使用Spring提供的@Conditional注解进行控制。@ConditionalOnProperty该注解会根据指定的配置,判断是否

2022-05-24 17:28:20 284

原创 缩短maven build 时间

提升mavne test时间背景增加内存背景公司最近对代码的行覆盖提了要求,虽然说更多的UT可以在一定程度上提升代码质量,但是由于代码的量很大导致maven build出包的速度受到了很大的影响,一度增加到了40min。(我们公司一定要先build 通过才能将代码合并到Master)在这样的情况下领导要求大幅缩短UT耗费的时间增加内存通过增加分析build过程中的GC log,发现经过多次的Full GC,每次都会消耗掉不少时间,通过修改pom.xml来修改 <argLine>-nov

2022-01-17 16:53:05 691

原创 SpringBoot配置cors

先简单介绍一下CORS的背景同源策略跨域问题的产生是因为浏览器的同源策略。同源策略将协议+域名+端口构成的三元作为一个整体,只有三者均相同的情况下才属于一个源。跨域问题也就是不同源之间访问导致的问题。同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。跨域资源共享 CORSCORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRe

2021-09-16 15:06:47 1531 2

原创 SpringBoot 2.0 ErrorpageFilter disable

最近在Monitor生产环境时发现有些时段出现了大量的http 500异常,刚开始还以为是出现了问题,仔细排查过后发现其实是遇到了Sql注入的攻击,被Spring Security的拦截器拦截后抛出了RequestRejectedException的异常,由于在filter层,该异常未被处理最终成了500。虽然未造成真实的影响,但是影响到了Monitor的准确性,还是要进行处理。方案一: RequestRejectedHandler如果是SpringBoot 2.4,有一个很方便的解决方案 @Bean

2021-09-02 14:14:59 727

原创 Mongo学习笔记(五) 事务支持

mongodb在4.0之前仅保证单个文档的操作是原子性的,对于多个文档,需要使用嵌套文档的方式进行处理。对于习惯了关系型数据库开发的同学来说,这显然很方不方便,所以在4.0之后, MongoDB开始在副本集中提供multi-document级别的事物支持,根据官网描述,multi-documen是指单个集合中的多个文档跨集合的文档跨DB的文档如果你目前还没有mongo集群,可以按照Mongo学习笔记(四) 创建副本集群replication set的方式快速搭建一个测试集群。事物提交 @Te

2021-03-02 14:57:00 792

原创 Mongo学习笔记(四) 创建副本集群replication set

起因mongodb在4.0提供了事物的功能,就想写个单元测试感受一下,结果运行的时候直接抛了一个异常com.mongodb.MongoClientException: Sessions are not supported by the MongoDB cluster to which this client is connected at com.mongodb.client.internal.MongoClientImpl.startSession(MongoClientImpl.java:12

2021-02-09 14:27:08 623

原创 ElasticSearch7.0 Spring ElasticsearchTemplate

之前尝试了ES原生的RestHighLevelClient进行交互,使用起来觉得不是特别的方便,样板代码不少,尝试使用一下spring-data-elasticsearch提供的封装方法,查阅了spring-data的官网后发现官网中的内容实在是很少,在此进行整理。首先添加依赖:POM依赖<!-- spring相关依赖--><parent> <groupId>org.springframework.boot</groupId> <artif

2020-12-23 10:18:56 1524

原创 ElasticSearch7.0 关联查询之嵌套文档及RestHighLevelClient实现

ElasticSearch7.0 关联查询之嵌套文档本篇简要介绍一下另一种关联文档:嵌套文档。如果直接通过如下方法插入文档PUT my-index-000001/_doc/1{ "group" : "fans", "user" : [ { "first" : "John", "last" : "Smith" }, { "first" : "Alice", "last" : "White" } ]}

2020-11-24 21:03:59 2971

原创 ElasticSearch7.0 关联查询之父子文档及RestHighLevelClient实现

ElasticSearch7.0 关联查询之父子文档ES7中取消了type这一层级(相当于关系数据库中的table,mongo中的collection),所有文档平铺存放在同一个index中,对于一对多的关联关系,ES7中有两种方式:父子文档,所有文档都是平级的,通过特殊的字段类型join来表示层级关系嵌套文档,类似于json中的嵌套数组,需要申明字段类型为nested本篇针对父子文档这一类型官方文档地址:https://www.elastic.co/guide/en/elasticsearc

2020-11-09 16:23:37 5963

原创 Mongo学习笔记(三) 通过Aggregation和lookup进行多级关联查询

第三篇笔记本想着记录一些简单的增删改查,由于中间很久没有写就一时懒得整理了,先把最近刚遇到的问题记录一下通过Aggregation和lookup进行多级关联查询在SQL中可以通过left join操作进行多表的关联查询,在mongo中,类似的操作为Aggregation中的lookup,可以看一下如下数据结构@Datapublic class Subject { private ObjectId id; private String name; private String

2020-10-21 21:41:14 4519 2

原创 django统一异常处理

之前使用SpringMVC进行web开发时,可以通过SimpleMappingExceptionResolver进行统一的异常处理,防止代码中有未捕获的异常出现。最近在用django项目进行开发,在开发时使用了debug模式,异常堆栈会直接显示在浏览器上,就忽视了这个问题,最近上测试发现很多地方没有进行try-catche,这里进行一下处理。Middleware之前专注于业务代码赶工,对django本身框架没有进行过仔细的研究,针对统一异常处理了解到了middleware这个组件,简单看了一下本身类似于

2020-10-19 16:52:14 859

原创 MongoDb学习笔记(二)SpringBoot整合,client初始化

项目地址:https://gitee.com/xiiiao/mongo-learning添加pom依赖<!-- spring相关依赖--><parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.1.RELEASE</vers

2020-08-11 15:54:55 5512 1

原创 MongoDb学习笔记(一)Centos7安装

工作中一直使用Mysql、Oracle这种关系型数据库,最近接到一个类似调查问卷的需求,考虑基于Mongodb进行开发,记录一下学习过程。MongoDb安装安装环境是一台租的VPS服务器,版本为centos7,mongo版本为4.2社区版,安装过程可以参考官方文档。设置yum创建文件/etc/yum.repos.d/mongodb-org-4.2.repo,写入一下内容[mongodb-org-4.2]name=MongoDB Repositorybaseurl=https://repo.mo

2020-08-03 15:42:26 158

原创 ribbon中使用HystrixRequestVariableDefault的一个注意事项

ribbon中使用HystrixRequestVariableDefault的一个注意事项ribbon中自定义路由使用HystrixRequestVariableDefault遇到的问题ribbon中自定义路由使用HystrixRequestVariableDefault最近在研究SpringCloud的灰度发布方案,具体方案是在zuul过滤器中判断哪些用户属于灰度用户,通过HystrixRe...

2020-04-16 16:56:56 1398

原创 Apache james安装配置笔记

Apache james安装配置笔记(一)Apache james安装配置笔记下载安装基本配置配置keystore配置webAdmin启动james验证webAdminApache james安装配置笔记公司要求使用开源的邮件服务系统,架构组的同事推荐了james这个项目,记录一下安装配置的过程james项目地址下载安装james提供spring和guice两种注入方式,目前仅guice...

2019-11-12 10:41:01 1280

原创 使用Netty发送和接收http报文中的一些注意事项

使用Netty发送和接收http报文中的一些注意事项近期看了一些《Netty实战》这本书,看完之后有些云里雾里的,就想写一个简单的http服务端和客户端感受一下,代码不多但是期间还是遇到了一些问题,这里把其中的一些坑记录下来。Netty自带的编码器解码器Netty为常用的网络协议准备了编/解码器,但是就像Netty中大多数组件都是有服务端与客户端的区别,编/解码器同样也存在这方面的...

2018-05-04 20:29:33 6460 1

翻译 Play 2.6 依赖注入

依赖注入https://playframework.com/documentation/2.6.x/JavaDependencyInjectionPlay对实现了JSR 330的依赖注入提供了支持。Play自带的默认的实现是Guice,其他实现也可以添加进来。为了启用Guice模块,先要在依赖中添加信息libraryDependencies += guiceGuice wiki...

2018-02-13 13:48:29 1112 2

翻译 Play 2.6 OAuth的使用

OAuthhttps://playframework.com/documentation/2.6.x/JavaOAuthOAuth是一个发布和交互受保护数据的简单方法。这是一种更加安全的访问方式。举个例子,你可以去获取用户在Twitter上的数据。OAuth有两个版本,1.0和2.0。第二个版本在不使用类库的情况下也很容易实现。因此Play只对1.0版本进行了支持。使用添加

2018-01-12 19:48:29 371

翻译 Play 2.6 Play对OpenID的支持

Play对OpenID的支持https://playframework.com/documentation/2.6.x/JavaOpenIDOpenID是一种协议,允许使用一个帐号来登入多个服务。作为一名Web开发这,你可以让用户使用一个他们已经拥有的账户(比如谷歌账户)来登录。在企业内,可以使用OpenID来连接SSO服务。OpenID的流程用户想给你提供了他的OpenID

2018-01-12 19:47:26 312 2

翻译 Play 2.6 使用Play WS调用REST API

使用Play WS调用REST APIhttps://playframework.com/documentation/2.6.x/JavaWS又是我们需要去访问别的HTTP服务器的资源。PLAY提供了WS类库来支持异步的HTTP调用。在使用WS API时有两个部分:发出请求,处理响应。我们首先会介绍如何发出GET和POST请求,然后展示如何通过类库来处理响应,最后介绍一下常见的用法。

2018-01-12 19:45:41 4520

翻译 Play 2.6 在Play中使用缓存

使用缓存https://playframework.com/documentation/2.6.x/JavaCache对数据进行缓存是一种很常见的优化方式,Play也提供了全聚德缓存。对于cache有一点很重要,缓存只能做缓存能做的:你刚保存的数据也许会丢失。对于任何保存在缓存中的数据,当数据丢失时需要一个重新生成的策略。这个哲学存在于Play的基础之中,而且与Java EE不同,se

2018-01-12 19:43:59 1972

翻译 Play 2.6 使用Ebean

Ebean的使用https://playframework.com/documentation/2.6.x/JavaEbean配置EbeanPlay自带Ebean。首先在project/plugins.sbt中添加插件addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "4.0.1")然后在build.sbt中启用

2018-01-12 10:27:01 1882

翻译 Play 2.6 使用JPA

使用JPAhttps://playframework.com/documentation/2.6.x/JavaJPA添加依赖首先腰围工程添加javaJpa依赖,这里会提供JDBC和JPA的相关依赖。Play中没有内建的JPA实现,可以使用任何可用的实现,下面的例子使用了HibernatelibraryDependencies ++= Seq( javaJpa,

2018-01-12 10:25:52 1150 2

翻译 Play 2.6 访问SQL数据库

访问SQL数据库Note: JDBC是一种阻塞操作。你不能直接在controller中运行JDBC查询语句。详见配置CustomExecutionContext章节配置JDBC连接池Play提供插件来管理连接池,你可以根据需要配置多个数据库。 为了启动数据库插件,需要添加以下依赖:libraryDependencies += javaJdbc然后需要字applica

2018-01-11 20:02:59 1121

翻译 Play 2.6 Play enhancer

Play enhancer英文原文 https://playframework.com/documentation/2.6.x/PlayEnhancerPlay enhancer是sbt的一个插件,用来产生Java bean的get set方法,并且重写了那些通过getters和setters来获取域的代码。动机Java的一大缺点就是一个简单的东西需要一大堆样板代码,这其中最

2018-01-11 17:18:59 350

翻译 Play 2.6 抵御CSRF

抵御跨站伪造请求https://playframework.com/documentation/2.6.x/JavaCsrfCSRF是一个安全漏洞,攻击者通过受害者的浏览器在会话期间发起一个请求。由于每一个请求都会带有session token,如果攻击者能够迫使被害者浏览器以自己的身份发出请求,那么也能以用户的名义发出请求。建议你了解以下CSRF,了解一下什么是攻击向量什么不是,可以

2018-01-11 17:14:35 1172

翻译 Play 2.6 Twirl表单工具

Form template helpers英文原文 https://playframework.com/documentation/2.6.x/JavaFormHelpers#form-template-helpers创建一个标签helper会根据反转路由信息自动设置action和method的值@helper.form(action = routes.Applicati

2018-01-10 19:38:10 243

翻译 Play 2.6 表单

Java表单英文原文 https://playframework.com/documentation/2.6.x/JavaForms在使用表单之前,可以先看一下Play enhancer,Play enhancer为Java类中的域生成访问方法,这样你就不需要手动添加这些代码,这也许会为你提供一些便利。下面展示的例子都是手工生成访问方法的。启用/禁用表单组件默认情况下,如果启动P

2018-01-10 19:17:54 747

翻译 Play 2.6 为Twirl添加自定义的格式

为模板引擎添加自定义的格式原文地址 https://playframework.com/documentation/2.6.x/JavaCustomTemplateFormatTwirl内建的模板引擎支持大多数常用的格式(HTML,XML等),如果有需要的话也可以添加自己的格式。模板引擎处理过程模板引擎通过添加模板中的静态、动态内容来构建最终结果,考虑以下的例子:fo

2018-01-10 09:00:15 363

空空如也

空空如也

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

TA关注的人

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