Java
文章平均质量分 78
tony_code_2017
开心就好
展开
-
docker镜像 java maven 依赖管理漏洞修复总结
maven 中依赖的管理和升级原创 2022-04-14 18:25:57 · 1788 阅读 · 0 评论 -
记一次数据库事务问题的定位与解决
技术背景:SpringBoot用SpringMVC + + +的MyBatis的ActiveMQ问题描述:在服务层中根据主键对某表中数据记录的部分字段进行更新,更新之后使用ActiveMQ的对刚才更新数据的中另外一个字段进行更新,消息队列的更新是后加的,加上之后导致先前的更新失效; 问题分析:经过日志分析,消息队列触发的更新总是拿到服务层中第一次更新前的数据进行更新,所以会将第一次更新...原创 2018-11-15 18:15:30 · 284 阅读 · 1 评论 -
MyBatis 排序防止sql注入
MyBatis的排序引言 最近在项目开发中遇到一个问题,项目中使用的的MyBatis的排序功能被安全部门扫描出了SQL注入安全隐患,查看安全报告说是有一个接口中存在SQL注入的安全漏洞,检查后发现是因为该接口中的排序功能使用了的MyBatis中的$ {}。#{}与$ {}的区别 默认情况下,使用#{}格式的语法会导致MyBatis的创建的PreparedStatemen...原创 2018-11-13 07:23:59 · 18339 阅读 · 8 评论 -
Maven pom.xml 报错 Cannot create resource output directory
maven 执行clean package 命令时报错:Cannot create resource output directory: D:\test\****\target\classes后来去文件夹下试着手动删除,确实是提示删除不了需要管理员权限,因此有很多程序员就去以管理员权限删除了。其实这是不对的做法。因为clean命令会先删除target下已经存在的文件,删除后会重新创建编译的文件...原创 2018-08-16 09:24:59 · 19322 阅读 · 10 评论 -
多线程之线程安全关键字synchronized
synchronized关键字,是多线程编程时保证线程安全使用非常广泛的java知识。下面我们学习下synchronized的相关知识:实现原理 synchronized的实现原理是基于内存中的lock原则。内存模型中的变量读写有八个步骤也有八个原则,synchronized的实现是基于八个原则中的lock原则。将其实现在指令级别就是monitorenter和monitore...原创 2018-08-03 11:08:27 · 3666 阅读 · 0 评论 -
线程的创建与线程池ThreadPoolExecutor,Executors
线程的创建与线程池及线程池工具类1.线程的创建方式1.1继承Thread类重写run方法public class Test { public static void main(String[] args) { Thread thread = new MyThread(); thread.setName("mythread001"); ...原创 2018-07-31 17:42:25 · 20085 阅读 · 2 评论 -
数据库事务的特性与事务隔离级别
数据库事务的特性与隔离级别事务 事务简单的理解就是要在数据库上执行的一组业务相关的SQL语句,是关系型数据库的最基础执行单位;但不是每个数据库的每个引擎都支持事务,例如我们使用的MySQL数据库的MyISAM就不支持事务。ACID-数据库事务的四大特性 A-Atomicity(原子性) 指数据库事务的操...原创 2018-07-27 16:57:43 · 216 阅读 · 0 评论 -
java 集合源码分析之ArrayList
ArrayList源码分析1.简述 ArrayList也就是List接口的可变长度数组的实现(Resizable-array implementation of the List interface),可以大体上认为是Vector的非线程安全实现。2.源码分析 2.1初始化 构造函数三个: ...原创 2018-07-24 21:39:15 · 359 阅读 · 0 评论 -
JVM学习之七 HotSpot收集算法如何实现精确收集
HotSpot收集算法如何实现精确收集枚举根节点 当我们要回收内存的时候,我们需要对对象进行可达性分析,也就是从根节点搜索引用。假如引用关系在变化那么我们的分析结果就会不准确,因此我们需要在此时暂停掉所有正在执行的java线程,以确保引用关系不变化,Sun公司(当然已经被Oracle收购了)将其称为Stop The World。 当Stop The World 时,我们并不需要一...原创 2018-07-03 23:44:58 · 163 阅读 · 0 评论 -
MyBatis 本地缓存和二级缓存使用以及源码分析 第二篇
本篇分析缓存的查询流程1.二级缓存的全局配置 配置中的设置配置cacheEnabled标签可以全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认是真,也就是默认开启,这个配置就是二级缓存的全局开关。2.缓存接口 在MyBatis的的包org.apache.ibatis.cach...原创 2018-11-23 18:01:58 · 1038 阅读 · 2 评论 -
【设计模式】学习之创建型 工厂模式
工厂模式,在开发中广泛使用的一种用于对象创建的设计模式,尽管有时候我们可能并不知道自己使用的就是工厂模式或者看到的开源软件源码中用到的就是工厂模式。开源软件中的MyBatis中的SqlSession的创建就是使用了工厂模式,分析如下:接口 SqlSessionFactory /** * Creates an {@link SqlSession} out of a con...原创 2018-11-25 10:59:05 · 132 阅读 · 0 评论 -
MyBatis 高级映射与懒加载
MyBatis的高级映射是该框架非常重要的一个功能,在开发中有广泛应用,在面试中也是常考的内容,下面我们就学习下高级映射。 引言:MyBatis的的高级映射分为关联和集合两种,关联是一对一关系的映射,集合是一对多关系的映射,都分为嵌套查询和嵌套结果两种实现方式;嵌套查询在数据量不大和关联不多的时候使用比较合适,当数据量大的时候,会出现N + 1问题,导致执行的SQL很多,加载很慢,...原创 2018-12-17 18:14:31 · 519 阅读 · 0 评论 -
406 Not Acceptable 415 Unsupported Media Type Spring MVC consumes与produces
引言:SpringWeb MVC框架在使用的过程中,有时候会出现请求结果报406 Not Acceptable 或者415 Unsupported Media Type的错误,现在学习下为什么报这个错误以及怎么解决。 Http协议基础知识及概念: HTTP(HyperText Transport Protocol)是超文本传输协议的缩写,是客户端浏览器或其他程...原创 2018-12-16 17:50:03 · 1046 阅读 · 1 评论 -
Maven+Eclipse+Tomcat+Spring MVC web 请求 404 问题总结及noHandlerFound
在Eclipse开发环境下基于Maven的Spring 4.3.18.RELEASE 版本开发一个web项目,并使用Tomcat发布,项目正常启动后,遇到一个请求报404,问题分析总结如下:1.contextPath是否正确 因为tomcat默认是以项目包的名字为contextPath的,而maven者是以artifactId为名字打一个war包,因此在默认情况下contex...原创 2018-12-04 08:09:01 · 2390 阅读 · 0 评论 -
SpringMVC API缓存 LastModified的实现总结
Servlet的生态中,提供了一种友好机制用来提高系统的响应速度,当客户端查询的数据在没有变化的情况下直接返回,以减少服务器压力和网络传输的压力。Spring MVC也很好的继承了该机制,下面我们就学习下怎么使用LastModified。1.handler是实现了LastModified的Servletpublic class MyServlet extends HttpSe...原创 2018-12-05 22:52:55 · 1664 阅读 · 0 评论 -
【设计模式】学习之创建型 原型模式
1.Object.clone()方法在学习原型模式以前,我们先学习下Object对象的一个clone()方法,JDK1.8源码如下:/** * Creates and returns a copy of this object. The precise meaning * of "copy" may depend on the class of the object...原创 2018-11-28 22:56:21 · 190 阅读 · 0 评论 -
【设计模式】学习之创建型 单例模式
提起单例模式,我们一般首先想到的就是Spring 框架中的Bean的作用域singleton,当一个bean的作用域为单例的时候,这个bean在Spring 的容器中只有一个实例化的对象。那么我们如何实现一个单例对象呢?首先,构造函数私有化,这样子就只能在该类中调用new 方法创建该类的对象。其次,变量必须是类变量来接收这个创建的实例对象;最后提供一个公共的静态方法,对外提供获取...原创 2018-11-27 23:32:29 · 169 阅读 · 0 评论 -
【设计模式】学习之结构型 适配器模式-装饰器模式-代理模式
本篇主要学习适配器模式,装饰器模式,代理模式的使用和结合开源组件源码进行分析,最后对他们作以比较适配器模式 适配器模式,提起适配器我们首先想到的就是春天框架中的RequestMappingHandlerAdapter,那么我们看看它的顶级接口的的HandlerAdapter的注释:其中第一段的注释如下:此接口用于允许{@link DispatcherServlet}无限...原创 2018-12-04 18:11:48 · 570 阅读 · 0 评论 -
Eclipse 配置web工程的build
最近在部署web项目得时候,不知道怎么搞了下,发现项目部署总是失败,找不到class文件,web.xml的位置也总是不对。然后研究了几个小时查了些资料才搞定,现在记录下来共享给大家。 1.tomcat部署servlet的包结构 tomcat是servlet的容器,它为servlet提供了通信的能力,servlet是tomcat容器的组件,实现了具体的web功能。那么要在tomc...原创 2018-06-28 11:50:26 · 7626 阅读 · 0 评论 -
eclipse 发布项目修改context root及tomcat的server.xml配置
最近在eclipse中部署web项目的时候发现一个有关项目context path 的问题,几经查证终于解决现总结如下:1.设置web项目的context root,这个值就是我们在访问web项目的时候,跟在端口后面的名称,例如http://localhost:8080/myweb/login/login 中的mybwe。选中项目右键选择Properties,如图:点击后选择Web Project...原创 2018-06-20 14:04:12 · 7090 阅读 · 0 评论 -
MyBatis 源码学习之三 MyBatis开发遇过的坑
使用MyBatis过程中遇到过一些坑,遂记录下来,结合源码分析,以共享。配置如下:首先测试了获取sqlsession成功one 新增记录成功,但是数据库中无记录。实体类如下:数据库表如下:执行如下测试方法执行结果:成功。但是查看数据库没有新增的该条记录。原因是没有提交。添加提交代码后新增记录在数据库中可以查看到。源码分析:session = ssf.openSession();创建的SqlSess...原创 2018-06-22 14:46:19 · 297 阅读 · 0 评论 -
springmockMVC 测试controller
springmockMVC测试WEB Controller1.应用场景: SSM框架大行天下的时候,伴随着测试驱动开发模式的盛行,springmvc 测试也是每个开发人员必须面对的问题。springMVC框架中有两种配置方式,一种是将主要的配置,例如数据层,服务层,和事务层放置在一个common.xm中,然后将mvc相关的配置放置在mvc的配置文件中,mvc_servlet.xml中。这种方...原创 2018-06-21 17:31:19 · 2334 阅读 · 0 评论 -
JVM学习之二 java对象的创建
对象的创建 谈及Java,就离不开对象,因为java是面向对象的编程语言。至于什么是对象的概念,虽然已经接触java两年有余仍不能一言以蔽之,网上相关的博客甚多,大家可以前往参考。今天就具象的学习下怎么创建对象,也就是对象的创建过程。java的对象主要分为三类:普通的java对象,数组,Class对象,后两者与区别于我们普通的java对象,本文也主要学习的是第一种对象的创建,后两种后面的文章...原创 2018-06-06 23:39:01 · 136 阅读 · 0 评论 -
Eclipse spring junit 4 测试 报java.lang.ExceptionInInitializerError
在使用Eclispe作为开发工具时,用spring框架,外加Junit4测试spring框架的代码是非常常见的事情。问题:在配置正确的情况下启动报初始化错误。配置如下:@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath*:/config/spring-context.xml"})p...原创 2018-05-29 16:54:51 · 5263 阅读 · 1 评论 -
Spring MVC学习之二 DispatcherServlet如何处理请求
上一节我们知道了DispatcherServlet的初始化方法怎么调用后,接下来我们先看看下初始化时在initStrategies()都做了什么事情。其内部调用了9个init*()方法,这些方法基本上就是从context中取出对应的bean并赋值给DispatcherServlet对应的属性,例如此处只是简单的看下初始化,后续会进行详细的学习,请期待。Servlet的请求处理都是在doServic...原创 2018-05-24 13:22:17 · 4497 阅读 · 1 评论 -
Spring学习之一 bean的作用域 详细讲解
Spring Bean的作用域 Spring是一个轻量级的开源应用开发框架,广泛应用于企业开发中,并且受到广大开发人员的喜欢。本篇只是针对spring中bean的作用域进行学习和总结。 Bean作用域的分类 bean的作用域分为五类:singleton ,prototype, request, session, global session 。 Singleton 作...原创 2018-06-04 14:29:46 · 435 阅读 · 0 评论 -
SpringMVC 学习之一 DispatcherServlet初始化方法initStrategies(context)从何而起
本篇为SpringMVC学习的第一篇,主要分析SpringMVC初始化的过程。在分析SpringMVC初始化过程之前先复习下Servlet的生命周期,也就是Servlet从创建到销毁的整个过程。 实例化->初始化->使用->销毁 实例化:容器调用Servlet的构造器,创建一个Servlet对象; 初始化:实例化之后,容器会立即调用对象的...原创 2018-05-23 11:35:07 · 4209 阅读 · 3 评论 -
JVM学习之一 JMM(Java内存模型)
JVM简介 JVM是Java虚拟机的简称,是Java的程序运行时的环境基础,是基于软件模拟计算机硬件环境为Java的class文件提供的运行时环境,每次启动java程序都会在系统中开启一个java进程。它隐藏了底层技术的复杂性与机器与操作系统的差异性,使得程序员不用注意底层的硬件差别而专注实现业务逻辑。因此,程序员编写的源代码java文件经过编译后生成class文件,class文件在不同的操...原创 2018-05-28 08:49:40 · 439 阅读 · 0 评论 -
JVM学习笔记之四 四种引用和垃圾回收的两次标记
四种引用和两次标记四种引用 java中的数据类型我们知道是分为基本数据类型和引用类型的。基本数据类型是8种,分别是boolean byte short int long double float char,基本数据类型其变量内存中存储的是该变量的值,而引用类型在JDK 1.1中的描述是:如果Reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。此...原创 2018-06-14 22:15:25 · 2376 阅读 · 0 评论 -
MyBatis 源码学习之二 MyBatis事务
MyBatis事务 本篇主要学习MyBatis的事务代码,从设计模式,代码实现,事务分类等三个方面进行学习。关于数据库事务的特性和隔离级别与传播级别此处不做学习,将会有另外的篇幅进行学习。 事务分类 MyBatis事务分为两个类型,分别是JdbcTransaction和ManagedTransaction。开发过程中主要使用前者,按照type="jdbc" 或者type=...原创 2018-06-14 22:57:44 · 1663 阅读 · 0 评论 -
系统性能优化小结
系统性能优化小结 最近开发过程中,遇到两次性能优化的需求,几番努力完成性能要求,一个因为工作改动量大而没有付诸实践,现小结如下。场景一 现状 对外提供的网络接口,数据库数据都走了redis的缓存,但是在此情况下,仍然请求在10秒多,数据量大的时候需要快20秒,现要求是秒以内的响应速度。 分析与修改 首先对各个方法进行响应时间的日志添加,运行几种情况,看看那些方法时间长...原创 2018-06-15 15:11:17 · 1369 阅读 · 0 评论 -
JVM学习之八 垃圾收集器
垃圾收集器 前面我们学习了关于垃圾收集的算法和为了确保垃圾收集的准确性系统提供的一些机制的概念,现在我们开始学习收集器,这个与我们开发最贴近的知识。由于JVM有各种各样的,而且java规范中对一些实现没有做强制的约束,所以不同的虚拟机实现会有不同,因此,我们以最广泛应用的HotSpot虚拟机中的收集器为学习目标进行学习。虽然现在JDK9已经早都发布,但是目前学习的书中使用的是JDK1.7中的...原创 2018-07-08 22:22:31 · 128 阅读 · 0 评论 -
JVM学习之五 回收方法区
回收方法区回收的必要性 Java 虚拟机规范中,可以不实现垃圾回收。方法区(HotSpot虚拟机中的永久代)进行垃圾回收时相对于堆中垃圾收回而言,“性价比”比较低。回收的对象 方法区中存储的是加载的类的信息,常量,静态变量,即时编译后的代码等数据,以回收的对象也就是这些内容。在判断非类信息是否可用的时候,也是采用可达性分析,比如常量池中的 何种场景需要回收 既然回收方法区不...原创 2018-06-26 21:59:55 · 392 阅读 · 0 评论 -
JVM学习之六 垃圾收集算法
垃圾收集算法 因为JVM的内存分为不同的区域,作用也不相同,存储的元素生存周期也不同,这就决定了垃圾收集算法有着不相同的多种算法。当然,任何算法的演进都是有其历史的,现在我们看看垃圾收集算法的演进。标记-清除算法 标记清除(Mark-Sweep)算法是最基础的算法,其他算法是对该算法的改进。标记清除算法分为两个阶段,分别是标记阶段和清除阶段。 标记阶段就是之前博客(四种引...原创 2018-06-30 21:50:40 · 127 阅读 · 0 评论 -
MyBatis源码学习之四 插件plugin
插件 MyBatis提供了插件功能,也就是拦截器功能,可以让我们在已映射语句执行过程中的某一点进行拦截调用。常用的插件就是ibatis3-spring-support包中的com.ibatis3.dialect.OffsetLimitInterceptor。我们先看看插件的实现然后再学习下OffsetLimitInterceptor。 1 怎么用 1.1 实现Interceptor接...原创 2018-06-25 17:54:26 · 2779 阅读 · 0 评论 -
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
1.报错信息org.apache.ibatis.session.defaults.DefaultSqlSession@1eb2c43java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLC...原创 2018-06-18 13:15:02 · 508 阅读 · 0 评论 -
JVM学习笔记之三 垃圾回收可达性分析算法
垃圾回收中无用对象的判断为什么要垃圾回收 JVM堆内存和方法区,不像程序计数器,虚拟机栈和本地方法栈等运行时区域,随着线程的生死而分配内存和释放内存,不需要主动回收内存。堆中并且存储了绝大多数对象,占用较大的内存空间。当对象越存储越多的时候,以至于不能够为正要创建的对象提供大小合适的内存空间时,就要触发javaGC,也就是java的自动内存回收,通过该行为中系统中“无用的对象”的内存回收后再...原创 2018-06-10 17:55:30 · 2185 阅读 · 0 评论 -
浅谈研发管理之二-如何避免交付风险
如何避免交付风险交付风险如何产生 研发中,我将不能按期保质保量完成视为交付风险。目前在我看来诱发交付风险的因素很多,例如产品将需求计划制定错误,管理实施混乱,技术人员能力欠缺,团队间衔接不当等等,都会导致这样子或者那样子的问题,迫使上线前加班加点或者延迟上线,造成交付问题。以上所列的四种因素是交付风险产生的常发因素,下面就以上四种因素进行讨论。需求的错误 网上关于研发同志要求产品经理不...原创 2018-06-10 10:35:13 · 2329 阅读 · 0 评论 -
MyBatis源码学习之一 工作的基本流程
本系列针对MyBatis源码进行学习,将会从基本的流程到各个特性以及源码中涉及的设计模式等。1.MyBatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain ...原创 2018-05-25 18:39:56 · 545 阅读 · 0 评论