![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 73
cocoawork丶
这个作者很懒,什么都没留下…
展开
-
Spring解决循环依赖的原理
什么是循环依赖?简单来说就是A、B两个对象互相依赖,A中有B,B中有A。循环依赖分类:构造器循环依赖//A类中引用B类实例class A { B b; public A(B b){ this.b = b; }}-----------------//B类中引用A类实例class B { A a; public B(A a) { this.a = a; }}像上面这种构造器循环引用是无解的,即使强如Spring这样的框架。setter方法原创 2021-02-27 16:11:16 · 471 阅读 · 0 评论 -
基于Netty实现TCP连接的服务端、客户端
简介Netty是一个异步事件驱动的网络应用框架,可快速开发可维护的高性能协议服务器和客户端。基于NIO实现的高性能网络IO框架,极大简化基于常用网络协议的编程(TCP、UDP等)。架构模型完整版:根据自己的理解,简单版的工作模型架构图:如上图所示,Netty是基于主从Reactor的架构模型;主EventLoopGroup负责处理客户端的连接请求事件,客户端连接成功后交由从EventLoopGroup,具体的数据IO由从EventLoopGroup的EventLoop处理。EventLoop原创 2020-10-03 16:37:46 · 10070 阅读 · 3 评论 -
RocketMQ高级
1. 高级功能1.1 消息存储分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消费者返回ACK如果消息消费者在指定时间内成功返回ack,那么MQ认为消息消费成功,在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,则认为消息消费失败,会尝试重新push消息,重复执行4、5、6步骤MQ删除消息1.1.1 存储介质关系型数据库D转载 2020-09-12 16:34:26 · 188 阅读 · 0 评论 -
RocketMQ入门
1. MQ介绍##1.1 为什么要用MQ消息队列是一种“先进先出”的数据结构其应用场景主要包含以下3个方面应用解耦系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复转载 2020-09-12 08:30:56 · 260 阅读 · 0 评论 -
使用NIO实现一个群组聊天功能
使用nio实现一个群聊功能NIO:(No Blocking IO或者New IO),非阻塞IO,是相对于传统IO来说,其意义在于网络IO的非阻塞性。其工作流程:Buffer :数据的载体Channel:客户端到服务端的通道,负责数据(Buffer)的传输Selector:多路复用器,用于监听Channel的事件(可对应多个Channel)1.Server端 public static void chatServer() throws IOException { /原创 2020-09-04 18:53:14 · 163 阅读 · 0 评论 -
Service层的数据校验
在传统的单体项目开发中,三层结构WEB层、Service层、DAO层最终是一个整体,调用关系也是一一对应,WEB->Service->DAO的调用关系。程序的”入口“只能是用户从WEB层发起调用,为了对数据负责、也为了避免不合法的数据浪费性能所以会在WEB层做数据校验,而Service层基本处于裸奔的状态。如今分布式、微服务大行其道,WEB层和Service层未必是一一对应的关系 了,可能是一对多、多对一、多对多的关系,你的Service不一定会有谁来调用,所以在Service层进行数据校验也原创 2020-09-02 14:46:56 · 3239 阅读 · 1 评论 -
VisualVM连接远程主机
一、在服务器上部署JMX服务1.进入tomcat的bin目录,修改catalina.sh文件#tomcat的bin目录,修改catalina.sh: #vim catalina.sh # 添加如下配置: CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jm转载 2020-09-02 13:55:22 · 1520 阅读 · 0 评论 -
Spring中如何向POJO类中注入属性?
假如在SpringBoot项目中有这么一个 需求,需要对接口返回的某个UserDto对象的手机号phone只显示后四位的处理,那么如何操作?public class UserDto { private String name; private String phone; private String address;}方式一public UserDto getUserInfo() { UserDto user = getUserDto; //在此处处理 user.setPho原创 2020-08-25 18:50:30 · 1008 阅读 · 0 评论 -
SpringBoot+Jersey文件下载
常见下载文件有返回文件流、字节数组、字符串、通过HttpServletResponse的io写 等形式本文使用javax.ws.rs.core.Response的形式实现文件下载@GET@Path("download")@Produces(MediaType.APPLICATION_OCTET_STREAM) public Response fileTemplateDownload(@Context SecurityContext context) throws FileNotFoundExcep原创 2020-08-05 18:01:10 · 461 阅读 · 0 评论 -
HashMap插入数据执行流程分析
概要JDK1.7中的HashMap底层实现为数组+链表,JDK1.7中的HashMap存在问题:多线程状态下内部数组扩容时有可能会导致死循环。所以,JDK1.8中对HashMap进行了重新实现,其底层实现为数组+链表+红黑树。提高了HashMap的性能。HashMap源码解读内部属性static final int DEFAULT_INITIAL_CAPACITY默认初始化容量,默认值16,要求改值必须为2的幂次方数。至于为何必须是2的幂次方数,简单来说就是为了提高map的key在放入数原创 2020-07-21 10:54:20 · 995 阅读 · 1 评论 -
volatile关键字作用
保证内存可见性何为内存可见性?线程操作共享资源时会将资源从主内存区拷贝到当前线程的工作内存区,且不同的线程无法互相访问其工作内存,线程间变量的传递需要将变量写回到主内存区后再进行传递。而volatile之所以可以保证内存可见性,因为其保证修饰的变量在值被修改后及时写回到主内存区,同时也会将CPU中对变量的缓存刷新,保证各个线程得到最新的值。示例:class JCounter { int value = 0; public void increase() { value原创 2020-06-19 14:10:38 · 156 阅读 · 0 评论