小菜鸟

java菜鸟号正在起航

Java 语言简介:跨平台特性与核心原理

Java 是由 Sun Microsystems(后被 Oracle 收购)于 1995 年推出的面向对象编程语言,以跨平台性安全性可扩展性著称,广泛应用于企业级开发、移动应用(Android)、大数据处理等领域。

Java 的核心特性

  1. 跨平台性(Write Once, Run Anywhere)
    这是 Java 最显著的优势。Java 程序经编译后生成字节码(.class 文件),而非直接生成机器码。字节码可在安装了 Java 虚拟机(JVM) 的任何平台(Windows、Linux、macOS 等)上运行,无需重新编译。
    • 实现原理:不同平台安装对应版本的 JVM,由 JVM 负责将字节码解释或编译为本地机器码。
    • 对比其他语言:C/C++ 需为不同平台编译不同的机器码,而 Java 只需一次编译,多平台运行。
  2. 面向对象(OOP)
    Java 完全支持面向对象编程的三大特性:
    • 封装:通过类和对象封装数据与行为,隐藏实现细节。
    • 继承:允许类继承父类的属性和方法,实现代码复用。
    • 多态:同一方法在不同对象上有不同实现(如重写、接口)。
  3. 安全性与健壮性
    • 内存管理:通过垃圾回收机制(Garbage Collection)自动释放无用对象,减少内存泄漏。
    • 强类型检查:编译期严格检查数据类型,避免类型错误。
    • 异常处理:强制处理可能的异常,增强程序容错能力。
    • 沙箱机制:限制程序对系统资源的访问(如 Applet 程序),保障安全性。
  4. 多线程支持
    Java 内置多线程库(java.lang.Thread),简化并发编程,适合开发高性能、响应迅速的应用(如服务器程序)。
  5. 丰富的类库与生态
    • 标准库(JDK)提供大量现成工具类(如集合框架、IO 操作、网络编程)。
    • 第三方框架(Spring、MyBatis、Hadoop 等)覆盖企业开发各领域,大幅提升开发效率。

Java 程序的运行流程

Java 程序从编写到运行需经历编译运行两个阶段,核心依赖 JDK(Java 开发工具包)和 JVM:

阅读全文 »

Spring MVC 核心注解全解析:从基础到实战

Spring MVC 提供了丰富的注解体系,简化了请求映射、参数绑定、数据共享等核心功能的开发。从 “注解作用→核心属性→实战示例→注意事项” 四个维度,详细解析 @RequestMapping@PathVariable@RequestParam 等常用注解的使用方法与设计思想。

@RequestMapping:请求路径映射的核心注解

@RequestMapping 是 Spring MVC 中最基础的注解,用于将 HTTP 请求映射到 Controller 方法,可标注在类或方法上,实现细粒度的路径控制。

1. 核心作用

  • 类级别:定义当前 Controller 的基础路径(所有方法路径的前缀);
  • 方法级别:定义具体方法的映射路径(与类级别路径组合为完整路径)。

2. 核心属性

属性名 类型 作用描述 示例
value/path String[] 映射的 URL 路径(支持 Ant 表达式) @RequestMapping(path = "/user/list")
method RequestMethod[] 指定允许的 HTTP 请求方法(如 GET、POST) method = {RequestMethod.GET, RequestMethod.POST}
params String[] 限制请求必须包含指定参数(支持表达式) params = {"id", "name!=admin"}(必须有 id 参数,name 不能为 admin)
headers String[] 限制请求必须包含指定请求头 headers = "Content-Type=application/json"
consumes String[] 限制请求的 Content-Type 类型 consumes = "application/json"
produces String[] 限制响应的 Content-Type 类型 produces = "application/json;charset=UTF-8"

3. Ant 路径匹配规则

@RequestMappingpath 属性支持 Ant 风格的路径表达式,灵活匹配 URL:

阅读全文 »

JDK 7 中 switch 支持 String 的底层实现剖析

在 JDK 7 之前,switch 语句仅支持整型相关类型(如 byteshortintchar 及对应的包装类,以及枚举 enum)。JDK 7 引入了对 String 类型的支持,这一特性并非通过虚拟机层面的改进实现,而是编译器的语法糖—— 通过对字符串的哈希值和 equals 方法进行处理,间接转换为整型判断。本文将深入解析其底层实现原理。

switch 支持 String 的核心思路

