自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

张维鹏的博客

芝兰生于幽谷,不以无人而不芳!

  • 博客(277)
  • 资源 (2)
  • 收藏
  • 关注

原创 G1 垃圾收集器原理详解

Young CG 和 Mixed GC,是G1回收空间的主要活动。当应用开始运行时,堆内存可用空间还比较大,只会在年轻代满时,触发年轻代收集;随着老年代内存增长,当到达 IHOP 阈值 -XX:InitiatingHeapOccupancyPercent(老年代占整堆比,默认45%) 时,G1开始着手准备收集老年代空间。首先经历并发标记周期,识别出高收益的老年代分区。但随后G1并不会马上开启一次混合收集,而是等待下一次年轻代收集,在这次STW中,确定下次混合收集的CSet,触发 Mixed GC

2022-01-04 06:51:38 21964 32

原创 Java常见设计模式总结

设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式于己于人于系统都是多赢的,它使得代码编写真正工程化,它是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。总体来说,设计模式分为三大类:5种创建型模式、7种结构型模式、11种行为型模式

2021-09-18 17:21:53 187643 43

原创 Java集合篇:HashMap 与 ConcurrentHashMap 原理总结

一、HashMap原理总结:1、什么是HashMap:(1)HashMap 是基于 Map 接口的非同步实现,线程不安全,是为了快速存取而设计的;它采用 key-value 键值对的形式存放元素(并封装成 Node 对象),允许使用 null 键和 null 值,但只允许存在一个键为 null,并且存放在 Node[0] 的位置,不过允许存在多个 value 为 null 的情况。(2)在 JDK7 及之前的版本,HashMap 的数据结构可以看成“数组+链表”,在 JDK8 及之后的版本,

2021-08-16 08:57:59 33940 21

原创 Redis的分布式锁详解

1、什么是分布式锁:为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。2、分布式锁应该具备哪些条件在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行 高可用的获取锁与释放锁 高性能的获取锁与释放锁 具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误) 具备锁失效机制,防止死锁 具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败分布式锁的实.

2021-01-25 00:02:16 92409 20

原创 Java虚拟机:对象创建过程与类加载机制、双亲委派模型

类加载机制,就是虚拟机把类的数据从class文件加载到内存,并对数据进行校检,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程。JVM的类加载机制,规定一个类有且只有一个类加载器对它进行加载。而如何保证这个只有一个类加载器对它进行加载呢?则是由双亲委派模型来实现的。一个类加载器收到了类加载的请求,他不会去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,因此所有请求都会被传到最顶层的启动类加载器,只有当父加载器反馈无法完成加载请求时,子加载器才会尝试加载.

2020-11-22 11:39:57 39654 10

原创 Java基础篇:反射机制详解

一、什么是反射: 反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,调用方法/访问属性,不需要提前在编译期知道运行的对象是谁,他允许运行中的Java程序获取类的信息,并且可以操作类或对象内部属性。程序中对象的类型一般都是在编译期就确定下来的,而当我们的程序在运行时,可能需要动态的加载一些...

2019-12-03 23:50:42 212650 72

原创 MySQL数据库:SQL优化与索引优化

一、索引优化规则:1、union、in、or 都能够命中索引,建议使用 in:(1)union:能够命中索引,并且MySQL耗费的CPU最少。select * from doc where status=1union allselect * from doc where status=2;(2)in:能够命中索引,查询优化耗费的CPU比union all多,但可以忽略不计,一般情况下建议使用in。select * from doc where status in...

2018-11-25 02:36:55 23695 13

原创 MySQL数据库:事务和ACID实现原理

数据库的事务是并发控制的基本单位,是指逻辑上的一组操作,要么全部执行,要么全部不执行。1、事务的特性:(1)原子性:事务是一个不可分割的工作单元,事务里的操作要么都成功,要么都失败,如果事务执行失败,则需要进行回滚。(2)隔离性:事务的所操作的数据在提交之前,对其他事务的可见程度。(3)持久性:一旦事务提交,它对数据库中数据的改变就是永久的。(4)一致性:事务不能破坏数据的完整性和业务的一致性。

2018-11-19 00:25:55 15071 1

原创 Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系

1、什么是hashCode:hashCode就是对象的散列码,是根据对象的某些信息推导出的一个整数值,默认情况下表示是对象的存储地址。通过散列码,可以提高检索的效率,主要用于在散列存储结构中快速确定对象的存储地址,如Hashtable、hashMap中。为什么说hashcode可以提高检索效率呢?我们先看一个例子,如果想判断一个集合是否包含某个对象,最简单的做法是怎样的呢?逐一取出集合中的每个元素与要查找的对象进行比较,当发现该元素与要查找的对象进行equals()比较的结果为true时,则停止继续

