Java语言
文章平均质量分 88
Mrkang1314
这个作者很懒,什么都没留下…
展开
-
Kafka设计原理——consumer rebalance概览及过程
这个分配过程就被称为rebalance,consumer成功地执行rebalance后,组订阅topic的每个分区只会分配给组内的一个 consumer实例。consumergroup的rebalance本质上是一组协议,它规定了一个consumergroup是如何达成一致来分配订阅topic的所有分区的。offset,但是rebalance之后该group产生了新一届的group成员,而这次延迟的offset提交携带的旧的generation信息,因此这次提交会被consumer group拒绝。原创 2022-09-08 14:26:03 · 480 阅读 · 0 评论 -
Spring AOP的设计与实现——JDK动态代理、CGLIB动态代理
概念了解:Spring AOP面向切面编程、动态代理的理解深入理解SpringAOP中的动态代理JVM的动态代理特性在Spring AOP实现中,使用的核心技术是动态代理,这种动态代理实际上是JDK的一个特性。通过JDK的动态代理特性,可以为任意Java对象创建代理对象,通过Java Reflection API来完成。在代理模式的的设计中,会设计一个接口和目标对象一直的对象Proxy,它们都实现了同一个接口的方法。对目标对象方法的调用,往往就被代理对象给拦截了,通过这种拦截,为目标对象方法操原创 2021-01-13 17:08:25 · 750 阅读 · 1 评论 -
Spring IoC容器设计与实现——容器相关特性的实现(lazy-init属性和预实例化、FactoryBean、BeanPostProcessor、autowire、Bean依赖检查)
ApplicationContext和Bean的初始化及销毁对于BeanFactory,特别是ApplicationContext,容器自身也有一个初始化及销毁关闭的过程。ApplicationContext启动的过程是在AbstractApplicationContext中实现的,在这之前需要一些准备工作prepareBeanFactory()方法实现,这个方法中为容器配置了ClassLoader、PropertyEditor和BeanPostProcessor等,为容器启动做好了必要的准备工作。原创 2021-01-07 16:17:09 · 197 阅读 · 1 评论 -
Spring IoC容器设计与实现——IoC容器的依赖注入
Spring IoC容器设计与实现——IoC容器的初始化过程依赖注入的过程式用户第一次向IoC容器索要Bean时触发的,当然也有例外,就是可以通过控制lazy-init属性来让容器完成对Bean的预实例化,这个预实例化也是一个完成依赖注入的过程。getBean()方法就是触发依赖注入的接口定义。下来通过DefaultListableBeanFactory的基类 AbstractBeanFactory入手去看看getBean的实现。...原创 2021-01-06 17:05:39 · 176 阅读 · 0 评论 -
Spring IoC容器设计与实现——IoC容器的初始化过程
前言在面向对象系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上,这些依赖关系可以通过把对象的依赖注入交给框架或IoC容器来完成。依赖控制反转的实现有很多种方式,在spring中,IoC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。这种方案把对象的依赖关系有序地建立起来,简化了对象依赖关系的管理,很大程度上简化了面向对象系统的复杂性。IoC容器和依赖反转模式控制反转时关于原创 2021-01-04 20:10:09 · 309 阅读 · 0 评论 -
Spring——高级装配
环境与profile在不同的环境中某个bean会有所不同,我们必须要有一种方法来配置,使其在每种环境下都会选择最为合适的配置。配置profile bean在构建bean的过程中需要根据环境决定哪个bean创建、哪个bean不创建。不过spring并不是在构建的时候做出这样的决策,而是等到运行时再来确定。spring3.1引入bean profile功能,将所有不同的bean定义整理到一个或多个profile中,再将应用部署到每个环境中,要确保对应的profile处于激活状态。使用注解@Profi原创 2020-12-29 14:29:19 · 257 阅读 · 0 评论 -
Spring对Bean Validation支持的核心API
spring虽然没有直接实现Bean校验这块JSR规范,但是从spring3.0开始,就提供了对Bean Valication的支持。BeanValidationPostProcessor能够去校验Spring容器中的Bean,从而决定允不允许它初始化完成,若校验不通过,在违反约束的情况下就会抛出异常,阻止容器的正常启动。public class BeanValidationPostProcessor implements BeanPostProcessor, InitializingBean {原创 2020-12-25 17:01:03 · 387 阅读 · 0 评论 -
Java 数据校验 Bean Validation
为什么要有数据校验传统的if-else判断参数是否合法的方法存在以下几个问题:需要写大量的代码来进行参数基本验证;需要通过文字注释来知道每个入参的约束是什么;每个程序员的参数验证方式可能不一样,参数验证抛出的异常也不一样,导致后期几乎无法维护;如上会导致代码冗余和一些管理的问题,最好是将验证逻辑与相应域模型进行绑定。Bean Validation是标准,它的参考实现除了Hibernate Validator外还有Apcache BVal。Bean Validation标准接口的原创 2020-12-25 15:04:44 · 1123 阅读 · 1 评论 -
重构——简化函数调用
Separate Query from Modifier(将查询函数和修改函数分离)某个函数既返回对象状态值,又修改对象状态;建立两个不同的函数,其中一个负责查询,另一个负责修改。动机如果某个函数只是向你传递一个值,没有任何看得到的副作用。那么你就可以任意调用这个函数,也可以把调用动作搬到函数的其他地方,简而言之,需要操心的事情少了。对于有副作用和无副作用两种函数之间的差异,下面是一条好规则:任何有返回值的函数,都不应该有看得到的副作用;对于看得到的副作用,最常见的优化办法是:将查询所得结果缓存于原创 2020-10-27 15:42:27 · 769 阅读 · 0 评论 -
重构——重新组织数据
Self Encapsulate Field(自封装字段)简介访问变量的好处:子类可以通过覆写一个函数而改变获取数据的途径;还支持更灵活的数据管理方式,如延迟初始化。直接访问变量的好处:代码比较容易阅读;如果你想访问超类中的一个字段,却又想在子类中将对这个变量的访问改为一个计算后的值,这时候就应该进行“字段自我封装”。值对象和引用对象之间的相互转换值对象和引用对象如果引用对象开始变得难以使用,也许就应该将它改为值对象,引用对象必须被某种方式控制,你总是必须向其控制者请求适当的引用对象。它们原创 2020-10-26 13:42:16 · 1132 阅读 · 0 评论 -
Java中带返回值的线程池Future
如何获取任务执行结果Java通过ThreadPoolExecutor提供的三个submit()方法和一个FutureTask工具类来支持获得任务执行结果的需求。// 提交Runnable任务Future<?> submit(Runnable task);// 提交Callable任务<T> Future<T> submit(Callable<T> task);// 提交Runnable任务及结果引用 <T> Futur原创 2020-10-19 17:45:11 · 2667 阅读 · 0 评论 -
Semaphore如何快速实现一个限流器
信号量是由大名鼎鼎的计算机科学家迪杰斯特拉(Dijkstra)于 1965 年提出,在这之后的 15 年,信号量一直都是并发编程领域的终结者,直到 1980 年管程被提出来,我们才有了第二选择。目前几乎所有支持并发编程的语言都支持信号量机制,所以学好信号量还是很有必要的。信号量模型信号量模型可以简单概括为:一个计数器、一个等待队列、三个方法。在信号量模型里,计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问它们,这三个方法分别是:init()、down()和up()。in.原创 2020-10-15 15:22:20 · 226 阅读 · 0 评论 -
Lock和Condition隐藏在并发包里的管程
Java SDK并发包通过Lock和Condition两个接口来实现管程(管程——并发编程的万能钥匙),其中Lock用于解决互斥问题,Condition用于解决同步问题。再造管程的理由既然Java里已经存在管程的实现synchronized并且做了许多优化,为什么还需要在并发包里开发Lock和Condition。原因是synchronized申请资源的时候,如果申请不到,线程直接进入阻塞状态,而线程进入阻塞状态,啥也干不了,也释放不了线程已经占有的资源。我们希望的是,对于“不可抢占”这个条件,占用部分原创 2020-10-15 14:29:12 · 245 阅读 · 0 评论 -
管程——并发的万能钥匙
参考原文:管程——并发万能钥匙什么是管程所谓管程,指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。Java采用的是管程技术,Synchronized关键字及wait()、notify()、notifyAll()这三个方法都是管程的组成部分。管程是一种概念,任何语言都可以使用,在Java中每个加锁的对象都绑定着一个管程。MESA模型在管程的发展史上,先后出现过三种不同的管程模型,分别是:Hasen模型、Hoare模型和MESA模型,目前广泛使用的是MESA模型,并且Java管程的实现原创 2020-10-14 14:32:33 · 215 阅读 · 0 评论 -
从不同角度分析过滤器和拦截器的区别
拦截器和过滤器什么是过滤器?过滤器是以链的形式在容器中处理的,这意味着它们可以在请求达到servlet之前对其进行访问,也可以在响应返回客户端之前对其进行拦截,这种访问使得过滤器可以检查并修改请求和响应的内容。什么是拦截器?拦截器是AOP的一种实现策略,用于在某个方法或字段被访问前对它进行拦截,然后在其之前或之后加上某些操作,同样,Interceptor也是链式调用,每个interceptor的调用会依据它声明顺序依次执行。过滤器中的接口方法init():在Servlet容器创建过滤器实例的原创 2020-09-28 11:35:19 · 376 阅读 · 0 评论 -
SpringBoot和redis的使用
spring-boot-starter-data-redisSpringBoot提供了对redis继承的组件包:spring-boot-starter-data-redis,依赖于spring-data-redis和lettuce,SpringBoot1.0默认使用的是Jedis客户端,2.0换成了Lettuce。Lettuce:是一个可伸缩线程安全的Redis客户端,多个线程共享同一个RedisConnection,它利用优秀Netty NIO框架来有效管理多个连接;Spring Data:是Sp原创 2020-08-23 16:21:52 · 227 阅读 · 0 评论 -
Spring Data JPA的使用
概念什么是JPAJPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供一种对象关联映射工具来管理Java应用中的关系数据,它的出现主要是为了简化现有持久化开发工作和整合ORM技术。Spring Data JPASpring Data JPA是Spring基于ORM框架、JPA规范的基础上封装的一套JPA应用框架,可以让开发者用极简的代理即可实现对数据的访问和操作,提供包括增、删、改、查等在内的常用功能。Spring Data JPA其实就是s原创 2020-08-23 14:48:00 · 253 阅读 · 0 评论 -
深入理解spring容器扩展点BeanFactoryPostProcessor
spring官网是这样描述BeanFactoryPortProcessor的:BeanFactoryPortProcessor可以对Bean配置元数据进行操作,也就是说,spring容器允许BeanFactoryPortProcessor读取指定Bean的配置元数据,并可以在Bean被实例花钱修改它,这个的配置元数据就是BeanDefination。我们可以配置多个BeanFactoryPortProcessor,并且只要我们配置的BeanFactoryPortProcessor实现了Ordered.原创 2020-08-20 11:57:26 · 266 阅读 · 0 评论 -
Java多线程案例
两个线程交替运行public class WaitAndNotify { public static Object lock = new Object(); static class ThreadA implements Runnable{ @Override public void run() { synchronized (lock){ for (int i = 0; i < 5; i++)原创 2020-08-18 09:02:08 · 138 阅读 · 0 评论 -
Java并发编程——AQS(Abstract Queued Synchronizer)
AQS简介AQS是AbstractQueuedSynchronizer的简称,即抽象队列同步器;是一个用来构建锁和同步器的框架。AQS的数据结构AQS内部使用了一个volatile的变量state来作为资源的标识,同时定义了几个获取和改版state的protected方法,子类可以覆盖这些方法来实现自己的逻辑:getState();setState();compareAndSetState();这三种操作均是原子操作,其中compareAndSetState的实现依赖于Unsafe的comp原创 2020-08-17 16:52:09 · 217 阅读 · 0 评论 -
Spring BeanDefinition
什么是BeanDefinitionBeanDefination包含了我们对bean做的配置,比如XML<bean/>标签的形式进行配置;Spring将我们对bean的定义信息进行了抽象,抽象后的实体就是BeanDefinition,并且Spring会以此作为标准来对Bean进行创建;BeanDefinition包含以下元数据:一个全限定类名,通常来说,就是对应的bean的全限定类名;bean的行为配置元素,这些元素展示了这个bean在容器中是如何工作的,包括scopelifec原创 2020-08-17 15:34:17 · 482 阅读 · 0 评论 -
Java中的阻塞队列
BlockingQueue 是Java.util.concurrent包下重要的数据结构,区别于普通的队列,BlockingQueue提供了线程安全的队列访问方式,并发包下很多高级同步类的实现都是基于BlockingQueue实现的,一般用于生产者-消费者模式,生产者就是往队列里添加元素的线程,消费者是从队列里拿元素的线程,BlockingQueue就是存放元素的容器。BlockingQueue的操作方法阻塞队列提供了四组不同的方法用于插入、移除、检查元素:处理方法抛出异常返回特殊值.原创 2020-08-17 10:14:55 · 158 阅读 · 0 评论 -
深入理解JVM——字节码
字节码意义字节码存在的意义就是解决Java跨平台问题,一次编写,到处执行。在不同的操作系统、不同硬件平台上,均可以不同修改代码即可顺畅地执行。作为Java与操作系统的中间码,成功解耦了语言对平台的依赖性。什么是字节码Java所有的指令有200个左右,一个字节(8位)可以存储256中不同的指令信息,一个这样的字节称为字节码。在执行过程中,JVM将字节码解释执行,屏蔽对底层操作系统的依赖,JVM也可以将字节码编译执行,如果是热点代码。会通过JIT动态地编译为机器码,提高执行效率。字节码主要指令1、加原创 2020-08-12 15:49:39 · 467 阅读 · 0 评论 -
设计模式——应用场景
单例模式应用场景1、系统只需要一个对象;2、客户调用类的单个实例只允许使用一个公共访问点,除了该访问点,不能通过其他途径访问该实例。适配器模式应用场景1、系统需要使用一些现有的类,而这些类的接口不符合系统的要求,甚至没有这些类的源代码;2、想创建一个可以重复的类,用于与一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作。...原创 2020-07-07 09:23:06 · 1284 阅读 · 0 评论 -
Apollo学习笔记——入门
核心概念application(应用)实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置,每个应用都需要有一个唯一的身份标识——appId。environment(环境)配置对应的环境,比如开发环境、测试环境、生产环境等,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而获取相应的配置。同一份代码部署在不同的环境就应该能够获取到不同环境的...原创 2019-12-18 14:39:36 · 670 阅读 · 0 评论 -
单元测试——各种方法行为怎么mock
mock被测试方法中多次调用的方法行为情景描述:在被测试方法中多处调用Utils工具类的checkCollection方法,并且每次返回的结果不同;解决方法:在when后面跟上多个thenReturn表示第几次调用返回结果;PowerMockito.when(Utils.checkCollection(companyList)) .thenReturn(t...原创 2019-12-04 17:11:27 · 5258 阅读 · 0 评论 -
使用maven命令将项目打成war包部署到tomcat上运行
安装插件<plugins> <!-- Force Java 7 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <...原创 2019-12-03 17:04:55 · 1285 阅读 · 0 评论 -
Java——面向对象(三) 封装、继承、多态
隐藏与封装前面程序中经常出现通过某个对象直接访问成员变量的情形,这可能引起一些潜在的问题,比如将一个人的年龄设置为1000。显然这是违背现实的,因此java推荐将类和对象的成员变量进行封装。什么是封装?封装是面向对象的三大特性之一,它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对信息的操作和访问。封装的好处隐藏类的实现细节;...原创 2018-10-11 11:14:56 · 364 阅读 · 0 评论 -
Java语言是解释型还是编译型语言
Java语言是解释型还是编译型语言?Java的运行过程Java源文件(*.java)通过java编译器(javac)编译成一个ByteCode字节码文件(*.class),字节码由java自己设计的一个计算机JVM解释执行,虚拟机将每一条要执行的字节码送给解释器没解释器将其翻译成特定机器上的目标机器码,然后再特定机器上运行。JVMjava的跨平台是基于JVM的。JVM是一台计算机上由软件或...原创 2018-10-02 22:06:31 · 1217 阅读 · 0 评论 -
解释型语言和编译型语言的区别
产生原因因为计算机是不能直接理解和识别高级编程语言的,更不能执行高级语言。它只能直接理解机器语言,所以在计算机上执行高级语言都会先将高级语言经过层层转换成机器语言。两种转换方式:编译解释转换流程编译型语言概述使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行程序的格式。特性编译和执行是分开的,但是...原创 2018-10-02 22:00:46 · 748 阅读 · 0 评论 -
Java——语言基础(一)常量、变量、进制和数据类型
常量什么是常量?就是在程序的执行过程中其值不发生改变的量;java中常量的分类字面值常量自定义常量字面值常量的分类字符串常量:用双括号括起来的内容;整数常量:所有整数;小数常量:所有小数;字符常量:用单括号引起来的内容;布尔常量:较为特有,只有True和False空常量:null进制概述什么是进制?人们对定的一种进位方法。对任何一种进制——X进制就表示某一位置...原创 2018-09-25 22:32:30 · 183 阅读 · 0 评论 -
Java——初识
发展史创始人:詹姆斯.高斯林(James Gosling)Java Development Kit1.0.21.1.1-&amp;amp;gt;1.1.6-1.1.7-&amp;amp;gt;1.1.81.2.1Java 2 SDK1.2.21.3.0-&amp;amp;gt;1.3.11.4.0-&amp;amp;gt;1.4.1-&amp;amp;gt;1.4.2-&amp原创 2018-09-24 23:27:51 · 147 阅读 · 0 评论 -
jdk的安装及配置
下载安装包官方网址:下载jdk本人使用1.8版本安装点击安装包进行安装更改安装路径为D:\JDK\继续点击下一步进行安装。配置环境变量分为用户的环境变量:只能供一个用户使用;系统环境变量:在整个系统中生效;所以我们使用系统的环境变量;打开步骤如下:添加路径:再将变量名添加到系统路径中建议将java的变量名上移,这样如果经常使用的话命令查找速度较快;打开命令交...原创 2018-09-24 12:26:38 · 196 阅读 · 0 评论 -
Java——语言基础(二)运算符、键盘录入和流程控制语句
运算符什么是运算符?对常量和变量进行操作的符号称为运算符。运算符的分类算数运算符:+、-、*、/、%、++、–++、–单独使用放在操作数前面和后面效果一样;参与运算放在操作数的前面,先自增或自减,然后再参与运算;-放在操作书后面,先参与运算再自增或自减;赋值运算符:=、+=、-=、*=、/=、%=比较运算符:==、!=、&lt;、&gt;、&lt;=、&gt...原创 2018-10-05 11:52:04 · 209 阅读 · 0 评论 -
Java——垃圾回收机制
显式回收垃圾需要程序员负责回收已经分配的内存。缺点:程序忘记及时回收无用的内存,从而导致内存泄露,降低系统的性能;程序错误地回收程序核心类库的内存,从而导致系统崩溃。什么是垃圾回收机制?在Java中不需要程序员直接控制回收,Java程序的内存分配和回收都是有JRE在后台自动进行的,JRE负责回收那些不再使用的内存,这种机制称为:垃圾回收。通常JRE会提供一个后台线程来监测和控制,一...原创 2018-10-06 15:59:24 · 170 阅读 · 0 评论 -
Java——语言基础(三)方法
为什么要有方法?对一段程序进行封装,使这段程序可以反复使用而不用再重复编写,下一次使用的时候直接调用该方法。什么是方法?方法就是完成特定功能的代码块,在很多语言中都有函数的定义,在java称之为方法。定义一个方法// 定义一个求两个数之和的方法 /*public是这个方法的修饰符; * int 代表的是这个方法返回值的类型;如果无返回值,则定义为void空类型 ...原创 2018-10-06 16:02:06 · 114 阅读 · 0 评论 -
Java——数组
什么是数组?数组是编程语言中一种常见的数据结构,可以用于储存多个数据,每个数组元素存放一个数据。也可把它看做一个存放数据的容器,数组既可以存储基本数据类型,也可以存储引用数据类型。但是一个数组中只能存储一种数据类型的数据。定义数组格式:格式1:数据类型[] 数组名;实例:int[] a; 定义了一个int类型的数组a;格式2:数据类型 数组名[];实例 int a[]; 同上;通...原创 2018-10-07 11:05:52 · 348 阅读 · 0 评论 -
Java引用变量的强制类型转换
引用变量的强制类型转换为什么强制转换类型?多太的弊端是不能使用子类特有的功能;用向下转型来解决这个问题,即把父类的引用强制转换为子类的引用。格式(转换的类型)要转换的对象(type)variable将variavle转换成type类型的变量基本类型之间的转换只能在数值类型之间,这里所说的数值类型包括整数型、字符型和浮点型,不能和布尔类型相互转换。引用类型之间的转换只能在具有继...原创 2018-10-16 11:49:52 · 2034 阅读 · 0 评论 -
抽象类和接口
抽象类什么是抽象类?只包含抽象的概念,比如只给出动物类,具体是哪个动物不做具体解释,其中包含抽象方法,比如只包含睡觉这个方法,具体什么时间睡,睡多长时间不指明,等到在子类中继承这个抽象类之后再根据子类对象的不同来设定。抽象方法和抽象类抽象方法和抽象类必须使用abstract修饰符来修饰,有抽象方法的类一定是抽象类,但是抽象类中可以不包含抽象方法。格式抽象类格式:abstract c...原创 2018-10-16 20:51:37 · 310 阅读 · 0 评论 -
Java——面向对象(一)
面向对象思想面向对象相比于面向过程是一种更优秀的程序设计方法,它的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。它从现实世界中的客观存在的事物为中心来思考,认识问题。并根据这些事物的本质特点。把它们抽象地表示为系统的类作为系统的基本构成单元。面向对象与面向过程理解针对“猪八戒吃西瓜”这件事;在面向过程中,一切以函数为中心,函数最大;可以描述为:吃(猪八戒,西瓜)在面...原创 2018-10-10 13:35:22 · 232 阅读 · 0 评论