自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 关于Spring容器启动过程中,因 FactoryBean导致的循环依赖的问题分析

§ 一个排列组合问题假设存在如下的配置类: @Configuration publicclassExperienceCenterConfig { @Resource privateThriftServerAddressProvider thriftServerAddressEdsManager; @Bean publicThriftServiceClientProxyFactory experience...

2021-04-07 10:25:33 6

原创 Spring框架解析之对象排序

​本文是Spring IoC容器技术介绍系列文章之一。本文介绍bean对象排序概念、方法和实现。1 背景Spring框架中可以管理多个类型相同的bean对象,这有两层原因。 Spring支持对Collection对象的注入,这本身就意味着Spring可以管理多个相同类型的bean对象; Java是一种OOP语言,天然存在着继承和多态。不同类型的bean对象自然也就可能继承自相同的父类。从IoC容器中拿到的是单个对象,还是多个对象的集合,则取决于使用者从继承链上的哪个层级获取对象了。

2021-02-07 12:22:31 24

原创 Spring框架解析之@Import

​本文是Spring IoC容器技术介绍系列文章之一。本文介绍Spring IoC中的@Import注解。功能解释@Import annotation allows for loading @Bean definitions from another configuration class@Import注解支持从其他的配置类中加载@Bean的定义。一般通过在程序中使用配置类的方式定义所有的bean对象,但当我们希望使用工程中引入的其他包的配置类时,@Import注解就非常有用了。它可以帮

2021-02-07 12:21:50 19 2

原创 Spring框架解析之@ComponentScan

​本文是Spring IoC容器技术介绍系列文章之一。本文介绍@ComponentScan。1 自动扫描机制@ComponentScan注解在Spring中用来定义IoC容器需要扫描哪些类文件。在这些类文件中,所有以@Component标注的对象和以@Bean标注的方法都会被自动加载到IoC容器中。另外,除了@Component注解之外,其他诸如@Controller、@Configuration、@Service这些继承了@Component注解的注解,也同样适用于上述的扫描规则,均会被自动加

2021-02-07 12:21:16 23

原创 Spring框架解析之@Configuration

​本文是Spring IoC容器技术介绍系列文章之一。本文介绍@Configuration的使用以及原理。1 概念介绍Annotating a class with @Configuration indicates that its primary purpose is as a source of bean definitions.上述是Spring官方文档中用于介绍@Configuration的一段话,大意是说在类上使用@Configuration标注则表明该类的主要目的是作为bean定

2021-02-07 12:20:40 24

原创 SpringFactoriesLoader类和spring.factories文件

本文将介绍spring-core中的SpringFactoriesLoader和spring.factories。​1 引言在Spring Web MVC配置方式汇总(二)和Spring Web MVC配置方式汇总(三)中我们介绍了反射、SPI和SCI机制。这些技术框架或名词看似毫不相关,其实本质上处理的是一样的问题,都是将程序或应用的部分控制逻辑暴露出去,便于配置和调整。控制反转是IoC容器的标准特性,我们曾经在文章中也说过:Spring的IoC容器的设计思想便是将对象管理、对象与对象间的依赖

2021-02-07 12:19:21 35

原创 浅谈servlet-mapping的机制(二)

本篇文章将结合源代码介绍servlet-mapping的映射机制。​1 DefaultServletTomcat包中有个类的名字叫DefaultServlet,顾名思义就是默认的Servlet。那这个类有何作用呢?我们看下它的Javadoc描述:DefaultServlet的javadoc简单翻译下就是说DefaultServlet会默认映射到/路径下,它的作用是处理所有的静态资源请求。Web应用启动后默认有两个文件夹下的文件是不能直接被客户端访问的,一个是META-INF,另一个是

2021-02-07 12:18:36 13

原创 浅谈servlet-mapping的机制(一)

​本篇文章将结合源代码介绍servlet-mapping的映射机制1 引言在Web应用中,经常会涉及到字符串匹配的问题。比如使用AbstractAnnotationConfigDispatcherServletInitializer的方式启动Web应用时,我们需要重写这个方法:@OverrideprotectedString[]getServletMappings(){returnnewString[]{"/"};}这里面的/是啥意思?为什么有时候还会出现/*和/**...

2021-02-07 12:17:54 33

原创 Spring工程的通用配置模式(一)

Spring的很多子项目都涉及到配置。在这些项目中,存在一个较为通用的配置模式,了解该模式有助于我们更好地理解框架。本文将对这一模式进行介绍。我们会先介绍Spring Web MVC框架,之后再结合其他相似的项目进行总结。​1 Registryregistry是登记、注册的意思。以Registry结尾的对象用于完成特定功能的配置。比如CorsRegistry用来配置应用的跨域访问功能,ViewResolverRegistry用来配置应用的视图解析功能,FormatterRegistry用来配置应

2021-02-07 12:17:14 14

原创 Spring工程的通用配置模式(二)

​Spring的很多子项目都涉及到配置。在这些项目中,存在一个较为通用的配置模式,了解该模式有助于我们更好地理解框架。本文将对这一模式进行介绍。我们会以Spring Web MVC框架介绍,之后再结合其他相似的项目进行总结。1 @Enbale@Enable*注解通常指启用某个框架的意思,比如@EnbaleWebMvc指启用Spring Web MVC框架。该注解一般会配合@Configuration注解一起使用,放在配置类上,由ApplicationContext启动时加载。@Config

2021-02-07 12:16:34 6

原创 深入解析Spring Boot启动过程(一)

本篇文章将结合源代码介绍spring boot应用的启动过程。1 引言Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".上面这段话是Spring Boot工程官网上的第一句话。大概意思是Spring Boot应用很好,可以创建独立的、生产级别的、基于Spring框架的、可直接运行的应用。 独立:独立意味着低

2021-02-05 12:11:53 17

原创 异步请求机制介绍

本篇文章将介绍HTTP异步请求机制。1 引言Spring MVC has an extensive integration with Servlet 3.0 asynchronous request processing.DeferredResult and Callable return values in controller methods and provide basic support for a single asynchronous return value.上面这段描述来自

2021-02-05 12:11:15 25

原创 ETag和304

​本文将介绍ETag,以及Spring框架中如何使用ETag节约网络传输带宽。1 定义ETag是Entity Tag的缩写,可以认为是URL对象的身份标示。若两个URL对象的ETag值相同,则可认为这两个对象相同。2 HTTP状态码在从零搭建Web应用(一)中,我们有对HTTP做过简要的介绍。HTTP请求示例在HTTP响应报文中,会返回一个三位数字。这个数字被称之为HTTP状态码,英文全称是HTTP Status Code,它用来表示HTTP响应报文的各种状态。在上图中红色方框圈

2021-02-05 12:10:26 15

原创 Spring Web MVC配置方式汇总(五)

​1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 @EnableWebMvc在上一篇文章中,我们已经使用过@EnableWebMvc注解进行Spring Web MVC的配置。@EnableWebMvc注解启用Spring Web MVC自动配置的特性,用于初始化Spring Web MVC框架。那么,自动配置到底配置了什么呢?前面的文章中介绍过Web应用,抽象来讲就是一个处理HTTP请求并返回HTTP响应的程序。这个程序的处理过程大致可以描述成:

2021-02-05 12:09:45 15

原创 Spring Web MVC配置方式汇总(四)

1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 和web.xml说再见我们终于到这一步了!我们花了两篇文章的篇幅,介绍了反射机制、SPI机制、SCI机制以及Spring Web如何和Tomcat集成。可谓是万事俱备,只欠东风了。那么,现在让我们将工程中的web.xml文件删除,着手准备使用纯Java代码的方式,让我们的Web应用启动起来。在Web应用中创建一个名为MyWebApplicationInitializer的类,类的名称可以随便取,只要

2021-02-05 12:09:04 9

原创 Spring Web MVC配置方式汇总(三)

​1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 SCI补充上一篇文章中介绍了Tomcat是如何使用类似Java SPI机制加载启动配置的,它有个专用名词叫SCI。SCI是Servlet Container Initializer的缩写,也就是Servlet容器启动器的意思。在上一篇文章中,我们给出了ServletContainerInitializer的源代码。packagejavax.servlet;importjava.util.Set..

2021-02-05 12:08:22 6

原创 Spring Web MVC配置方式汇总(二)

1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 反射和SPI反射的概念应该都不陌生。应用执行时操作的是指令,指令集则被抽象成代码块。OOP中将一个个代码块组合成对象(Object),Java语言就是这样。使用Java语言编程其实就是构建这样一个个的对象(Object),而后对这些对象(Object)进行操作。有时候仅仅操作这些对象并不够,在特定语境下需要对操作对象的动作进行抽象和表述,比如调用Car对象的start()方法。这就是反射,反射其实是使用

2021-02-05 10:59:49 10 1

原创 Spring Web MVC配置方式汇总(一)

1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 准备工作首先得有一个工程,我们随便建一个web工程,比如SpringMvcTest。按照从零搭建Web应用中介绍的,先调整下pom.xml文件。<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://ww...

2021-02-05 10:59:14 21

原创 从零搭建Web应用(二)

1 Java Web本文将从最基础的HTTP协议开始讲起,介绍如何徒手搭建Web应用,内容如果比较多的话,后面会分成多篇逐步介绍。2 皇冠上的明珠-Apache不知道Apache的研发不是好的研发,若你的主语言是Java则更是如此。Apache事实上是很多技术标准的制定者和践行者。比如我们现在要说的Maven和Tomcat。Tomcat是Web容器的一种,那什么是Web容器呢?在上一篇文章中,我们提到Servlet。Servlet其实是Java语言的一部分,其给出了一个Web应用该如何处

2021-02-05 10:58:32 8

原创 从零搭建Web应用(一)

​1 Java Web本文将从最基础的HTTP协议开始讲起,介绍如何徒手搭建Web应用,内容如果比较多的话,后面会分成多篇逐步介绍。2 HTTP协议Web应用被称之为B/S架构,与其对应的的是C/S架构。这里面的B是Browser(浏览器),C是Client(客户端),S是Server(服务器)。客户端需要直接安装在访问终端上,不同访问终端(主要指不同的操作系统)需要提供不同的安装包,这增加了软件投产成本,换言之也就是软件可移植性差。B/S架构则相对简单,只要访问终端安装了浏览器就可以使用。现在

2021-02-05 10:57:55 28

原创 使用Spring Security做方法层的权限拦截

Spring Security中可以通过Authentication(认证)和Authorization(授权)的功能,识别用户身份并完成用户授权。通常的做法是在用户访问某些资源时,通过拦截器方法确认用户身份,如果当前用户身份不明(未登录或者是匿名用户)且被访问资源是非公开资源时,系统会强制跳转至登录页面,在用户登录完成后再跳转回原地址,继续访问资源。这些拦截功能基本都是使用Filter在请求未到达DispatcherServlet前就完成处理了。但如果我们需要在细粒度上进行访问权限控制的话,那该怎

2021-02-04 10:35:12 34

原创 Spring Security防止CSRF攻击

CSRF全称是Cross-site request forgery,翻译过来的意思是跨站请求伪造。HTTP协议本身是无状态的,这意味着HTTP协议本身无法识别并记录客户身份。​为了实现用户登录并保持登录状态的功能,就要求在HTTP协议之上增加新的特性和功能,将无状态的HTTP协议变成可以支持状态保持的服务。这个技术就是Session和Cookie。Cookie是保存在浏览器端的一小段数据,服务器可以通过HTTP协议,要求客户端设置本地的Cookie数据或告知客户端将Cookie数据以HTTP

2021-02-04 10:34:29 19

原创 Spring Boot下配置Spring Data Jpa项目

正常情况下,绝大部分的应用系统都少不了和数据库做交互。Java语言是面向对象的,也就是OOP(Object Oriented Programming)。传统的数据库,也就是关系型数据库RDBMS(Rational Database Management System),使用的语言叫SQL(Structured Query Language)。当面向对象编程遇到SQL时,总会有人想做到大一统。毕竟,无论怎么变化,所有的语言和技巧,无外乎都是对现实世界的抽象罢了。然后,就出现了ORM(Object

2021-02-04 10:33:49 10

原创 如何对数据库操作进行审计?

​在对关系型数据库的处理上,我们经常希望能对表的创建和更新操作进行审计,即在表上增加四个标准的字段:创建人、创建时间、修改人、修改时间。当新建一条记录时,将触发记录新增的用户和操作时间记录在创建人和创建时间两个字段中;当修改一条记录时,将触发记录修改的用户和操作时间记录在修改人和修改时间两个字段中。以前做项目的时候,会强制开发人员写的SQL中要手动设置创建人、创建时间、修改人、修改时间值并记录到数据库中。但是,这种靠Code Review和制度规范约定的方式,比较古老且不可靠。那有没有什么办

2021-02-04 10:33:05 83 1

原创 数据库审计框架内部原理解析

​本文介绍Spring Security和Spring Data Jpa集成实现数据库操作审计功能的原理。本篇中使用的示例同如何对数据库操作进行审计?Repository首先Spring Data Jpa中的Repository资源是接口类型的。接口类型的文件在Java中主要用于定义规范。一般的接口中是不包含具体的实现代码和逻辑的。如果要实现接口中定义的功能,一般需要: 实现该接口,在具体实现类中增加相关的处理逻辑; 使用动态代理机制,比如Java Dynamic或CGL

2021-02-04 10:32:12 37

原创 数据库操作审计框架启动过程解析

​本篇文章用于介绍Spring Data Jpa数据库操作审计框架的启动过程。本文中使用的示例同如何对数据库操作进行审计?。背景在数据库审计框架内部原理解析一文中,我们曾介绍过Spring Data Jpa数据库操作审计的执行过程: 用户在页面上提交创建评论的请求,请求到达服务器端。在服务器端处理后,最终调用SimpleJpaRepository,触发EntityManager(即SessionImpl)的persist()方法,完成数据的持久化。 SessionImpl内部保存了一

2021-02-04 10:31:25 19

原创 Hibernate框架入门

​ORM全称是object/rational mapping,简单讲就是建立面向对象语言(OOP)和结构化查询语言(SQL)之间的关系。这种关系其实并不是双向的。一般指的是使用面向对象语言来描述SQL,而不是使用SQL来支持面向对象语言。这种情况主要是有两个原因导致的: OOP的结构要比SQL复杂的多,使用简单语言描述复杂语言本身就比较困难; ORM主要是方便开发人员构思软件体系结构和简化具体编码而发明的。实际项目中,大量的工作也集中在使用面向对象语言实现软件功能这部分。 所以,

2021-02-04 10:30:41 11

原创 Thrift 协议介绍

背景Thrift是一种接口描述语言和二进制通讯协议。原由Facebook于2007年开发,2008年正式提交Apache基金会托管,成为Apache下的开源项目。​Thrift是一个RPC通讯框架,采用自定义的二进制通讯协议设计。相比于传统的HTTP协议,效率更高,传输占用带宽更小。另外,Thrift是跨语言的。Thrift的接口描述文件,通过其编译器可以生成不同开发语言的通讯框架。安装在Mac OS X系统下,可以直接使用homebrew安装thrift,如下:future@Futu

2021-02-04 10:29:56 88

原创 2021年推荐阅读书籍

​1. 背景2020年总算是过去了。无论是在哪个方面,2020年都注定不平凡。往大了说,新冠疫情应该改变了很多人的很多看法。对国内国外国家制度的看法,对工作生活的看法,对未来发展的期许……从小的看,我个人在2020年经历了数次工作的变动。从创业公司的执行总监,到国企部门的总经理,再到互联网公司的普通员工,整个过程充满了玄幻。时也命也!很多事情回头看时貌似轻描淡写,但过程曲折忐忑往往无法言说,只有当事人自己才知道。所以说,切肤之痛也好,酣畅淋漓也罢,总不过一段经历罢了。人生总会有起起伏伏,

2021-02-04 10:29:14 101

原创 写给所有想在新年换工作的技术从业者

致所有想在新年动一动的朋友们:1. 面试官视角我正式开始给别人面试的时间应该是在2015年左右,这么算来我的“面试官生涯”应该也有五年多了,基本上占了自己职业生涯一半还多的时间。来来回回面过的人两三百个总是有的。总体来讲,面试是个苦差事,我其实特别不喜欢给别人面试。因为要在短短的几十分钟之内,彻底认识一个人的难度是非常大的,尤其是做技术这一行。评价一个人的标准无外乎个人的工作履历和参与过的项目。个人的工作履历有时候受限于平台和环境,并不一定每一个能力出众的候选人都有一份漂亮的履历。项目经验上

2021-02-04 10:28:07 26

原创 log4j配置文件加载逻辑调试方法

使用Spark开发弹性计算框架时,由于Scala语言对Spark的原生支持比较好,所以一般会采用Scala编写代码。Scala底层使用的还是JVM虚拟机,和Java本身是共通的,所以Log4J原则上肯定是可以兼容Scala应用。Log4J框架使用配置文件进行日志系统的初始化,由于引入的各类jar包都有可能会包含Log4J的配置文件,首次配置起来会比较痛苦。下面备注下Log4J框架该如何找到实际生效的配置文件。1. 包依赖主要是如下三个包,log4j-api-scala是log4j在sca

2021-02-03 14:10:07 11

原创 使用信号量控制线程池任务提交速率的一个坑

​0 背景不久前,标哥(此乃一位技术非常厉害的我的同事)曾让我看过一段很有意思的代码。这段代码的目的是通过信号量控制向线程池中提交任务,避免在线程池中大量积压任务影响程序执行效率。我简化了一下,大概的逻辑如下://实际工作的线程数,假设是4staticfinalintTHREAD_CNT=4;publicstaticvoiddoWork()throwsInterruptedException{//使用了核心线程数和最大线程数都为4,且使用Synchron...

2021-02-03 14:09:14 20

原创 Spring Boot应用自动配置Kafka过程解析

​最近工作需要集成kakfa到应用中,应用的主体框架使用Spring Boot,因此研究了下Kafka在Spring Boot中的集成方案。1. 依赖引入spring-kafka包,版本号由Spring Boot自动管理。<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><...

2021-02-03 14:08:23 17 1

原创 spring-kafka-test大揭秘

​已经到了没有测试案例,就不会写代码的年纪了!不过好在,优秀的框架或组件总是会在介绍完主体功能之后,附带介绍如何进行测试。然后,因为工作原因,又简单研究了下kafka的测试框架。其中,最神奇的地方是,Spring团队为了便于测试,秉持着能内嵌一定内嵌的原则,搞了一套内嵌的zookeeper和kafka。这样在单元测试期间,就不用开发人员再准备相关环境了。那么,下面来揭秘下具体是如何实现的:1. 依赖<dependency><groupId>org.spri...

2021-02-03 14:07:27 31

原创 CAT、Kafka 以及 Apollo

微服务架构下,常见的一些基础组件的配置问题1. CATCAT 是大众点评开发的一套监控数据打点的系统,主要就是将CAT客户端集成到应用中,然后由应用异步上报系统内部服务的执行情况。​CAT本身是异步的,同时作为一个应用打点系统,需要保证无论CAT是死是活都不能影响到宿主应用。实际开发过程中,确实对应用来讲没啥影响。即使是CAT挂了,应用也照样能正常运行。但这有时候,对开发人员也头疼,尤其是想要验证自己打点逻辑对不对时,经常发现在CAT上找不到自己上报的数据!CAT是通过一个名叫client.

2021-02-03 14:06:18 24

原创 从application.properties中反向注册参数到环境变量中

​今天遇到一个情况,比如:2021-01-0711:43:01,367WARN(Configuration.java:283)-Formoredetails,gotohttps://vladmihalcea.com/hypersistence-optimizer/2021-01-0711:43:01,368INFO(Configuration.java:285)-____||||...

2021-02-03 14:05:28 14

原创 填一下上篇《本地开发环境整合》的坑

​嗯,我昨天发的那篇关于本地开发环境整理的文章,我承认是一篇挖坑文。因为,如果有人真的按照我的方式原样不动地照做的话,十有八九本地是跑不起来的。不是因为做的不对,而是因为本来整个过程就有不少需要优化的地方(手动狗头^.^)。但是,思路和方向是对的!所以,我今天在公司除了参加了一个会议之外,啥都没做,依旧在整理我本地的开发环境!另外,我要坦白的是:让我下定决心以打包镜像的方式配置开发依赖组件的根本原因,不是因为本地开发环境性能撑不住了(4 Core/16GB的MacBook Pro还是可以一战的!

2021-02-03 14:04:31 27

原创 本地开发环境整合

​最近因为日常的开发工作,导致在本地电脑上安装了过多的和开发相关的组件。在某些场景下,当把所有的功能都打开时,电脑直接卡成幻灯片,极度影响办公效率。现在刚好有时间,准备将本地环境整理整理。本地机器上目前和开发相关的服务有: MySQL数据库 Kafka集群 Consul服务 Apollo服务(这个不重要) 计划将这些服务打成一个镜像,按照实际需要启动或者停止相关功能。1. 准备工作首先,找一个基础镜像包。由于我们大部分应用还是基于jdk的,所以使用jdk的

2021-02-03 14:03:35 40

原创 一道感觉没啥难度的面试笔试题

​上次和波波聊天,说到面试的编程题的问题,他提到google有一个经典的面试题:将二叉树左右子树颠倒。然后我有一次面试就让一个候选人写一下,结果他竟然直接放弃了!这题目其实挺简单的: 首先写一个类,用来封装我们的代码: /***@authorjingxuan*@date2021/1/118:09下午*/publicclassMirrorReverse{publicstaticvoidmain(String[]args){}}...

2021-02-03 14:02:29 29

原创 TCP建立连接/断开连接的知识工作中真的用不到吗?

​关于TCP连接的建立和释放过程的问题,已经快变成现在互联网公司面试必问的题目了。不过很多时候,大部分人都觉得这只是书本上的知识。实际工作中怎么可能用到呢?网络连接协议这么底层的东西,写代码的时候会用不就好了?然后我今天还真的遇到了一个问题,下面就开始了!首先,公司使用了consul作为服务注册组件。众所周知,consul的默认端口是8500。由于我在应用中编写了很多的测试案例,有部分测试案例是和consul的实例化过程密切相关的。consul环境公司有提供测试环境,但考虑到本地测试的顺畅性

2021-02-03 14:01:24 20

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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