2018-10-19 19:39:44 57669 23

原创 Spring常见面试题总结(超详细回答)

1、Spring是什么?Spring是一个轻量级的IoC和AOP容器框架。是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置。主要由以下几个模块组成:Spring Core:核心类库,提供IOC服务;Spring Context:提...

2018-07-08 15:36:08 896416 144

原创 MySQL数据库:索引的实现原理

一、MySQL索引的数据结构:常见的索引的数据结构有:B+Tree、Hash索引。1、Hash索引:MySQL中,只有Memory存储引擎支持hash索引,是Memory表的默认索引类型。hash索引把数据以hash值形式组织起来,因此检索效率非常高,可以一次定位。hash索引的缺点:(1)Hash索引仅能满足等值的查询,不能满足范围查询、排序。因为数据在经过Hash算法后,其大小关系就可能发生变化。(2)当创建组合索引时,不能只适用组合索引的部分列进行查询。因为hash索引是把多

2018-06-25 10:22:41 14486 3

原创 Java虚拟机:垃圾回收机制与垃圾收集器

在GC开始时,对象会存在Eden和From区,To区是空的,当Eden区没有足够的内存分配给对象时,虚拟机会发起一次Minor GC。进行GC时,Eden区存活的对象会被复制到To区,From区存活的对象会根据年龄值决定去向,达到阈值的对象会被移动到老年代中,没有达到阈值的对象会被复制到To区(但如果符合“动态年龄判断”的条件,即使未达到阈值也会从Survivor区直接移动到老年代)。这时Eden区和From区已经被清空了,接下来From区和To区交换角色,以保证To区在GC开始时是空的。...

2018-05-12 17:23:14 11493 3

原创 《卓有成效的工程师》读书笔记

本书通过“杠杆率“,用来推断、分析工作的有效性与影响力,研究并说明了如何成为一名卓有成效的软件工程师。更为重要的是,本书包含了一系列可落地且经过验证的策略作为框架的补充,读者可以应用这些策略来提高工作成效。本书的主题分为三个部分:从提高成效的思维模式入手,深入探讨持续提升执行力并取得工作进展的关键策略,在第三部分转换角度,阐述了研究创造长期价值的方法。通过阅读本书,读者能够获得高价值的思维启发和实践经验,在成为卓有成效的工程师同时,打造高效的软件工程团队

2022-09-21 10:01:45 2686 3

原创 SonarQube代码质量检查平台

SonarQube 是一个代码质量管理的开源平台,通过 SonarQube 提供的代码扫描、质量阈值卡点等质量红线,我们可以提升系统的可靠性,提前捕获和提示代码中的错误,从而避免未定义的行为影响到用户,保证业务质量,也能确保管理的代码库干净并且可维护,以便提高开发人员的开发效率。另外 SonarQube 也可以生成详细的代码分析质量报告,并通过强大的仪表盘展示出来,使我们能够根据角色的不同,查看不同维度的度量标准。...

2022-08-16 11:20:15 12558

转载 代码质量管控的四个阶段

质量、功能和进度,是一个软件项目的三根支柱,但在现实项目中,当质量和其它两项产生冲突时,往往是作为被牺牲的对象。团队对于质量的态度主要停留在口头重视上,似乎还没有上升到团队意识的高度,也缺乏必要的保障手段。但没有质量的功能,从它面世第一天就开始永无止境的修补,并最终走向被重写的命运;没有质量的进度,只能是一个虚伪的承诺,因为接踵而至的,是一轮又一轮的附加开销,有效进度被大大拖延。要想提升代码质量,首先需要确立质量意识。...

2022-08-15 08:45:00 2600 1

原创 IDEA插件之代码质量检查利器 - Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint

随着业务的发展,系统会越来越庞大,原本简单稳定的功能,可能在不断迭代后复杂度上升,潜在的风险也随之暴露,导致最终服务不稳定,造成业务价值的损失。而为了减少这种情况,其中一种比较好的方式就是提高代码质量,从而降低错误风险。工欲善其事,必先利其器,这篇文章给大家介绍几种检查代码质量的利器:Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint...

2022-08-15 08:30:00 8468 2

原创 接口全周期的生产力利器Apifox

官方对 Apifox 定位是:Apifox = Postman + Swagger + Mock + JMeter,作为一款接口全周期的生产力工具、一站式接口管理平台,它真正实现了数据流的打通,在一个软件上就能实现 接口设计-> 接口文档 -> 接口调试 -> 接口修改 -> 接口mock -> 接口测试 -> 接口自动化 -> 接口迭代 的工作流闭环,后端,前端,测试不同领域既能各取所需,又能协同合作。.........

