Java
文章平均质量分 81
newcih
https://gitee.com/newcih/galois
展开
-
设计模式笔记
在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。下图中,Factory有一个doSomething方法,这个方法需要用到一个产品对象,这个产品对象由factoryMethod方法创建。该方法是抽象的,需要由子类去实现。//提供一个接口,用于创建相关的对象家族抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。原创 2024-02-03 12:10:28 · 1215 阅读 · 0 评论 -
Java多线程
Monitor描述为对象监视器,可以类比一个特殊的房间,这个房间中有一些被保护的数据,Monitor保证每次只能有一个线程能进入这个房间进行访问被保护的数据,进入房间即为持有Monitor,退出房间即为释放Monitor。如果物理机器有多个处理器,能够让两个或以上的线程同时并行执行,就可以让后面那个请求锁的线程不放弃CPU的执行时间,看看持有锁的线程是否很快就会释放锁。但是当自旋超过一定的次数,或者一个线程在持有锁,一个在自旋,又有第三个来访时,轻量级锁升级为重量级锁。,每当数据被修改,版本号+1。原创 2024-02-03 12:09:13 · 2247 阅读 · 0 评论 -
Java常用
为什么JDK8的阈值要选择8?链表特点是插入快,查询慢。红黑树是插入慢,查询快。理想情况下,使用随机的哈希码导致冲突的概率符合泊松分布,按照泊松分布的计算公式计算出了桶中元素个数和hash冲突概率的对照表,可以看到链表中元素个数为8时,概率已经非常小,再多的就更少了。红黑树本身就有维护成本,避免频繁维护红黑树,红黑树变为链表。红黑树的根节点不一定是索引位置的头节点HashMap通过方法来维持红黑树的根结点就是索引位置的头结点,但是在方法中,当movable为false时,不会调用。原创 2024-02-03 12:08:36 · 702 阅读 · 0 评论 -
Spring面试
BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当作Spring的容器。Spring容器不缓存prototype类型的Bean,使得无法提前暴露出一个创建中的Bean。IOC容器把对象注入进去的时候,已经不是原生对象,而是代理对象了。上下文更新事件 (ContextRefreshedEvent)A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A。上下文开始事件 (ContextStartedEvent),所以不能继承用户类,而只能是实现用户的接口。原创 2024-02-03 12:11:23 · 780 阅读 · 0 评论 -
【Galois工具开发之路】SpringApplicationRunListener在SpringBoot项目启动过程中执行了两次...
SpringApplicationRunListener 接口的作用主要就是在Spring Boot 启动初始化的过程中可以通过SpringApplicationRunListener接口回调来让用户在启动的各个流程中可以加入自己的逻辑。比如以下的方法Galois通过注入各种Listener到SpringBoot的启动监听器列表中,实现了SpringBoot启动后初始化各种AgentService的功能。原创 2023-04-01 15:24:33 · 1156 阅读 · 1 评论 -
【Galois工具开发之路】关于类的重新装载思路
Galois 通过监听项目代码变更,使用 redefineClasses 方法来重新装载类,并通过 ASM 侵入 SpringBoot 框架 和 MyBatis 框架核心代码的方式,获取到能重新装载。当一个java的类文件发生变更,如果动态的热更新这个新的类文件?目前来说,有两种可能的方式。的核心对象,以此实现项目的代码热部署更新。原创 2023-03-09 20:18:59 · 730 阅读 · 0 评论 -
【Galois工具开发之路】关于ClassFileTransformer的注意点
该接口是javaagent的方法的入参之一,用于给加载的类添加一个类转换器,确保在类进入main方法之前,对类进行字节码插桩。原创 2023-02-24 10:34:55 · 1853 阅读 · 0 评论 -
【Galois工具开发之路】关于IDEA的gradle工程执行两次premain的bug~
premain 方法会被执行两次,这个问题广泛出现在 IDEA 的多个版本中,目前尚未清楚,是 IDEA 还是 gradle 的问题。另一种Java Agent技术则是动态attach到java进程的方式,这种方式则是使用。是Java Agent技术的一种,通过。的方式,添加外部代理,代理入口方法为。启动工程,如果该工程配置了。,那么该 agent 里的。该问题发生于集成开发环境。原创 2023-02-23 17:05:48 · 1788 阅读 · 0 评论 -
【Galois工具开发之路】给你的JVM安装一个插件~
Dcevm(DynamicCode Evolution Virtual Machine)是Java Hostspot的一个扩展插件,属于开源性工具,非JDK官方提供,它允许你在运行环境下修改加载的类文件。当前虚拟机只允许修改方法体(Method,Body),而Decvm可以增加、删除类属性、方法,甚至改变一个类的父类。Galois是一个开源的SpringBoot项目热部署工具,提供对SpringBoot,Mybatis等三方框架的热部署支持。原创 2023-02-20 10:43:23 · 3729 阅读 · 1 评论 -
由Spring的@RequestParam的name属性引发的一系列小事记
起因项目里面使用了SpringBoot(版本是2.0.0.M2,记住这个版本号~),有一次在倒腾了开发软件IDEA之后,发现IDEA启动的项目运行失败了(记住这个IDEA启动~),原本正常的Controller接口的某个方法,突然在请求时,报出如下错误:项目代码没动,就只是倒腾了IDEA,重装了一下,你就给我看这个?经过搜某度,得其解,仅需开启某配置项(generate debugging info,Eclipse也有对应的配置,名字不同)如下图所示即可(这配置模式的确是开启的,只是重装IDEA后原创 2020-07-09 14:05:05 · 6458 阅读 · 1 评论 -
记一次Tomcat7和Spring4下配置无法读取的调试过程
文章目录本文介绍描述分析起因可能的原因如何用idea调试Tomcat源码跟Tomcat版本有什么关系?不仅仅是Tomcat解析方案本文介绍本文是一篇小记,多图,切勿当作教程看待!描述一个SpringMVC项目,出现了在Tomcat7下能正常运行,但是使用Tomcat9/8部署时,会有某个配置文件的属性值读取错误的问题(该属性值是${redis.password})。项目的配置结构如下:...原创 2019-08-14 21:29:40 · 3966 阅读 · 0 评论 -
@PathVariable @RequestParam @ModelAttribute 数据Key通用问题
如题,以上注解使用在Controller层的方法入参时,需要注意,这三个注解的数据的key是同一作用域的,如果@ModelAttribute是个User对象,含有id属性,那么@RequestParam和@PathVariable就不能使用id为key,否则数据会冲突。...原创 2018-05-06 10:29:24 · 3157 阅读 · 0 评论 -
Redis实现的布隆过滤器如何快速有效删除数据
这不是一篇搭建教程,因为用Redis实现布隆过滤器很简单,Redis本身就支持bitmap这种数据结构,通过setbit和getbit即可实现一个Bloom Filter。本文要讨论的是测试过程中,或者出问题时,要怎么优雅的把数据清除。Java本身有bitSet这种数据结构来支持布隆过滤器,而如果要清除的话,重启服务器,或者自身方法的clear()都可以。然而在序列化的数据库中,一旦存入成千上...原创 2017-12-29 19:24:01 · 11272 阅读 · 0 评论 -
使用Redis实现的SpringCache需防范的一点
SpringCache官方文档宣称,默认情况下,RedisCacheManager是会启用prefix的,这样的话,两个不同的缓存cacheNames如果用了同一个Key,数据是不会冲突的。但是,SpringBoot项目里面,如果发生了不同cacheNames,同一个Key,但是取到同一份数据的话,需要自己开启RedisCacheManager的setUsePrefix为true了。 代码如下...原创 2018-05-04 09:07:04 · 3213 阅读 · 0 评论 -
选用Java的字符串分割符号
Java支持Unicode,所以很多东西变得非常方便。近日Google App Store的零宽度字符漏洞被爆料后,才想起有个很好玩的例子,同样是看不见的空格,Unicode可以用打印字符,也可以是非打印字符。见如下代码String newSpace = new String("\uDB40\uDC44");String oldSpace = new String("");Syste...原创 2018-04-10 09:01:40 · 3668 阅读 · 0 评论 -
SpringMVC使用Maven配置SLF4J和LOG4J2
本篇的重点在于LOG4J2,它与LOG4J 第一版区别很大。我将教程放在后面,将一些知识放在前面,所以想看教程的直接拉到后面即可。理论知识关于两版的区别两版的不同,直接的表现是在Maven仓库中log4j 表示第一版,org.apache.logging.log4j 表示第二版。另外应当注意:Log4J2.4及更高版本需要Java 7,版本2.0-alpha1至2.3需要Java 6XML配置已被...原创 2018-01-26 13:38:49 · 4142 阅读 · 0 评论 -
java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
关于这个问题的终极解法,我只能说,要看清楚题意啊,各位同学。我平时一直都是用的IDE来写代码,所以一些依赖库都是它自己帮我下载的。问题就出在这里,上面这一句其实已经提示了出问题的地方是缺少common-lang包,但你自己看IDE好像又有那个包在。注意,IDE一般会下载最新的那个包,所以IDE很可能给你下载了3.0版本的,3.0版本的是 org/apache/commons/lang3/Stri原创 2017-03-18 11:39:17 · 4563 阅读 · 1 评论 -
MyBatis执行多条SQL语句
最近遇到需要在MyBatis同一个标签写入多条SQL语句的问题,可以网上的答案一直不成功,后来才发现其实不同人有不同写法,解答如下:大部分人说在JDBC连接后面加上allowMulQueries=true就可以了,可以我是不成功了,后来才发现,如果你是将JDBC连接参数写在外部properties文件,那么就直接 url = jdbc:mysql://localhost:3306/test&al原创 2017-04-08 17:04:34 · 3679 阅读 · 0 评论 -
正则表达式
1,非打印字符======================================================================================================== 字符 描述\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之原创 2017-07-21 02:50:16 · 432 阅读 · 0 评论 -
SpringMVC使用WebSocket在Junit环境下报 No suitable default RequestUpgradeStrategy
声明一点,使用的WebSocket是Spring集成的,属于spring-websocket。在Junit测试过程中报错,刚开始照网上添加Jetty的jar包方法,添加了一个 <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactI原创 2017-08-17 21:28:54 · 3846 阅读 · 1 评论 -
Java 后缀++ 小记
先上代码@Testpublic void testBasic(){ int num = 50; num = num++; System.out.println(num);}结果输出是50,如果你已经知道,无需往下看了。 Java的后缀++的实现方式与C/C++不同,以上述代码为例,运行步骤如下执行num++,原始num创建副本temp,原始num自增1,此时temp=原创 2017-07-26 14:10:48 · 529 阅读 · 0 评论 -
关于Lombok的hashCode方法
Lombok对于重写hashCode的算法真的是很经典,但是目前而言有一个令人难以注意到的细节。在继承关系中,父类的hashCode针对父类的所有属性进行运算,而子类的hashCode却只是针对子类才有的属性进行运算,立此贴提醒自己。目前重写hashCode的注解有@Data,@EqualsAndHashCode原创 2017-08-04 09:53:02 · 3062 阅读 · 0 评论 -
Freemarker遍历Set集合
目前使用版本 2.3.26-incubating最近遇到Set遍历的问题,网上找到的方案是使用iterator()遍历Set集合。然而在这个版本中,遍历Set的方法与List一样,都是使用<#list dataSet as data> ${data}</#list>原创 2017-08-04 10:00:14 · 3975 阅读 · 0 评论 -
Spring组件概述
Spring IO PlatformWhat简单的可以认为是一个依赖维护平台,该平台将相关依赖汇聚到一起,针对每个依赖,都提供了一个版本号。这些版本对应的依赖都是经过测试的,可以保证一起正常使用。Why主要是解决依赖版本冲突问题,例如在使用Spring的时候,经常会使用第三方库,一般大家都是根据经验挑选一个版本号或挑选最新的,随意性较大,其实这是有问题的,除非做过完整的测试...原创 2017-07-27 18:01:25 · 1168 阅读 · 0 评论 -
Maven项目读取resources目录下文件
如题,这里只提供一种简便方法,源于Spring的支持,但是又可以脱离Spring框架的使用。如下Resource res = new ClassPathResource("folder/file.txt");这是其中一种,读取Web项目下文件通常有以下: 文件的绝对路径 通过ClassPathResource,以类路径的方式 通过Servlet的相对于Web根目录的方式 一般原创 2017-08-21 15:51:29 · 4883 阅读 · 0 评论 -
SpringMVC引用properties文件变量
如下配置util命名空间添加property-placeholder方法一,配置util命令空间// Java代码@Value("#{myproperties['myparam']}")private String param;<!-- XML代码,在Spring配置文件 --><util:properties id="myproperties" location="classpath:原创 2017-08-22 20:51:25 · 2516 阅读 · 0 评论 -
网站安全--机密性
机密性(Confidentiality)机密性需求必须考虑的阶段传输时处理时存储时机密性的密码学应用对称式加密指加密与解密时,使用同一把密钥的加密方式。优点是速度非常快,相对于非加密式而言,约是100~1000倍快。缺点如下除了传输密文,还需要传输密钥,安全性没有很好的保障每增加一个接收方,就必须多一把密钥,造成密钥的管理困难非对称式加密指翻译 2017-12-29 13:04:52 · 3048 阅读 · 0 评论 -
SpringMVC防止静态资源拦截
SpringMVC出现静态资源拦截,大多数是当你把Dispatcher映射到应用程序 根目录的时候,也就是如下servlet> servlet-name>Testservlet-name> servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>servle原创 2018-01-23 08:39:52 · 2896 阅读 · 0 评论 -
Tesseract字体识别 及 jTessBoxEditor工具进行训练 及 Java API实现字体识别
Tesseract程序识别 程序源码 tesseract项目的github地址 (Linux下可通过包管理器下载安装)基本使用 注意点:1,图片文件类型为tiff/tif,2,output是输出文件名,执行命令后的输出文件是output.txttesseract 图片路径名 输出文件名示例如下tesseract /home/newcih/a.tiff...原创 2018-01-25 13:10:31 · 4987 阅读 · 1 评论