switch 语句的本质是基于整数的跳转表(jump table),通过比较整数常量值实现分支跳转。由于字符串不是整数类型,编译器需要将字符串转换为整数形式处理,核心步骤如下:

  1. 计算字符串的哈希值:利用 String.hashCode() 方法将字符串转换为整数(哈希值);
  2. 处理哈希冲突:由于不同字符串可能有相同哈希值(哈希冲突),需通过 equals() 方法二次验证;
  3. 转换为整型 switch:将字符串的分支判断转换为基于哈希值的整型 switch 语句。

代码示例与反编译分析

原始代码

public class SwitchStringDemo {
    public void testSwitch(String gender) {
        switch (gender) {
            case "男":
                System.out.println("男");
                break;
            case "女":
                System.out.println("女");
                break;
            default:
                System.out.println("未知");
        }
    }
}
阅读全文 »

Spring MVC 异常处理详解:三种核心方式与实战指南

在 Spring MVC 应用中,异常处理是保障系统稳定性和用户体验的关键环节。Spring MVC 提供了 @ExceptionHandlerHandlerExceptionResolver@ControllerAdvice + @ExceptionHandler 三种灵活的异常处理机制,覆盖从 “局部 Controller 异常” 到 “全局应用异常” 的全场景。从 “原理→实现→适用场景” 三个维度,彻底讲透 Spring MVC 异常处理的设计与实践。

核心概念:Spring MVC 异常处理流程

Spring MVC 的异常处理由 DispatcherServlet 主导,当 Controller 方法执行抛出异常时,DispatcherServlet 会调用 processHandlerException 方法,遍历所有 HandlerExceptionResolver(异常解析器),直到找到能处理该异常的解析器,最终生成错误响应(视图或 JSON)。

核心源码:DispatcherServlet#processHandlerException

protected ModelAndView processHandlerException(HttpServletRequest request, HttpServletResponse response,
      Object handler, Exception ex) throws Exception {

   ModelAndView exMv = null;
   // 遍历所有异常解析器,寻找能处理当前异常的解析器
   for (HandlerExceptionResolver resolver : this.handlerExceptionResolvers) {
      exMv = resolver.resolveException(request, response, handler, ex);
      if (exMv != null) { // 找到匹配的解析器,终止循环
         break;
      }
   }

   if (exMv != null) {
      // 处理异常视图(如设置默认视图名、暴露错误信息)
      if (exMv.isEmpty()) {
         request.setAttribute(EXCEPTION_ATTRIBUTE, ex);
         return null;
      }
      if (!exMv.hasView()) {
         exMv.setViewName(getDefaultViewName(request));
      }
      WebUtils.exposeErrorRequestAttributes(request, ex, getServletName());
      return exMv;
   }

   // 无解析器处理,直接抛出异常
   throw ex;
}
阅读全文 »

Spring MVC 拦截器详解:从原理到实践

拦截器(Interceptor)是 Spring MVC 提供的核心功能之一,用于在请求处理的不同阶段进行拦截并执行自定义逻辑(如权限校验、日志记录、性能监控等)。它与 Servlet 过滤器(Filter)类似,但更贴合 Spring MVC 的生命周期,使用更灵活。从 “拦截器与过滤器的区别→拦截器的使用→执行原理→实战场景” 全面解析 Spring MVC 拦截器。

拦截器与过滤器的核心区别

虽然拦截器和过滤器都能实现请求拦截,但两者在技术归属、执行时机、拦截范围等方面有本质区别:

特性 拦截器(Interceptor) 过滤器(Filter)
技术归属 Spring MVC 框架提供 Servlet 规范提供(Java EE 原生)
执行时机 在 DispatcherServlet 内部执行 在 DispatcherServlet 之前执行
拦截范围 仅拦截 Spring MVC 管理的请求(如 @RequestMapping 标注的方法) 拦截所有进入 Web 容器的请求(包括静态资源、JSP 等)
底层实现 基于 Java 反射机制 基于函数回调
生命周期管理 由 Spring 容器管理,可注入 Spring Bean 由 Web 容器管理,无法直接使用 Spring 资源
方法粒度 可精确到 Controller 方法级别 仅能到 URL 级别

拦截器的核心接口与方法

Spring MVC 拦截器通过 HandlerInterceptor 接口定义核心行为,包含三个关键方法,分别对应请求处理的不同阶段:

阅读全文 »
0%