2022-07-22 08:30:00 5555 23

原创 Skywalking全链路追踪使用说明

随着系统的复杂度也越来越高,我们软件架构也进入了分布式阶段,一次请求可能横跨多个服务模块、项目,依赖的中间件也越来越多,其中任何一个节点出现异常,都可能导致业务出现波动或者异常。而传统的日志监控等方式无法很好满足调用链路跟踪,排查问题等需求,这就导致定位/诊断服务异常变得异常复杂。因此面对复杂的调用链路,我们需要一款具体如下功能全链路追踪工具,提高我们对业务的掌控度:①请求链路追踪,快速定位故障;②可视化链路各阶段的耗时,进行性能分析;③ 梳理服务依赖关系;④ 系统指标监控,吞吐量、响应时间及错误记录等

2022-05-01 08:00:00 35690 1

原创 Spring Cloud Gateway 整合 sentinel 实现流控熔断

在微服务架构中,网关层可以屏蔽外部服务直接对内部服务进行调用,对内部服务起到隔离保护的作用,网关限流,顾名思义,就是通过网关层对服务进行限流,从而达到保护后端服务的作用。如果已经在网关层面做了限流,那么躲在身后的服务是否就安全了呢?答案是否定的,因此最常见的解决方案是:网关层集群限流+内部服务的单机限流兜底,这样才能保证不被流量冲垮

2022-02-14 08:30:00 26252 7

原创 Spring Cloud Gateway 服务网关的部署与使用详细介绍

网关作为系统的唯一流量入口,封装内部系统的架构,所有请求都先经过网关,由网关将请求路由到合适的微服务,所以,使用网关的好处在于:(1)简化客户端的工作。网关将微服务封装起来后,客户端只需同网关交互,而不必调用各个不同服务;(2)降低函数间的耦合度。 一旦服务接口修改,只需修改网关的路由策略,不必修改每个调用该函数的客户端,从而减少了程序间的耦合性(3)解放开发人员把精力专注于业务逻辑的实现。由网关统一实现服务路由(灰度与ABTest)、负载均衡、访问控制、流控熔断降级等非业务相关功能

2022-02-14 08:15:00 88584 21

原创 SpringCloud Ribbon负载均衡 + OpenFeign远程HTTP调用用法与原理

openFeign 作为微服务架构下服务间调用的解决方案,是一种声明式、模板化的 HTTP 的模板,使 HTTP 请求就像调用本地方法一样,通过 openFeign 可以替代基于 RestTemplate 的远程服务调用,并且默认集成了 Ribbon 进行负载均衡。目标是减少 HTTP API 的复杂性,希望能将 HTTP 远程服务调用做到像 RPC 一样易用。...

2022-02-14 08:00:00 23132 4

原创 Nacos配置中心用法详细介绍

配置中心区别于传统的配置信息分散到系统各个角落的方式,对系统中的配置文件进行集中统一管理,而不需要逐一对单个的服务器进行管理。通过配置中心,可以使得配置标准化、格式统一化;当配置信息发生变动时,修改实时生效,无需要重新重启服务器,就能够自动感知相应的变化,并将新的变化统一发送到相应程序上,快速响应变化;通过审计功能还可以追溯问题

2022-02-14 07:45:00 71676 6

原创 SpringCloud LoadBalancerClient 负载均衡原理

LoadBalancerClient 在初始化时会通过 Eureka Client 向 Eureka 服务端获取所有服务实例的注册信息并缓存在本地,并且每10秒向 EurekaClient 发送 “ping”,来判断服务的可用性。如果服务的可用性发生了改变或者服务数量和之前的不一致,则更新或者重新拉取。最后,在得到服务注册列表信息后,ILoadBalancer 根据 IRule 的策略进行负载均衡(默认策略为轮询)。

2022-02-14 07:45:00 12982

原创 Nacos注册中心的部署与用法详细介绍

注册中心是微服务架构中的纽带,类似于”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址并进行调用。注册中心本质上是为了解耦服务提供者和服务消费者,除此之外还能对服务进行动态管理,降低服务端负载均衡中间件的压力

2022-02-14 07:30:00 34054 6

原创 Spring Cloud Gateway 整合 knife4j 聚合接口文档

当系统中微服务数量越来越多时,如果任由这些服务散落在各处,那么最终管理每个项目的接口文档将是一件十分麻烦的事情,单是记住所有微服务的接口文档访问地址就是一件苦差事了。当如果能够将所有微服务项目的接口文档都统一汇总在同一个可视化页面,那么将大大减少我们的接口文档管理维护工作,为此,我们可以基于 Spring Cloud Gateway 网关 + nacos + knife4j 对所有微服务项目的接口文档进行聚合,从而实现我们想要的文档管理功能

