- 博客(23)
- 收藏
- 关注
原创 浅谈MVC开发模式及三层架构
浅谈MVC开发模式及三层架构在软件开发中,合理的架构设计是保证系统可维护性、可扩展性和复用性的关键。MVC开发模式与三层架构是两种经典的设计思想,它们从不同角度解决了软件设计中的耦合问题,被广泛应用于各类应用开发中。本文将简要探讨两者的核心思想、组成部分及内在联系。
2025-07-09 22:29:47
869
原创 JSP标准标签库中常用的标签
JSTL(JSP标准标签库)包含五大核心标签库:1) Core标签库提供流程控制(c:if/c:choose)、迭代(c:forEach)和URL处理等功能;2) fmt标签库支持日期/数字格式化和国际化;3) sql标签库用于数据库操作;4) xml标签库处理XML文档;5) fn函数库提供字符串/集合操作。使用需先导入对应标签库(<%@taglib%>),配合EL表达式实现页面逻辑。JSTL能减少JSP中的Java代码,提升代码可维护性,但业务逻辑仍应放在Servlet层。注意需配置相关JA
2025-07-08 22:23:13
359
原创 jsp动作中forward与include的区别
JSP标签<jsp:forward>和<jsp:include>的主要区别在于执行流程和作用范围。<jsp:forward>完全转移请求控制权,终止原页面执行;而<jsp:include>则动态包含其他资源内容,合并输出结果。两者都保留请求作用域,支持参数传递,但应用场景不同:前者适用于页面跳转,后者适合组件复用。性能上前者稍优,但实际差异不大。
2025-07-06 20:23:32
396
原创 如何将Java对象转换为Json格式的字符串
本文介绍了四种Java对象转JSON的方法:1) Jackson库功能全面、性能良好;2) Google的Gson库简单易用;3) 阿里巴巴FastJSON性能卓越但兼容性稍逊;4) JavaEE标准API JSON-B适合企业级应用。每种方法均提供代码示例和Maven依赖配置,开发者可根据项目需求选择合适方案。其中Jackson作为通用方案推荐优先考虑,FastJSON适合高性能场景,JSON-B则适用于标准JavaEE环境。
2025-07-06 20:21:42
334
原创 Java中的动态代理
动态代理是一种强大的机制,允许在运行时创建代理类和对象,而无需显式编写代理类的源代码。它主要通过类和接口实现,是 AOP(面向切面编程)、RPC 框架等技术的核心基础。InvocationHandler:Proxy 类:工作原理:下面是一个使用动态代理实现日志记录的完整示例:java代码说明 接口定义:定义了业务方法和实现类:是业务逻辑的具体实现日志处理器:实现了接口,在方法中:代理对象创建:方法调用:plaintext动态代理的优势在于不需要编写大量重复的代理类代码,通过统一的处理逻
2025-06-26 19:02:21
244
原创 Java的反射机制
Class类:代表一个类,获取Class对象的方式有三种,分别是通过 类名.class 获取、通过对象的 getClass() 方法获取、通过 Class.forName("类的全限定名") 获取。Java的反射机制是指程序在运行时能够获取类的信息,并动态操作类或对象的能力,比如获取类的构造器、方法、字段等信息,以及创建对象、调用方法等。- 获取类的信息:可以获取类的名称、修饰符、父类、实现的接口等信息,帮助在运行时了解类的结构。- Method类:代表类的方法,可用于调用对象的方法。
2025-06-25 22:56:52
181
原创 Redis入门知识
NoSQL:非结构化数据,包括键值对、文档、列族、图等形式,如Redis的键值对 {id:1001, name:"张三", age:21}。- 对象存储:存储Java对象时,可序列化为JSON字符串后存入,如 {"id":1, "name":"张三", "age":21}。- 格式:建议采用 项目名:业务名:类型:id 的层级结构,如 heima:user:1 、 heima:product:1。- SQL:结构化数据,以表的形式存储,如 id 、 name 、 age 等字段组成的表。
2025-06-25 22:56:14
384
原创 若需存储100个元素到HashMap中,如何避免其发生扩容。
初始化容量应设置为256,既能容纳100个元素,又避免因扩容导致的性能损耗(扩容需重建哈希表,耗时耗资源)。数组容量必须为2的幂次方(如16、32、64...),否则会影响哈希算法的效率(通过位运算替代取模运算)。默认加载因子为0.75,当哈希Map中元素数量超过 容量×加载因子 时,会触发扩容。capacity ≥ 元素数量 / 自定义加载因子 ,再向上取最近的2的幂次方。2的幂序列:128(2⁷)、256(2⁸),故最终容量设为256。134不是2的幂次方,需向上找到大于134的最小2的幂次方数。
2025-06-21 18:33:38
180
原创 spring中bean的生命周期
Bean 生命周期核心流程:实例化(构造函数)→ 属性注入(依赖注入)→ 初始化(执行 Aware 接口、BeanPostProcessor 前置处理、@PostConstruct、InitializingBean、自定义 init 方法)→ 使用阶段 → 销毁(@PreDestroy、DisposableBean 接口或自定义 destroy 方法),容器通过回调机制在各阶段提供扩展点。通过掌握 Bean 生命周期,可精准控制 Bean 初始化、销毁逻辑,适配复杂场景(如资源加载、代理生成)。
2025-06-21 08:32:30
424
原创 常用排序算法及简单实现
平均时间复杂度 \(O(n\log n)\),最坏时间复杂度 \(O(n^2)\),空间复杂度 \(O(\log n)\)。:时间复杂度 \(O(n^2)\),空间复杂度 \(O(1)\)。:时间复杂度 \(O(n^2)\),空间复杂度 \(O(1)\)。:时间复杂度 \(O(n^2)\),空间复杂度 \(O(1)\)。
2025-06-17 11:17:02
193
原创 String Stringbuffer Stringbulder的区别
StringBuffer 和 StringBuilder:可变,可直接修改字符串内容,不会产生新对象。- StringBuilder:适用于单线程、频繁修改字符串的场景(如日志拼接、SQL 语句构建)。- StringBuilder:性能最优,适用于单线程下的频繁字符串操作(如拼接、删除)。- StringBuffer:适用于多线程环境下的字符串操作(如网络请求参数拼接)。- String:频繁操作时性能最差,因每次操作都会生成新对象。- String:适用于内容不变的场景,如常量、少量字符串操作。
2025-06-17 11:07:05
227
原创 JVM的内存模型、JVM的调优
-Xmn (新生代大小):新生代过大可能导致Minor GC频繁,过小则可能触发Full GC,一般设为堆内存1/3~1/4。- JDK自带工具: jps (查看进程)、 jstat (监控GC)、 jmap (内存快照)、 jstack (线程栈分析)。- -Xms (初始堆大小)、 -Xmx (最大堆大小),建议设为相同值避免动态扩容开销,通常占物理内存60%~80%。- 低延迟场景:用 -XX:+UseG1GC (G1垃圾收集器)或ZGC(JDK 11+,需 -XX:+UseZGC )。
2025-06-16 11:05:29
699
原创 AOP与动态代理机制
这里细讲一下动态代理。记住代理的本质是对目标对象的方法调用进行拦截和增强,比如事务管理、日志记录都是通过代理实现的AOP的底层机制分为JDK动态代理和CGLib动态代理。需要特别注意AOP的失效场景,比如同一个类中的方法互相调用,a方法调用b方法时,b方法上的AOP注解会失效。因为AOP通过生成动态代理处理,而同一个类中的方法互相调用不需要经过代理,所以AOP会失效。如果遇到AOP失效场景,比如同一个类中a方法调用b方法,b方法相当于被拷贝到a方法里,此时b方法的AOP失效,其事务也会跟着失效。
2025-06-15 23:17:48
141
原创 @Transactional注解在什么时候会失效
如果你在一个事务方法内部启动新线程并在新线程中进行数据库操作,该操作不会自动加入到外层方法的事务中。如果在事务方法中捕获了异常( try...catch )并且没有重新抛出(或者抛出了非 RuntimeException/Error ),那么事务切面就无法知道出现了需要回滚的情况。此时对 B() 的调用是直接的,并没有经过 Spring 的动态代理(事务切面),因此事务不会生效。解决: 确保使用的数据库支持事务,并且相关的表使用的是支持事务的存储引擎(如 MySQL 的 InnoDB)。
2025-06-15 22:18:08
253
原创 Spring Cloud --2:OpenFeign、Sentinel、Gateway 与 Seata
本文摘要: Spring Cloud微服务架构核心组件解析:OpenFeign实现声明式服务调用,支持负载均衡与熔断降级;Sentinel提供流量控制、熔断降级等防护能力;Spring Cloud Gateway作为统一网关,实现动态路由与安全过滤;Seata解决分布式事务问题,支持AT、TCC等多种模式。文章详细剖析了各组件的核心功能、配置方法及整合方案,包括OpenFeign的拦截器与日志配置、Sentinel的熔断策略、Gateway的限流优化以及Seata的AT模式工作原理。最后给出企业级架构建议,
2025-06-15 21:00:03
993
原创 SpringCloud--01 分布式概述、Nacos
Nacos 双重角色:注册中心解决服务发现问题,配置中心实现分布式配置管理服务注册与发现核心步骤:依赖引入→地址配置→注解开启→API 调用配置中心关键能力:动态刷新、多环境隔离、服务级配置隔离。
2025-06-14 19:26:31
660
原创 RabbitMQ
RabbitMQ 是的开源消息中间件,这意味着部署RabbitMQ时需要先下载Erlang,对于不同的操作系统需要下载的版本不同,安装复杂,建议使用Docker部署。
2025-06-08 17:23:38
420
原创 关于MQ(RabbitMQ、Kafka、RocetMQ)
MQ 通过 “存储 - 转发” 机制,解决分布式系统中服务耦合、流量冲击、异步通信等问题,是微服务架构、高并发场景的核心组件。
2025-06-07 22:00:58
778
原创 什么是Mybaits、它的优缺点、
1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。2、MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
2025-06-06 18:50:38
254
原创 JVM 加载 class 文件的原理机制
JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的。加载完成后,Class 对象还不完整,所以此时的类还不可用。当 Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、类的加载是指把类的.class 文件中的数据读。类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加。类加载器是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入类文件。类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么。
2025-06-05 19:08:47
187
原创 什么是Spring、SpringMVC、SpringBoot
Spring: 轻量化的容器框架(IOC+AOP),用来管理javaBean;也是中间层框架可以起一个连接作用。SpringMVC:SpringMVC是Spring框架的一个模块是一个轻量级的web框架,主要用来处理web请求,基于。SpringBoot:基于Spring的快速开发的框架,SpringBoot 是基于 Spring 的。,旨在通过 “约定大于配置” 的理念,自动配置 Spring 及第三方库,大幅减少样板代码和配置工作量,简化配置过程。,分离业务逻辑、用户界面和请求处理流程。
2025-06-05 18:53:14
107
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人