地表最强菜鸡
这个作者很懒,什么都没留下…
展开
-
Springboot基于Java动态编译实现项目动态加载class文件
在IDE中运行springboot 程序 类加载器是JDK自带的,类加载器已经完成了依赖jar的加载,所以编译是没问题的,但是springboot 用的是springboot自己写的LaunchedURLClassLoader。因为技术都是为业务服务的,所有的功能开发出来都需要有他的用途;-------------------------------------------------------正确写法分割线------------------------------------------------原创 2024-07-12 09:40:54 · 1646 阅读 · 2 评论 -
Istio 使用Spring Boot + GRPC构建部署微服务
作为和云原生技术的忠实拥护者,我却一直没有开发过Service Mesh的应用。正好最近受够了Spring Cloud的“折磨”,对Kubernetes也可以熟练使用了,而且网上几乎没有Spring Boot微服务部署到Istio的案例,我就开始考虑用Spring Boot写个微服务的Demo并且部署到Istio。项目本身不复杂,就是发送一个字符串并且返回一个字符串的最简单的Demo。原创 2022-10-08 15:55:54 · 2288 阅读 · 0 评论 -
SpringBoot Grpc插件自动PROTO文件生成代码
在 src/main/proto 目录下放 helloworld.proto 文件代码组织结构。原创 2023-09-21 11:43:09 · 1098 阅读 · 2 评论 -
SpringBoot 删除指定文件夹或文件
package com.example.controller; import org.springframework.util.FileSystemUtils;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestC原创 2023-09-21 11:40:50 · 658 阅读 · 0 评论 -
SpringBoot MongoDB GridFsTemplate实现文件管理
总体来说,GridFsTemplate提供了方便的API和高度可扩展的存储方案,使得在MongoDB中存储和检索大型文件变得更加容易和高效。原创 2023-09-12 10:04:39 · 804 阅读 · 0 评论 -
SpringBoot 基于 MongoTemplate 的工具类
MongoDB基于分布式文件存储的数据库。由C++语言编写。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。原创 2023-09-12 10:02:05 · 823 阅读 · 0 评论 -
SpringBoot @Autowired注解的使用
可以把@Autowired的属性required设置成为false,此时spring会自己选择使用哪一种构造方法;1.会优先考虑参数多的(先ByType找到多个该类型的bean,再ByName进行注入)2.如果多个类型的bean按照ByName无法注入,则去考虑参数少的进行注入,依次类推;3.在参数个数相同、ByName,也可以注入的情况下,按照构造方法的书写顺序进行选择;在同一个类上有多个构造方法上使用了@Autowired,默认情况下会报错;原创 2023-06-09 15:41:16 · 1235 阅读 · 1 评论 -
Springboot Netty 实现自定义协议
Netty是由JBOSS提供的一个java开源框架,现为上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程。原创 2023-04-24 08:53:29 · 782 阅读 · 0 评论 -
SpringBoot 集成 Emqx 发布/订阅数据
到此SpringBoot 集成 Emqx 发布/订阅数据介绍完成。最近项目中用到Emqx发布/订阅数据,特此记录便于日后查阅。原创 2023-04-12 16:27:01 · 885 阅读 · 0 评论 -
Springboot @EventListener事件监听
推送customEvent类的消息,就会被CustomEventListener类中,标志@EventListener注解的方法所接受,并执行被注解方法的代码。@EventListener(CustomEvent.class)表示监听CustomEvent类的信息,如果流程。原创 2023-03-20 13:42:18 · 115 阅读 · 0 评论 -
SpringBoot Spring MVC
这个注释的意思是,当调用这个方法的时候,会从一个名叫accountCache的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象。作用:@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据,需要注意的是,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。原创 2023-03-17 13:47:11 · 5845 阅读 · 0 评论 -
SpringBoot AOP、事务
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。假如当前正要运行的事务不在另外一个事务里,那么就起一个新的事务 比方说,ServiceB.methodB的事务级别定义PROPAGATION_REQUIRED, 那么因为执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务。注解是不能继承的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。原创 2023-03-17 13:47:52 · 884 阅读 · 0 评论 -
SpringBoot IOC容器的高级特性
通过对autowiring自动装配特性的理解,我们知道容器对Bean的自动装配发生在容器对Bean依赖注入的过程中。可以看出,如果设置了lazy-init属性,则容器在完成Bean定义的注册之后,会通过getBean方法,触发对指定Bean的初始化和依赖注入过程,这样当应用第一次向容器索取所需的Bean时,容器不再需要对Bean进行初始化和依赖注入,直接从已经完成实例化和依赖注入的Bean中取一个现成的Bean,这样就提高了第一次获取Bean的性能。工厂后处理器也是容器级的。原创 2023-03-17 13:44:49 · 516 阅读 · 0 评论 -
SpringBoot IOC容器的依赖注入流程
可以看出,对使用工厂方法和自动装配特性的Bean的实例化相当比较清楚,调用相应的工厂方法或者参数匹配的构造方法即可完成实例化对象的工作,但是对于我们最常使用的默认无参构造方法就需要使用相应的初始化策略(JDK 的反射机制或者 CGLib)来进行初始化了,在方法getInstantiationStrategy().instantiate()中就具体实现类使用初始策略实例化对象。如果 Bean定义的是原型模式(Prototype),则容器每次都会创建一个新的实例对象。原创 2023-03-17 13:43:49 · 837 阅读 · 0 评论 -
SpringBoot IOC容器的初始化流程
在Spring配置文件中,对元素中配置的array、list、set、map、prop等各种集合子元素的都通过上述方法解析,生成对应的数据对象,比如ManagedList、 ManagedArray、ManagedSet 等,这些Managed类是Spring对象BeanDefiniton的数据封装,对集合数据类型的具体解析有各自的解析方法实现,解析方法的命名非常规范,一目了然,我们对集合元素的解析方法进行源码分析,了解其实现过程。什么是Spring bean的建模对象呢?原创 2023-03-17 13:42:41 · 799 阅读 · 0 评论 -
SpringBoot IOC、DI、@Autowired、@Resource、作用域
Autowired注解原理:在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。Spring通过一个配置文件(xml,表示Bean关系方式的一种),描述Bean及Bean之间的依赖关系,利用反射功能实例化Bean并建立Bean之间的依赖关系。Spring IoC容器如何知道哪些是它管理的对象呢?原创 2023-03-17 13:43:43 · 935 阅读 · 0 评论 -
SpringBoot MVC九大组件的初始化
因为SpringMVC中的Handler可以是任意的形式,只要能处理请求就ok,但是Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法。FlashMap继承自HashMap,除了用于HashMap的功能和设置有效期,还可以保存Redirect后的目标路径和通过url传递的参数,这两项内容主要用来从Session保存的多个FlashMap中查找当前的FalshMap。Spring MVC的主题就是一些静态资源的集合,即包括样式及图片,用来控制应用的视觉风格。原创 2023-03-17 13:08:24 · 439 阅读 · 0 评论 -
SpringBoot自定义参数解析器HandlerMethodArgumentResolver应用详解
上面我们介绍了HandlerMethodArgumentResolver的实现原理,有时候我们也需要自定义一个参数解析器解析某个参数,比如开发中有时候我们需要获取用户的登录信息校验权限,每个需要校验权限接口都写个一段获取用户信息的逻辑这样有些冗余,这时我们可以自定义一个参数解析器去解析用户登录信息并封装成存储用户信息实体的对象。要解析的方法参数对象,可以从对象获取参数的属性(如参数的类型,所修饰的注解等)参数解析的具体实现逻辑,最后返回参数具体解析后封装的对象。原创 2023-03-17 12:59:27 · 909 阅读 · 0 评论 -
SpringBoot Bean生命周期
首先Spring在实例化Bean的时候,会先调用它的构造函数,进行Bean的实例化,然后进行Bean的初始化,Bean的初始化经过三个阶段初始化之前(至此,我们Bean的生命周期探索初步结束,后面再做进一步深入学习,在学习本节课时要多进行调试,断点跟踪,会更加有效果。然后就开始利用Bean进行业务逻辑处理,最后容器正常关闭,Spring开始销毁Bean,Bean的销毁过程相对比较简单,调用。注:Spring Boot Bean的生命周期,什么是Bean的生命周期,就是Bean从创建到销毁的过程。原创 2023-03-17 12:33:02 · 460 阅读 · 0 评论 -
SpringBoot 热加载Jar包
springboot 的程序一般打包程成jar包。我们有些情况下,我们需要对程序进行扩展,我们没办法对已打包的程序进行修改。这样我们就实现了动态扩展,使用这种方式,我们就可以使用插件的方式对我们的微服务应用进行扩展。动态加载这些jar包,让后将我们的类动态注册到spring容器中。在扩展包时,我们引入接口包。实现接口后,打成JAR包。2.3 动态加载JAR包。将我们的一些接口打包。我们将这个接口打包。原创 2023-02-23 10:06:51 · 1311 阅读 · 0 评论 -
SpringBoot的自动装配原理、自定义Starter与SPI机制
在resources目录下,新建META-INF\services目录,在services目录底下新建com.yang.ym.spi.Log目录,即接口的全限定名,在该全限定名目录底下,以实现类的全限定名新建两个文件,一个是com.yang.ym.spi.ConsoleLog,另外一个是com.yang.ym.spi.FileLog。我举一个生活中的例子吧,汽车的轮胎是可以更换的吧,不可能厂家直接将轮胎焊死在汽车上的,你大可以换成其他制造商的轮胎,但总不可能换上自行车的轮胎。原创 2023-02-23 10:03:19 · 719 阅读 · 0 评论 -
Reactor响应式编程
请注意,所有事件,甚至是终止事件,都是可选的,意思是:可能没有onNext事件,但只有onComplete事件,这就表示此Flux是一个空的有限序列。如果仔细观察,程序一旦遇到一些耗时操作(特别是I/O,例如数据库请求或网络调用),就会浪费资源,因为线程(可能有很多线程)现在处于空闲状态,啥也不干,就呆呆地等待数据。调度程序具有类似于ExecutorService的调度职责,但是具有专用的抽象使其可以做更多的事情,尤其是充当时钟并启用更广泛的实现方式(测试的虚拟时间,蹦床或即时调度等)。原创 2023-02-09 10:06:51 · 799 阅读 · 0 评论 -
SpringBoot 调用设置密码的 Elasticsearch
最近项目中使用到的Elasticsearch是设置密码的,所以我们在Springboot中使用的过程中也需要指定密码才可以连接到Elasticsearch,特此记录便于日后查阅。打开 http://127.0.0.1:8082/all/addDocument 密码访问就完成了。修改ElasticSearchConfiguration类。原创 2023-01-03 10:07:27 · 2367 阅读 · 4 评论 -
SpringBoot Fastjson解析多层嵌套复杂Json字符串
1 []中括号代表的是一个数组;2 {}大括号代表的是一个对象3 双引号“”表示的是属性值4 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。原创 2023-01-03 10:02:48 · 2050 阅读 · 0 评论 -
Spark 长文详解
1、Spark 是什么?Apache Spark是用于大规模数据处理的统一分析引擎Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量硬件之上,形成集群。Spark 官网2、Spark 架构组成及原理1.Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的。原创 2023-01-03 09:59:17 · 442 阅读 · 0 评论 -
SpringBoot Disruptor 高性能内存消息队列
Disruptor 是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于 Disruptor 开发的系统单线程能支撑每秒 600 万订单,2010 年在 QCon 演讲后,获得了业界关注。Disruptor是一个开源的Java框架,它被设计用于在生产者—消费者(producer-consumer problem,简称PCP)问题上获得尽量高的吞吐量(TPS)和尽量低的延迟。原创 2023-01-03 09:54:03 · 448 阅读 · 0 评论 -
SpringBoot 基于『责任链模式』优化多重校验代码(也常用于多步骤的数据处理)
责任链模式(Chain of Responsibility Pattern)是将链中每一个节点看作是一个对象,每个节点处理的请求均不同,且内部自动维护一个下一节点对象。当一个请求从链式的首端发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止。属于行为型模式。生活中的应用场景就是「审批流」。责任链模式主要是解耦了请求与处理,客户只需将请求发送到链上即可,无需关心请求的具体内容和处理细节,请求会自动进行传递直至有节点对象进行处理。原创 2022-12-27 11:09:47 · 851 阅读 · 1 评论 -
SpringBoot 消息重试框架 spring-retry 和 guava-retry 详解
spring-retry 和 guava-retry 工具都是线程安全的重试,能够支持并发业务场景的重试逻辑正确性。两者都很好的将正常方法和重试方法进行了解耦,可以设置超时时间、重试次数、间隔时间、监听结果、都是不错的框架。但是明显感觉得到,guava-retry在使用上更便捷,更灵活,能根据方法返回值来判断是否重试,而Spring-retry只能根据抛出的异常来进行重试。原创 2022-12-27 10:59:39 · 403 阅读 · 0 评论 -
SpringBoot Disruptor框架遇到的问题
Disruptor的默认策略是BlockingWaitStrategy。在BlockingWaitStrategy内部是使用。原创 2022-12-23 11:28:43 · 1097 阅读 · 0 评论 -
SpringBoot Disruptor 构建高性能内存队列
伪共享问题是指,当多个线程共享某份数据时,线程1可能拉到线程2的数据在其cache line中,此时线程1修改数据,线程2取其数据时就要重新从内存中拉取,两个线程互相影响,导致数据虽然在cache line中,每次却要去内存中拉取。Disruptor它是一个开源的并发框架,并获得2011 Duke’s程序框架创新奖【Oracle】,能够在无锁的情况下实现网络的Queue并发操作。环形数组,底层使用数组entries,在初始化时填充数组,避免不断新建对象带来的开销。后续只会对entries做更新操作。原创 2022-12-23 11:27:15 · 819 阅读 · 0 评论 -
SpringBoot 基于 OAuth2 统一身份认证流程详解
了解OAUTH2统一认证基本概念, 各种角色与协议流程, 了解OAUTH2支持的四种模式, 以及各种模式的不同应用场景。了解整体服务设计, 完成认证服务的搭建配置, 通过postman对功能进行验证, 实现TOKEN的申请与刷新功能。完成用户服务的配置的改进以及 Spring Security的集成, 核心类的处理实现;在整个项目中, 存在公用的地方, 要做统一处理, 比如统一异常和统一接口数据返回, 复用方便, 直观清晰, 便于维护与扩展。原创 2022-12-23 11:25:16 · 10001 阅读 · 0 评论 -
SpringBoot Nacos 轻松实现分布式单点定时任务
定时任务基于SpringBoot的Schedule实现运行规则没有运行过则判断是否在当前节点运行已经运行过则直接运行@Slf4j//开启定时任务,通常写在项目启动类上/*** Dubbo远端服务,真实业务逻辑运行服务*///标记当前是否正在运行//调度规则//判断当前是否已经在本机运行job//有则运行run();}else{//没有则判断是否需要运行,具体实现看集群容错算法章节run();}}}原创 2022-12-20 10:52:00 · 598 阅读 · 0 评论 -
SpringBoot整合Debezium CDC同步数据至目标数据库
上图为使用嵌入式Debezium Spring Boot数据库连接器执行的基本工作流架构。原创 2022-12-20 10:46:33 · 1534 阅读 · 0 评论 -
SpringBoot ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮
创建对应的请求 --> 设置请求(添加规则,添加数据等) --> 执行对应的方法(传入请求,默认请求选项)–> 接收响应结果(执行方法返回值)–> 输出响应结果中需要的数据(source,status等)注意:需要将User对象中的属性全部指定值,不然会被设置为空,如User只设置了名称,那么只有名称会被修改成功,其他会被修改为null。,如果索引发生改变了,那么代码都需要修改,可以定义一个枚举类或者一个专门存放常量的类,将变量用。注意:如果添加时不指定文档ID,他就会随机生成一个ID,ID唯一。原创 2022-12-12 16:51:38 · 275 阅读 · 0 评论 -
异步编程学习之路(一)-通过Thread实现简单多线程
自上周主管带我看过kafka内部实现,使用Feature来做的数据批量发送之后,自此决定要学好并发编程。因为本人在多线程上只能说是一个新手,打算从最底层的Thread一步一步记录我的学习之路。通过Thread实现多线程的方式有两种,代码如下:一、多线程实现(继承Thread类)/** * @Description:简单多线程的实现(线程不安全) * @Author:zhang...原创 2018-12-21 21:31:42 · 715 阅读 · 0 评论 -
异步编程学习之路(四)-睡眠、唤醒、让步、合并
本文是异步编程学习之路(四)-睡眠、唤醒、让步、合并,若要关注前文,请点击传送门:异步编程学习之路(三)-多线程之间的协作与通信前文我们通过wait()、notify()等多线程通信方法实现了线程之间的协同合作,在本文中我们将对这些方法做详细介绍。一、线程睡眠让当前正在执行的线程阻塞一段时间,则可以通过调用Thread类的静态sleep()方法来实现。当线程调用sleep()方法后...原创 2018-12-23 17:55:41 · 657 阅读 · 0 评论 -
异步编程学习之路(七)-Lock锁(同步问题更完美的处理方式)
本文是异步编程学习之路(七)-Lock锁(同步问题更完美的处理方式),若要关注前文,请点击传送门:异步编程学习之路(六)-Future和Callable原理及使用前文我们介绍了通过Future和Callable异步编程和数据分批入库,本文我们来主要讲解一下Lock相关的使用。一、Lock与Synchronized对比synchronized是java中的一个关键字,也就是说是Jav...原创 2018-12-25 16:58:38 · 992 阅读 · 0 评论 -
异步编程学习之路(六)-Future和Callable原理及使用
本文是异步编程学习之路(六)-通过Future和Callable实现数据批量处理,若要关注前文,请点击传送门:异步编程学习之路(五)-线程池原理及使用前文我们讲解了通过Thread和Runnable实现多线程的方式,如果要A线程与B线程协同合作,我们就需要用到共享变量和线程之间的通信方法,比如wait()、notify()、notifyAll()等,用到这些通信方法的主要原因是不管Thre...原创 2018-12-24 18:57:39 · 856 阅读 · 0 评论 -
异步编程学习之路(三)-多线程之间的协作与通信
本文是异步编程学习之路(三)-多线程之间的协作与通信,若要关注前文,请点击传送门:异步编程学习之路(二)-通过Synchronized实现线程安全的多线程通过前文,我们学习到如何实现同步的多线程,但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例。该问题描述了两个共享固定大小缓冲区的线程,即所谓的“生产者”和“消费者”在实...原创 2018-12-23 13:40:20 · 596 阅读 · 1 评论 -
异步编程学习之路(五)-线程池原理及使用
本文是异步编程学习之路(五)-线程池原理及使用,若要关注前文,请点击传送门:异步编程学习之路(四)-睡眠、唤醒、让步、合并前文我们详细介绍了线程之间协同合作的方法,在本文中我们将再进一步详细讲解线程池的原理及使用。个人认为,如果想要学好线程池就必须先从ThreadPoolExcetor源码开始讲起,我不建议直接使用Executors来创建一个线程池。至于为什么不建议直接使用的原因,阅读...原创 2018-12-23 18:06:28 · 901 阅读 · 0 评论