2022-02-14 01:28:56 23768 9

原创 ElasticSearch搜索引擎: 内存分析与设置

在Elasticsearch 的运行过程中,如何合理分配与设置内存是一件十分重要的事情,否则十分容易出现各种问题。一、Elasticsearch为什么吃内存:我们先看下 ES 服务器的总体内存消耗情况:对于Query Cache、Request Cache、FieldData Cache 以及 Segment 的介绍,在前面的文章以及介绍过了,这里就不重复介绍了:Elasticsearch搜索引擎之缓存:Request Cache、Query Cache、Fiel...

2022-02-07 08:00:00 2787

原创 ElasticSearch搜索引擎:数据的写入流程

(1)ES 客户端选择一个节点 node 发送请求过去,这个节点就是协调节点 coordinating node(2)协调节点对 document 进行路由,通过 hash 算法计算出数据应该落在哪个分片shard 上,然后根据节点上维护的 shard 信息,将请求转发到对应的实际处理节点node上(3)实际的节点上的primary shard 主分片处理请求,然后将数据同步到副本节点(4)coordinating node 等到primary node 和所有 replica node 都执

2022-02-07 08:00:00 13465

原创 sentinel 限流熔断神器详细介绍

Sentinel 是一款面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来保障服务的稳定性,核心思想是:根据对应资源配置的规则来为资源执行相应的流控/降级/系统保护策略,

2022-01-28 17:43:14 32117 6

原创 Sentinel 规则持久化到 apollo 配置中心

Sentinel 规则默认是存储在内存中的,只要服务重启之后对应的规则也会消失,实际的生产中肯定是不允许这种操作,因此 Sentinel 官方推荐在生产架构中使用第三方数据源作为永久存储中心,比如 nacos、apollo、zookeeper。因为这几种数据源都是基于 push 模式,也就是由规则中心统一推送,Sentinel Client 只需通过注册监听器的方式时刻监听变化,并负责获取配置中心推送的配置并更新到本地,这种方式能更好的保证实时性和一致性,并且各个微服务的限流、降级规则都可以永久存储。

2022-01-28 00:28:04 10570 3

原创 RocketMQ事务消息原理

基于MQ的分布式事务方案,本质上是对本地消息表的一个封装,整体流程与本地消息表一致,唯一不同的就是将本地消息表存在了MQ内部,而不是业务数据库,事务消息解决的是生产端的消息发送与本地事务执行的原子性问题,确保 MQ 生产端正确无误地将消息发送出来,没有多发,也不会漏发,至于发送后消费端有没有正常的消费消息,这种异常场景将由 MQ 消息消费失败重试机制来保证。

2022-01-24 08:15:00 15483 7

原创 Java IO篇:什么是零拷贝?

在传统的数据 IO 模式中,读取一个磁盘文件,并发送到远程端的服务,就共有四次用户空间与内核空间的上下文切换,四次数据复制,分别是两次 CPU 数据复制,两次 DMA 数据复制。零拷贝指在进行数据 IO 或传输时,数据在用户态下经历了零次拷贝,并非不拷贝数据。通过减少数据传输过程中 内核缓冲区和用户进程缓冲区间不必要的 CPU数据拷贝 与 用户态和内核态的上下文切换次数,降低 CPU 在这两方面的开销,释放 CPU 执行其他任务,更有效的利用系统资源,提高传输效率,同时还减少了内存的占用,提升应用程序的性能

2022-01-24 08:15:00 15655 5

原创 JUC多线程:线程的中断停止

对于线程的停止,通常情况下我们是不会去手动去停止的,而是等待线程自然运行至结束,但在实际开发中,很多情况中需要我们提前去手动来停止线程,比如程序中出现异常错误、使用者关闭程序等情况中。如果不能很好地停止线程那么可能会导致各种问题,所以正确的停止线程是非常的重要的,常见的中断线程的方式有以下几种:① 方式一:使用 Thread 类的 stop() 方法来终止线程;② 方式二:根据 volatile 修饰的标志位判断线程是否需要中断;③ 方式三:通过 interrupt中断机制终止线程;

2022-01-24 08:00:00 3596 2

原创 堆栈分析-服务器问题定位

