把Java程序打包为AppImage格式
AppImage是Linux程序的一种打包格式,让 Linux 应用随处运行。 准备工作 下载打包工具 AppImageKit:https://github.com/AppImage/AppImageKit/releases 准备 AppImage 的打包目录 App.AppDir 123456789App.AppDir/ usr/ bin/ jre/ app.jar <其他使用到的资源> app.desktop (必须) app.png (必须) <-- 256x256像素的png图片 AppRun (必须) <-- AppImage的启动文件 编写 .AppRun 文件AppRun是启动脚本,内容写启动jar包的命令,语法类似于shell脚本。 1234567#!/bin/bash HERE=$(cd "$(dirname "$0")"; pwd)cd $HERE/usr/bin./jre/bin/java -jar wi...
流量控制与可靠传输
本文在数据链路层下进行讨论。对于链路层传输的数据被称为帧。 流量控制由于收发双方各自的工作速率和缓存空间的差异,可能出现发送方的发送能力大于接收方的接受能力的现象,如果此时不对发送方的发送速率进行限制,那么接收方可能会被后面不断发送来的数据“淹没”,造成帧的丢失而出错。流量控制实际上就是限制发送方的数据流量,使其发送速率不超过接收方的接收能力。 可靠传输机制数据链路层的可靠传输机制通常使用确认和超时重传两种机制完成。确认是一种无数据的控制帧,这种控制帧使得接收方可以让发送方知道哪些内容被正确接收(有些情况下为了提高传输效率,将确认捎带在一个回复帧中,称为捎带确认)。超时重传是指发送方在发送某个数据帧后就开启一个计时器,在一定时间内如果没有得到发送的数据帧的确认帧,就重新发送该数据帧,直到发送成功为止。自动重传请求(Auto Repeat reQuest,ARQ)通过接收方请求发送方重传出错的数据帧来恢复出错的帧。传统自动重传请求分为三种,停止-等待(Stop-and-wait)ARQ、后退N帧(Go-Back-N)ARQ和选择性重传(Selective Repeat)ARQ。后两...
Mybaits 架构原理
学习 Mybatis 的执行流程
解决阿里云服务器中挖矿程序
解决阿里云服务器中挖矿程序top命令看不到cpu占用特别高的进程,但是总cpu的us高达96%。 使用此命令,可以发现跟跟阿里云的通知挖矿程序名一样 1netstat -nap | grep zzh 12tcp 0 0 172.26.68.13:35174 43.230.161.175:5443 ESTABLISHED 22764/./zzhtcp 0 0 172.26.68.13:57640 195.242.110.31:5443 ESTABLISHED 22818/./zzh 强行杀死两个进程 12kill -9 22764kill -9 22818 去zzh的目录卸载发现无法卸载 1rm /etc/zzh 查看文件隐藏属性,发现带有-aie:(—–ai——e) 表示无法修改(貌似e属性无所谓) 1lsattr /etc/zzh A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错...
开发 Mybatis 插件
Mybatis 插件Mybatis 插件介绍Mybatis 借助于四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)对持久层的进行操作。支持用插件对四大核心对象进行拦截,增强核心对象的功能。增强功能本质上是借助于底层的动态代理实现的,所以 MyBatis 中的四大对象都是代理对象。MyBatis 所允许拦截的方法如下: 执行器 Executor(update、query、commit、rollback等方法) SQL语法构建器 StatementHandler(prepare、parameterize、batch、updates query 等方法) 参数处理器 ParameterHandler(getParameterObject、setParameters方法) 结果集处理器 ResultSetHandler(handleResultSets、handleOutputParameters等方法) Mybatis 插件原理在四大对象创建的时候 每个创建出来的对象不是直接返回的,而是通过 i...
Spring IoC 循环依赖问题
Spring IoC 循环依赖问题什么是循环依赖循环依赖其实就是循环引用,也就是两个或者两个以上的 Bean 互相持有对方,最终形成闭环。比如 A 依赖于 B,B 依赖于 C,C 又依赖于 A。 循环调用其实就是一个死循环,除非有终结条件。 Spring 中循环依赖场景有: 构造器的循环依赖(构造器注入) Field 属性的循环依赖(set注入) 其中,构造器的循环依赖问题无法解决,只能拋出 BeanCurrentlyInCreationException 异常,在解决属性循环依赖时,spring 采用的是提前暴露对象的方法。 循环依赖处理机制 单例 bean 构造器参数循环依赖(无法解决) prototype 原型 bean 循环依赖(无法解决) 对于原型 bean 的初始化过程中不论是通过构造器参数循环依赖还是通过 setXxx 方法产生循环依赖,Spring 都会直接报错处理。 Spring 不支持原型 bean 的循环依赖进入 AbstractBeanFactory#doGetBean 方法: 在获取 bean 之前如果这个原型 bean 正在被创建则直接抛出异常。...
Bean 创建流程
调用栈 通过之前的关键时机分析,知道 Bean 创建子流程入口在 AbstractApplicationContext#refresh() 方法的 finishBeanFactoryInitialization(beanFactory) 处。 进入 finishBeanFactoryInitialization。 继续进入 DefaultListableBeanFactory 类的 preInstantiateSingletons 方法,我们找到下面部分的代码,看到工厂 Bean 或者普通 Bean,最终都是通过 getBean 的方法获取实例。 继续跟踪下去,我们进入到了 AbstractBeanFactory 类的 doGetBean 方法,这个方法中的代码很多,直接找到核心部分。 接着进入到 AbstractAutowireCapableBeanFactory 类的方法,找到以下代码部分。 进入 doCreateBean 方法看看,该方法我们关注两块重点区域。 创建 Bean 实例,此时尚未设置属性 给 Bean 填充属性,调用初始化方法,应用 BeanPostProce...
BeanFactory 创建流程
获取 BeanFactory 流程时序图 BeanDefinition 加载解析及注册子流程该子流程涉及到如下几个关键步骤 Resource 定位:对 BeanDefinition 的资源定位过程,找到定义 JavaBean 信息的 XML文件,并将其封装成 Resource 对象。 BeanDefinition 载入:把用户定义好的 JavaBean 表示为 IoC 容器内部的数据结构,这个容器内部的数据结构就是 BeanDefinition。 注册 BeanDefinition 到 IoC 容器 过程分析 子流程入口在 org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory 方法中。 依次调用多个类的 loadBeanDefinitions 方法 ->AbstractXmlApplicationContext -> AbstractBeanDefinitionReader -> XmlBeanDefinitionReader...
Spring IoC 容器初始化主体流程
Spring IoC容器初始化主体流程Spring IoC 的容器体系IoC 容器是 Spring 的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。Spring 提供了很多的容器,其中 BeanFactory 是顶层容器(根容器),不能被实例化,它定义了所有 IoC 容器必须遵从的一套原则,具体的容器实现可以增加额外的功能。比如我们常用到的 ApplicationContext,其下更具体的实现如 ClassPathXmlApplicationContext 包含了解析 xml 等一系列的内容, AnnotationConfigApplicationContext 则是包含了注解解析等一系列的内容。Spring IoC 容器继承体系非常灵活,需要使用哪个层次用哪个层次即可,不必使用功能大而全的。 BeanFactory 顶级接口方法栈12345678910111213141516171819202122232425262728293031323334353637public interface BeanFactory { /** * 返回 Fac...
Spring Bean 的作用范围及生命周期
scope 定义 Bean 的作用范围 singleton(默认值):单例模式的 bean 对象生命周期与容器相同对象出生:当创建容器时,对象就被创建了对象活着:只要容器在,对象一直活着对象死亡:当销毁容器时,对象就被销毁了 prototype:多例模式的 bean 对象,spring 框架只负责创建,不负责销毁对象出生:当使用对象时,创建新的对象实例对象活着:只要对象在使用中,就一直活着对象死亡:当对象⻓时间不用时,被 Java 的垃圾回收器回收了 Spring Bean 的生命周期 测试一下效果12345678910111213141516171819@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (&quo...















