自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java基础之SPI机制

SPI 机制,全称为 Service Provider Interface,是一种服务发现机制。它通过在 ClassPath 路径下的 META-INF/services 文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在 Dubbo、JDBC 中都使用到了 SPI 机制。本文介绍了 Java SPI 机制以及在模块化和非模块话项目中的实现方式(此处的模块化指 Java9 引入的模块化)SPI 机制介绍SPI 全称 Service Provider Interface

2021-09-06 16:09:28 359

原创 java基础之AQS

Java开发中,我们的应用程序经常会使用多线程提高程序的运行效率,多线程情况下访问线程共享变量可能会带来并发问题,此时就需要并发锁解决并发问题。Java提供了两种类型的并发控制机制:synchonrized关键字和AQS框架,二者各有优势,不过在加锁解锁场景比较灵活的情况下,我们往往会采用AQS框架来解决并发问题。本文会对Java中的AQS框架的结构和源码进行简单介绍。本文大多数内容参考了这篇博客AQS结构AQS的全称是AbstractQueuedSynchronizer(抽象的队列式的同步器),A

2021-09-05 15:01:10 485

原创 Java基础之代理模式

代理模式是常见的设计模式之一,意图在为指定对象提供一种代理以控制对这个对象的访问。Java中的代理分为动态代理和静态代理,动态代理在Java中的应用比较广泛,比如Spring的AOP实现、远程RPC调用等。静态代理和动态代理的最大区别就是代理类是JVM启动之前还是之后生成。本文会介绍Java的静态代理和动态代理,以及二者之间的对比,重点是介绍动态代理的原理及其实现。代理模式代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以

2021-09-05 10:39:10 113

原创 Java基础之类加载器

Java类加载器是用户程序和JVM虚拟机之间的桥梁,在Java程序中起了至关重要的作用,理解它有利于我们写出更优雅的程序。本文首先介绍了Java虚拟机加载程序的过程,简述了Java类加载器的加载方式(双亲委派模式),然后介绍了几种常见的类加载器及其适用场景,最后则一个例子展示了如何自定义类加载器。本文很多地方参考了java官方文档关于虚拟机加载的教程,点此直达官方参考文档基本概念基本文件类型和概念常见概念介绍:java源文件(.java):.java是Java的源文件后缀,里面存放程序员编写的功

2021-09-04 18:22:16 239

原创 Java基础之BeanInfo

Java的BeanInfo在工作中并不怎么用到,我也是在学习spring源码的时候,发现SpringBoot启动时候会设置一个属叫"spring.beaninfo.ignore",网上只能搜索到这个配置的意思是是否跳过java BeanInfo的搜索,没找到其他信息,但是BeanInfo又是什么呢?JavaBean介绍维基百科JavaBean的定义:JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter

2021-09-04 10:56:21 561 1

原创 操作系统IO之零拷贝技术

磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。本文会分析 I/O 工作方式,以及如何优化传输文件的性能。参考博客如下:内容提纲本会从以下几个方面介绍磁盘的IO技术:DMA之前的IO方式直接内存访问——DMA技术。DMA文件传输存在的问题。如何提高文件传输的性能。零拷贝实现原理分析。Pa

2021-09-03 20:07:32 194

原创 操作系统的IO模型

IO操作根据设备类型一般分为内存IO,网络IO,和磁盘IO。其中内存IO的速度大大快于后两者,计算机的性能瓶颈一般不在于内存IO. 尽管网络IO可通过购买独享带宽和高速网卡来提升速度,可以使用RAID磁盘阵列来提升磁盘IO的速度,但是由于IO操作都是由系统内核调用来完成,而系统调用是通过cpu来调度的,而cpu的速度远远快于IO操作,导致会浪费cpu的宝贵时间来等待慢速的IO操作。为了让cpu和慢速的IO设备更好的协调工作,减少CPU在IO调用上的消耗,逐渐发展出各种IO模型。IO模型IO步骤I/

2021-09-03 16:41:22 197

原创 小明学Spring Framework容器启动系列——Bean名称生成策略

