- 博客(23)
- 收藏
- 关注
原创 SpringBoot+mybatis多数据源切换讲解
通过切面AOP技术,将我们定义的注解拦截下来,每当Sping检查到我们的注解时,去读取我们在前面全局变量保存的信息,去做数据源切换。通过@Before,在方法执行前去切换,注意要有@After去把这一次数据库连接完后去删除掉你切换的数据源,不然会影响其他方法。通过@ConfigurationProperties,prefix中的信息就按照你的配置来,这里我们注入了两个数据库。自定义一个注解,用来实现在方法层面的数据库切换,一般来说为了代码的规范性,我们都会再写一个这种公共常量定义类。
2025-03-10 21:16:41
323
原创 Java Stream流详解——串行版
S是继承于自己的同样的类型,从而形成一种递归,每一次返回的结果类型都是自己或它的子类。先定义了一个List,通过.stream()新建一个流管道,函数式编程的好处就是他可以把操作整合到一起,这里的 o->o.toString()和n->n.length()==1会被Java整合为。先是对函数式判空,然后返回一个无状态流。 Stream流是java8引入的特性,极大的方便了我们对于程序内数据的操作,提高了性能。andThen()方法,首先是自己调用自己的accept(),再调用下游的accept()
2024-12-27 23:41:31
710
原创 Scalable Io-NIO实践
上一章我们具体讲解了NIO的实现原理,这一章我们来自己手写一个Reactor。参考文献———Scalable Io in JAVA-Doug Lea。您可以仔细看下代码,都写了具体的注释。
2024-12-17 11:50:17
361
原创 Scalable Io——NIO详解
在NIO中我们使用这个方法向服务器或者客户端发送消息,它内部实现就是去读取 position-limit 之间的数据,如果不调用filp( ),则你发送的就是NULL了。它使得一个线程能够同时处理多个 I/O 操作,而不需要为每个连接创建一个新的线程,这样可以显著提高资源利用率和性能,尤其是在高并发环境下。open打开通道,read读取通道内的数据并返回字节数长度,write向通道写入数据返回写入的字节数长度。方法是向JVM表示一个可以被打断的通道注册了,它不是真正去阻塞一个通道。
2024-12-17 11:28:50
1854
原创 详解ObjectMapper序列化-readValue和ConvertValue
在其中保存了两个JsonToken:_currToken记录当前的数据,_lastClearedToken保存上一次处理的数据,其中比较重要的方法是nextToken()相同点:到最后到要通过BeanDeserializer.java来进行反序列化(Jackson有70多种序列化实现类,这里讨论的是Java Bean类型的类的反序列化)到最后到要通过BeanDeserializer.java来进行反序列化(Jackson有70多种序列化实现类,这里讨论的是Java Bean类型的类的反序列化)
2024-12-10 14:50:10
2035
原创 通过案例爽吃SpringMVC
通过现实案例,带你完整体会一边SpringMVC的历程。Spring是如何识别Get和Post请求的?又是怎么调用我们的Contrroller层的方法的
2024-11-30 16:46:30
752
原创 通过案例学Netty6-ChannelHandler/Context
相当于在应用层和Pipeline之间做了一层隔离,你只需要关注处理你自己的数据和业务,至于数据是怎么在Netty中传播和消费的你别管。在我什么都不说之前,大家先想一下,我定义了10个Handler来处理各种场景的不同事务,他是一个链表结构。可以看到它的内部有两个指针,看了第四章的朋友应该很熟悉了,又是双向链表,保存了AbstractChannelHandlerContext链条。它封装了ChannelHandler,为它提供操作和传递事件的上下文,将事件从一个Handler传递到下一个Handler。
2024-11-27 21:47:14
927
原创 通过案例学Netty5-ChannelFuture
但实际上是一种职责分离的设计思想,ChannelFuture是对外的客户端使用,它提供了一种只读的方式来观察操作的结果。Promise则是操作的生产者代码使用的接口,提供了设置操作结果setSuccess,setFailure,是内部Netty自己使用的。这个类非常简单,我们很熟悉的流程,New一个EventLoopGroup,再来个Bootstrap启动类,绑定上各式各样的Handler,最后一个无限for循环读取你的指令并发送给Redis。中的Future的子类。也许你和有同样的疑惑,乍一看。
2024-11-24 21:28:47
817
原创 通过案例学Netty4-Pipeline
其中HeadContext用来承接新的handler绑定,它使用了Java原生的Unsafe类直接与操作系统进行交互,提高了效率。最后再说一个具体的细节就是HeadContext和TailContext都是属于DefaultChannelPipeline的内部类,我认为主要是为了。,其中它自己保存了两个自己的指针next,prev,通过类似的fireChannelInactive方法将当前的数据传输到下一个Handler。到这里,你可以结合上一章的Client,整理出一套完整的可以运行的代码。
2024-11-22 21:14:08
263
原创 通过案例学Netty3-Http2
HTTP2采用了流的逻辑概念,一条TCP连接中可以并发传输多个流,互不相影响,而做到这一点的关键在就于它的Stream,它有很多格式。在之前的案例中,我始终没有介绍的一个操作就是我们在初始化Channel时,都会使用addLast()方法,添加上符合的enCoder和deCoder。表示释放资源,-1。每一个Stream有一个唯一标识SteamID,客户端发起的流ID用奇数,服务器发起的流ID用偶数。一个流会包含多个Frame,同时一个流可以依赖另一个流,通过传输PRORITY帧,确定流处理优先级。
2024-11-20 23:32:09
278
原创 通过案例学Netty2-HAProxy
这里的接在channel后面的sync()是一个手动阻塞方法,他会等待信息在channel中写入完毕返回成功后才会进行下一步。在后面我们会使用ChannelFuture的回调来更优雅的处理这个问题。而childHandler则是每当有新的客户端连接时都会被调用,负责具体的数据信息处理。这里需要恶补一下有关HAProxy的知识,它是一个高性能的开源软件用于提供负载均衡,正向或反向代理服务。在这里我们给channel提供了HAProxy的解析处理器,并在处理完信息后将这个解析器移除当前channel。
2024-11-17 15:42:05
388
原创 通过案例学Netty1-ButeBuf
可以看到上面两个案例切换服务器端就是依靠切换Handler,netty通过链式添加处理链条同时服务器端和客户端也十分详细,一个serverBootstrap,一个Bootstrap。除了服务器端多了一个EventLoopGroup外,其他都一样。
2024-11-16 17:35:58
226
原创 阿里云傻瓜式docker部署ElasticSearch8.6.2+SpringBoot3连接
然后你会看到这些,他们是用来连接验证身份的。我整了很久都没有整出来,springboot始终连不上,最终放弃了。进入config的elastisearch.yml文件,把xpack.security开头的全改为:false,关掉了验证。我从浏览器中将ca证书esCertification.crt下载下来,放入了java的证书库中,结果还是不匹配,没辙了。把配置拿出来放到自己的主机中,把/usr/share/elasticsearch——这个改成自己的路径。打开cmd命令窗口,将file改为自己的证书路径。
2024-11-10 21:37:17
420
原创 Redis序列化
在实际的开发中,基本上都统一使用这种格式进行数据传输了,不论你是用的是什么中间件,redis,kafka,es。你在A服务有一个User类,巧了B服务也有一个User类。要注意的是,genericJackson和Jackson2JsonRedisSerializer都依赖于类的无参构造函数,一定要+@NoArgsConstructor,或自己写一个,不然就会报错。与上一个相反,它不会自动写入这么详细的信息,大家也能看得出,当有几千万条redis数据时,上一个会付出多大的内存代价.
2024-11-09 23:16:05
640
原创 Try-catch与Try-with-resource
推荐在需要使用手动关闭的资源是使用try-with-resource。他们都实现了AutoCloseAble接口,下面可以看到,第一段代码是.java文件,第二段是.class文件,只不过是被Idea反编译成了更容易看的代码。可以你觉得单个try-catch还可以,但是当你有多个资源需要循环嵌套try-catch的时候,try-with-resouce的优雅性就体现出来了。可以看到Java编译器在编译时会在字节码层面去优化我们的代码,自动帮我们去调用close方法。
2024-10-24 23:28:37
259
原创 Java内存模型
Java内存模型规定了所有的变量都存储再主内存中,每条线程都有自己的工作内存,保存了该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作内存中完成。 ·write(写入) : 作用于主内存的变量, 它把store操作从工作内存中得到的变量的值放入主内存的。 ·read(读取) : 作用于主内存的变量, 它把一个变量的值从主内存传输到线程的工作内存中, 以。 ·assign(赋值) : 作用于工作内存的变量, 它把一个从执行引擎接收的值赋给工作内存的变量,下图是计算机的内存模型。
2024-09-28 17:13:01
633
原创 虚拟机字节码执行引擎
虚拟机是相对物理机的概念,物理机受制于处理器,缓存,指令集,操作系统的限制。而虚拟机则是由软件自行实现的,可以执行那些不被硬件直接支持的指令集格式。所有Java虚拟机的执行引擎输入输出都是一致的:输入字节码二进制流,输出执行结果要注意的是只有方法存在多态性,字段没有money = 2;money = 4;结果是 首先是在子类被构造器会先调用父类构造器,执行money=2改变的是父类中的money而不是son中的,因为字段的绑定是静态的,和多态无关。
2024-09-21 16:56:10
709
原创 类加载过程
它不是必要的,如果一个类没有静态语句块和对变量的复制操作,可以不生成。除了动态invokedynamic指令外,其他的指令在进行符号进行解析请求时,保证如果一个符号引用已经被成功解析过来,那么后面的请求同样要成功,而如果失败了那其他解析请求同样失败。 对字节码进行语义分析如这个类是否有父类除(Object),有无继承final修饰的类,非抽象类是否实现了父类或接口中要求实现的方法。 如是否以魔数开头,主次版本号是否被接收,指向常量池的索引值中是否会指向不存在的常量或不符合类型的常量。
2024-09-15 19:45:46
1674
原创 VisualVm cannot open requested application
最后发现就是简单的VisualVm没有权限,需要用管理员模式运行VusualVm.exe。我看StackOverFlow上说去VisualVm的安装目录中/etc/…修改jdkhome,改成和Idea一样的。
2024-08-18 21:33:12
283
原创 序列化SerialVersionUID源码及过程详解
这就引入了接下来的主角——serialVersionUID。关于它的用途其他文章介绍已经很详细了,这里不解释,直接上源码
2024-08-03 20:11:31
285
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人