日常开发中,我们常见的服务器问题主要可以归类为一下几种:CPU过载问题、内存过高问题、磁盘IO问题、网络问题。当服务器出现问题时,我们一般可以按照以下思路进行定位:① 如果最近有版本发布,则先从代码提交记录中分析最新版本代码是否存在问题;② 使用 ps、top等命令分析线程状态;③ 先将出现异常的服务器下线并保留服务器环境,接着使用 jstack 导出线程快照信息以及使用 jmap 导出堆栈内存日志进行分析,该命令会会线上服务器性能造成影响,所以执行前先下线服务器防止对用户造成影响...

2022-01-24 08:00:00 7342 1

原创 Sentinel-Dashboard 与 apollo 规则的相互同步

那什么需要对 Sentinel 进行改造呢?主要是因为所有规则都只能通过 Nacos 或 Apollo 控制台来完成修改才能得到持久化存储,而在 Sentinel Dashboard 中修改限流规则虽然可以生效,但是不会被持久化到配置中心。生产环境下推荐采用 push 模式的数据源,push 推送的操作应该由 Sentinel dashboard 和 Config Center Dashboard 控制台统一进行管理和推送,Sentinel Client 仅负责获取配置中心推送的配置并更新到本地。

2022-01-24 07:45:00 10896 3

原创 Java IO篇:什么是 Reactor 网络模型?

Reactor 模式也叫做反应器设计模式,是一种为处理服务请求并发提交到一个或者多个服务处理器的事件设计模式。当请求抵达后,通过服务处理器将这些请求采用多路分离的方式分发给相应的请求处理器。Reactor 模式主要由 Reactor 和处理器 Handler 这两个核心部分组成,它俩负责的事情如下:① Reactor:负责监听和分发事件,事件类型包含连接事件、读写事件;② Handler :负责处理事件,如 read -> 业务逻辑 (decode + compute + encode)-> send

2022-01-24 02:01:28 18041 3

原创 RocketMQ-docker镜像的制作与部署

本文主要介绍下 RocketMQ-docker 镜像的制作与部署,方便在不同环境快速启动RocketMQ,核心操作分为三个:NameServer 镜像的制作与部署、Broker 镜像的制作与部署、console 镜像的制作与部署。

2022-01-18 08:00:00 3039 1

原创 Java IO篇:序列化与反序列化

两个服务之间要传输一个数据对象,就需要将对象转换成二进制流,通过网络传输到对方服务,再转换成对象,供服务方法调用。这个编码和解码的过程称之为序列化和反序列化。所以序列化就是把 Java 对象变成二进制形式,本质上就是一个byte[]数组。将对象序列化之后,就可以写入磁盘进行保存或者通过网络中输出给远程服务了。反之,反序列化可以从网络或者磁盘中读取的字节数组,反序列化成对象,在程序中使用。

2022-01-12 08:30:00 11772 1

原创 四层LVS与七层Nginx负载均衡的区别

一、四层负载均衡与七层负载均衡:(1)四层负载均衡:四层负载均衡工作在 OSI 七层模型的第四层(传输层),指的是负载均衡设备通过报文中的目标IP地址、端口和负载均衡算法,选择到达的目标内部服务器,四层负载均衡对数据包只起一个数据转发的作用,无法修改或判断所请求资源的具体类型,也不会干预客户端与服务器之间应用层的通信(如三次握手等)。但在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能会对报文原来的源地址进行修改。四层负载均...

2022-01-12 08:30:00 4268 1

原创 什么是RPC?RPC框架dubbo的核心流程

RPC 是一种进程间通信方式,允许像调用本地服务一样调用远程服务,通信协议大多采用二进制方式。RPC 框架的目标就是让远程服务调用更简单、透明,由 RPC 框架负责屏蔽底层的序列化、传输方式和通信的细节,开发者在使用时只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。而 Dubbo 是阿里巴巴开源的基于 Java 的 RPC 分布式服务框架,提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。...

2022-01-12 08:15:00 25597 7

原创 Java IO篇:什么是 Proactor 网络模型?

Proactor 是异步网络模式, 感知的是已完成的读写事件。在发起异步读写请求时,需要传入数据缓冲区的地址(用来存放结果数据)等信息,这样系统内核才可以自动帮我们把数据的读写工作完成,这里的读写工作全程由操作系统来做,并不需要像 Reactor 那样还需要应用进程主动发起 read/write 来读写数据,操作系统完成读写工作后,就会通知应用进程直接处理数据。

2022-01-10 08:15:00 6414

Spring+Struts + Hibernate整合jar包

spirng4.3.9+struts2.3.24+hibernate5.0.9整合jar包依赖完整版。

2018-07-13

Spring+SpringMVC+Mybaits整合jar包

spring4.3.9+springmvc4.3.9+mybatis3.4.4的整合jar包依赖完整版。

2018-07-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除