Spring BeanBean名称生成策略1. 前言2. Bean名称生成策略2.1 默认Bean名称生成策略2.2 注解Bean名称生成策略2.3 类全称的bean名称策略1. 前言Spring容器中,每一个Bean都必须要有一个唯一的名称,这个名称就是Bean在容器中的唯一标识,查找或者修改Bean的都必须要通过Bean名称这个唯一索引进行(我们知道Spring容器可以通过Bean名称和类型查找Bean,即使是按照Bean的类型查找Bean,也会先根据Bean的类型查找Bean的名称,然后再根据b

2021-03-16 15:13:29 360 5

原创 小明学Spring基础系列——Bean封装之BeanWrapper

从字面意思理解,Spring的BeanWrapper是对Spring Bean进行封装打包的类,在对Bean封装打包得到BeanWrapper对象之后,我们就可以通过BeanWrapper访问Bean的属性和方法

2021-03-14 16:41:12 1874

原创 小明学Spring基础系列——@Autowired实现原理

1 前言Spring的@Autowired应该是我们在使用Spring框架过程中使用的最多的注解之一,本文就SpringBean生产过程中,如何实现Autowired自动注入进行解析,@Autowire一共有两种注入方式:属性注入和构造函数注入,这两种注入方式的实现流程不同,所以本文也会分情况进行讨论,了解@Autowire注入方式的实现之前,大家需要大概了解SpringBean的生产流程,在我的另外一篇博客中有比较详细的介绍。...

2021-03-12 19:29:09 214

原创 小明学Spring基础系列——Spring Bean定义的继承体系

1. 前言Spring体系中,Bean是一切的基础,在我的另外一篇博客中,我已经对Bean的定义包含的内容进行了简单的介绍,但是Spring的bean定义有着复杂的体系,本文将重点对Spring中的各种Bean功能进行简单介绍。Spring中Bean定义的继承结构如下图所示,其中Spring创建Bean使用的Bean定义为RootBeanDefinition,用户自定义Bean最常使用的为GenericBeanDefinition。2. Bean定义的注册我们在使用Spring框架的时候,往往会使用

2021-03-12 19:04:53 211

原创 小明学Spring基础系列——Bean的生产

1. 前言Spring的核心特性就是控制反转(IOC)和切面编程(AOP),Spring通过IOC容器来实现这些特性,IOC容器中,用户定义的对象以Bean的形式存放,然后由Spring解决Bean之间的依赖关系,并且对Bean进行代理从而实现AOP编程。Spring中的Bean由BeanFactory生产,生产流程比较复杂,因为在生产过程中需要解决Bean之间的依赖、Bean的作用域、Bean的实例化前后处理、Bean的初始化前后处理等步骤,最后才能得到一个装配完全的Bean。本文的重点就是讲述一下Be

2021-03-10 17:35:44 228

原创 小明学Spring Framework容器启动系列——容器启动的收尾工作

1. 前言写到这一章,我自己都有一种轻松的感觉,Spring容器到这里已经基本启动完成,容器已经构建完成,剩下的工作就是打扫战场了,比如清理资源加载器的缓存、初始化BeanFacotry的生命周期管理器、发布对应的容器Refresh事件等。这个阶段是Spring容器启动的最后一步,如下图中的红色方框部分所示。...

2021-03-02 15:53:51 150

原创 小明学Spring Framework容器启动系列——BeanFactory的初始化完成

1. 前言在前面的文章中,我们说过Spring容器最重要的组件之一就是BeanFactory,并且简单介绍了BeanFactory的初始化,初始化完成的BeanFactory已经可以执行getBean等操作,但是对于Spring容器来说,会要求BeanFactory在初始化完成之后生成一些常用的Bean,并且要冻结Bean定义的注册。...

2021-03-02 11:24:45 239

原创 小明学Spring Framework容器启动系列——国际化与事件的初始化

1. 前言Spring的容器叫ApplicationContext,他的本质其实就是一个BeanFactory,那它和BeanFactory有哪些主要的不同之处呢?这就涉及到本文将的重点:国际化与事件,当然除了这两个特性ApplicationContext还有很多其它特性。本文重点介绍Spring容器启动过程中的国际化与事件两个功能的初始化,该环节在整个Spring容器启动过程中的位置如图中的红色方框部分所示。...

2021-02-26 18:03:42 158

原创 小明学Spring Framework容器启动系列——BeanPostProcessor和BeanFactoryPostProcessor的初始化

1. 前言Spring容器中的BeanFactory用来生成各种Bean,但是如果用户需要在生成Bean的过程中进行一些进行一些自定一加工,就需要用到BeanPostProcessor和BeanFactoryPostProcessor。其中BeanFactoryPostProcessor用于对Bean的定义进行处理,比如增加或者修改Bean的定义,而BeanPostProcessor用于对Bean的实例化前后进行处理。那么这些处理器是什么时候添加到Bean的容器中生效的呢?这些处理器的初始化环节在整个Sp

2021-02-25 18:05:15 420

原创 小明学Spring Framework容器启动系列——BeanFactory的初始化

前言Spring容器最重要的功能就是实现Bean的管理,而BeanFactory是创建Spring容器中Bean的工具,在Spring容器中占据很重要的作用。在Spring容器Refresh的过程中,需要根据用户配置创建各种类型的Bean,也就是要用到BeanFactory,所以在Spring容器Refresh之前需要初始化BeanFactory,本文重点介绍Spring容器Refresh环节中BeanFactory的初始化,该环节在整个Spring容器启动过程中的位置如图中的红色方框部分所示。...

2021-02-25 14:29:48 342

原创 小明学Spring Framework容器启动系列——容器PrepareRefresh

前言Spring容器启动过程中最重要的步骤是Refresh容器(本文不详细介绍容器的Refresh阶段,会在其它博客中详细介绍容器的Refresh),但是Refresh容器之前需要有一些准备工作,如初始化属性、环境校验以及初始化earlyApplicationListeners事件监听列表等操作,这些准备工作位于PrepareRefresh阶段,该阶段在整个Spring容器启动过程中的位置如图中的红色方框部分所示。PrepareRefresh包含的步骤Spring容器prepareRefresh阶段

2021-02-24 10:54:49 448 3

原创 小明学Spring Framework容器启动系列——Bean定义的注册

Spring Bean定义的注册前言前言Spring容器的构建过程是自动化的,意味着用户写好容器的定义之后,Spring容器可以自动根据用户的定义装配好容器。在我的其它博客中,简述了如何读取、解析Spring的xml文件和注解定义,通过以上步骤得到的Spring定义只是一个对象,并没有把这些Bean定义注册到Spring容器中,本文讲简述Spring如何将Bean定义注册到容器中。Bean定义的注册在整个Spring容器启动过程中的位置如图中的红色方框部分所示。...

2021-02-22 17:46:48 190 4

原创 小明学Spring基础系列——XML容器和注解容器的区别

前言Spring容器有两种定义方式,一种是使用XML文件定义,另外一种是Spring 2.5引入的java注解定义。两种容器定义的方式各有优缺点,由于SpringBoot使用的是注解形式的容器,所以近几年使用比较多的Spring容器定义是注解定义。本文将从这两种容器定义的实现方式、不同之处、优缺点等多方面介绍两种容器。下图为Spring容器定义的类型示例:对于不同形式定义的Spring容器,Spring有不同类型的容器名称,下图中列举了几种常见的Spring容器:XML容器和注解容器实现的区别对

2021-02-21 23:17:02 401

原创 小明学Spring Framework容器启动系列——Bean定义的解析

Spring Bean定义的解析系列文章——小明学Spring Framework容器启动系列前言系列文章——小明学Spring Framework容器启动系列小明学Spring Framework容器启动系列——Spring Framework容器启动概览小明学Spring Framework容器启动系列——Bean定义的读取小明学Spring Framework容器启动系列——Bean定义的解析小明学Spring Framework容器启动系列——Bean定义包含的信息概要小明学Spri

2021-02-13 20:49:40 183

原创 小明学Spring Framework容器启动系列——Bean定义的读取

Spring Bean定义的读取系列文章——小明学Spring Framework容器启动系列前言系列文章——小明学Spring Framework容器启动系列小明学Spring Framework容器启动系列——Spring Framework容器启动概览小明学Spring Framework容器启动系列——Bean定义的读取小明学Spring Framework容器启动系列——Bean定义的解析小明学Spring Framework容器启动系列——Bean定义包含的信息概要小明学Spri

2021-02-05 17:15:13 178

原创 小明学Spring Framework容器启动系列——Spring Framework容器启动概览

Spring Framework容器被广泛的应用与JEE开发,本系列文章主要针对Spring Framework容器启动过程中进行分析和学习

2021-02-05 15:48:20 242

原创 小明学Spring基础系列——Spring Bean定义的介绍

Spring 容器和Spring Bean一、 前言二、 Spring容器2.1 Spring的BeanFactory2.2 ApplicationContext三、Spring的Bean3.1 SpringBean定义3.2 Spring Bean的名称3.3 SpringBean的实例化方法3.4 SpringBean的作用域3.5 Bean生命周期中的回调方法一、 前言学习Spring其实就是学习Spring容器的过程,而Spring容器最重要的作用又是实现Spring Bean的管理,所以这两个

2021-01-21 18:22:13 255

原创 小明学Spring基础系列——容器的IOC和DI概念

Spring IOC容器和Spring Bean详解一、Spring IOC容器介绍1.1 IOC容器做了什么1.2 配置IOC容器的方法二级目录三级目录一、Spring IOC容器介绍1.1 IOC容器做了什么1.2 配置IOC容器的方法二级目录三级目录

2021-01-06 12:03:35 228

原创 小明学Spring基础系列——Bean的作用域

SpringBean生命周期解析Spring Bean生命周期类型Spring Bean生命周期类型

2020-12-31 09:46:50 196 2

原创 小明学Spring基础系列——资源文件加载

Java提供了标准java.net.URL用于资源访问,然而URL不足以满足各种资源文件的访问,例如没有办法访问类相对路径或者相对于ServletContext的资源等,Spring 提供一个Resource接口来统一这些底层资源一致的访问

2020-12-18 17:16:12 160 1

原创 小明学Spring基础系列——BeanInfo内省与Spring BeanUtil

一、前言Java的BeanInfo在工作中并不怎么用到,我也是在学习spring源码的时候,发现SpringBoot启动时候会设置一个属叫"spring.beaninfo.ignore",网上只能搜索到这个配置的意思是是否跳过java BeanInfo的搜索,没找到其他信息,但是BeanInfo又是什么呢?二、JavaBean介绍维基百科JavaBean的定义:JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和

2020-12-08 10:09:17 1530 1

原创 小明学java基础系列——反射类型Type

一、前言Type是Java 编程语言中所有类型的公共高级接口,也就是Java中所有"类型"的父类。注意区分Type和Object:Type :java所有类型的父类,如所有Class,数组,泛型,这些类型都继承了Type,在java反射中使用比较多.Object:java所有的对象的父类。官方文档:Type is the common superinterface for all types in the Java programming language. These include raw t

2020-10-30 18:11:47 453 2

原创 小明学数据库系列——树形查询结构设计

前言树形结构是生活中常见的数据结构之一,如公司的组织结构、计算机文件的目录结构和家庭族谱等。本文将以区域作为示例,介绍几种常见的数据库实现树形查询的方式:树形结构的关键属性:深度方案一、毗邻目录模式(adjacency list model)1.1 方案原理毗邻目录模式在树形结构数据的每条记录中,记录了指向父数据的记录,如下图所示:idnameparent1上海中国2浦东上海查询情况1:当我们需要查询上海的直接父区域时,通过以下Sql查询:sele

2020-10-18 12:31:45 535

原创 小明学SpringBoot系列——上下文环境属性加载

一、简介Spring上下文环境(ConfigurableEnvironment)主要包含应用程序运行环境的两个关键方面:设置配置文件(profiles)和基本属性(PropertySources)。官方文档介绍: Configuration interface to be implemented by most if not all Environment types. Provides facilities for setting active and default profiles and ma

2020-09-24 18:20:53 907

原创 小明学Spring基础系列——Spring Factories机制

Spring Factories是一种类似于Java SPI的机制,它在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。

2020-09-16 21:11:23 1066 3

原创 小明学java基础系列——Java SPI机制

一、SPI机制介绍SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。1.1 SPI和API的区别API (Application Programming Interface)在大多数情况下,都是实现方制定接口并完成对接口的实现,调用方仅仅依赖接口调用,且无权选择不同实现。 从使用人员上来说,API 直接被应用开发人员使用。SPI (Service

2020-09-15 14:25:22 216

原创 小明学java基础系列——Java 类加载

Java11类加载学习笔记前言类加载器基本概念java.lang.ClassLoader 类介绍类加载器的树状组织结构类加载器的代理模式加载类的过程线程上下文类加载器Class.forName开发自己的类加载器文件系统类加载器网络类加载器类加载器与 Web 容器前言类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。J

2020-09-05 20:57:52 416

原创 @FeignClient Eureka 调用方法时地址保护服务名称

1. 问题描述使用springboot+eureka+openfeign进行服务的注册与发现,使用过程中发现@FeignClient注解的服务显示调用信息为[405] during [GET] to [http://user-manage/user/manage/get/user/password](user-manage为服务名称),而不是ip形式http://xx.xx.xx.xx:8003/user/manage/get/user/password,并且接口调用失败2. 现场恢复2.1 e

2020-08-19 17:29:02 1223

原创 mvn管理flyway数据库版本

maven 的pom添加flyway插件<!-- flyway数据库版本管理插件,用于单测时生成数据库--><plugin> <groupId>org.flywaydb</groupId> <artifactId>flyway-maven-plugin</artifactId> <vers...

2019-07-29 20:08:56 227

原创 shell脚本ssh远程服务器批量登录测试 无Expect

网上很多教程shell脚本远程ssh登录都需要Expect控件,然而实际环境有时候可能不允许安装Expect,本文设计了一个批量测试ssh登录的脚本,ssh 有个环境变量,SSH_ASKPASS ,设置了这个环境变量,并且当前会话不是终端时,ssh 在认证时会启动这个程序,从这个程序的标准输出来读取密码。这个功能本来是用于图形终端的,所以还要设置另一个环境变量 DISPLAY=’none:...

2019-01-13 21:52:39 4288 1

空空如也

空空如也

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

TA关注的人

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