小菜鸟

java菜鸟号正在起航

Java 泛型详解:类型安全的基石

泛型(Generics)是 Java 5 引入的核心特性,它允许在定义类、接口和方法时使用类型参数,从而实现代码的类型安全复用性。在泛型出现之前,集合类只能存储 Object 类型,取出时必须强制转换,容易引发运行时 ClassCastException。泛型的出现将类型检查提前到编译期,从根本上解决了这一问题。

泛型的核心价值

  1. 编译期类型检查:阻止将错误类型的对象放入集合,避免运行时类型转换异常。
  2. 消除强制类型转换:从集合中获取元素时无需手动转换,代码更简洁。
  3. 代码复用:一套泛型代码可适配多种数据类型(如 ArrayList<String>ArrayList<Integer> 共享同一套 ArrayList 实现)。
  4. 提升可读性:通过类型参数明确集合或方法支持的数据类型,代码意图更清晰。

泛型的基本用法

泛型类与泛型接口

泛型类 / 接口在定义时声明类型变量(用 <T> 表示),使用时指定具体类型。

示例:自定义泛型类
// 定义泛型类,T为类型变量(可替换为任意标识符,通常用T、E、K、V等)
public class Box<T> {
    private T value; // 使用类型变量作为属性类型

    public Box(T value) { // 作为构造器参数类型
        this.value = value;
    }

    public T getValue() { // 作为返回值类型
        return value;
    }

    public void setValue(T value) { // 作为方法参数类型
        this.value = value;
    }
}

// 使用泛型类:指定具体类型(如String、Integer)
public class BoxDemo {
    public static void main(String[] args) {
        Box<String> stringBox = new Box<>("Hello");
        String str = stringBox.getValue(); // 无需强制转换

        Box<Integer> intBox = new Box<>(123);
        int num = intBox.getValue(); // 自动拆箱
    }
}
示例:泛型接口
阅读全文 »

Java 异常处理详解:从原理到实践

异常是程序运行过程中出现的非预期情况(如空指针、数组越界等)。Java 提供了完善的异常处理机制,通过 try-catch-finallythrowthrows 等关键字,使程序在遇到异常时能够优雅地处理,而非直接崩溃。本文将深入解析 Java 异常体系、处理机制及最佳实践。

异常体系结构

Java 异常体系以 Throwable 为根类,分为两大分支:Error(错误)Exception(异常),二者均继承自 Throwable

Throwable
├─ Error(错误):JVM 无法处理的严重问题
│  ├─ VirtualMachineError(虚拟机错误)
│  │  ├─ OutOfMemoryError(内存溢出)
│  │  └─ StackOverflowError(栈溢出)
│  └─ NoClassDefFoundError(类定义未找到)
│
└─ Exception(异常):程序可处理的问题
   ├─ RuntimeException(运行时异常,非检查型)
   │  ├─ NullPointerException(空指针)
   │  ├─ ClassCastException(类型转换)
   │  ├─ ArithmeticException(算术错误)
   │  └─ IndexOutOfBoundsException(下标越界)
   │
   └─ 非 RuntimeException(检查型异常)
      ├─ IOException(I/O 异常)
      ├─ ClassNotFoundException(类未找到)
      └─ SQLException(数据库异常)

1. Error(错误)

Error 表示 JVM 自身无法解决的严重问题,通常由硬件或系统级故障导致,程序无法处理,应避免捕获 Error

  • 常见类型:
    • OutOfMemoryError:内存溢出(如无限创建对象)。
    • StackOverflowError:栈溢出(如无限递归调用)。
    • NoClassDefFoundError:类定义缺失(如编译后删除了 .class 文件)。

2. Exception(异常)

Exception 表示程序运行中可预期的异常,程序可以捕获并处理,分为两类:

阅读全文 »

SSM 框架基本配置详解:从 Web 到事务的完整搭建

SSM(Spring + SpringMVC + MyBatis)是 Java 企业级开发的经典框架组合,通过 Spring 的 IOC 容器管理对象,SpringMVC 处理 Web 请求,MyBatis 简化数据库操作,三者协同实现高效开发。本文基于提供的配置文件,详细解析 SSM 框架的核心配置与工作流程。

Web.xml 配置:Web 应用的入口

web.xml是 Web 应用的部署描述符,负责配置 Servlet、过滤器、监听器等 Web 组件,是 SSM 框架与 Web 容器(如 Tomcat)交互的入口。

核心配置解析

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    <!-- 1. 错误页面配置 -->
    <error-page>
        <error-code>404</error-code>
        <location>/error404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error500.jsp</location>
    </error-page>

    <!-- 2. 加载Spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- 指定Spring配置文件路径(支持通配符) -->
        <param-value>WEB-INF/classes/spring/applicationContext-*.xml</param-value>
    </context-param>
    <listener>
        <!-- Spring的上下文加载监听器,启动时初始化Spring容器 -->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 3. 配置SpringMVC前端控制器 -->
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- SpringMVC配置文件路径 -->
            <param-value>WEB-INF/classes/spring/springmvc.xml</param-value>
        </init-param>
        <!-- 可选:设置启动顺序(1表示Web容器启动时立即加载) -->
        <!-- <load-on-startup>1</load-on-startup> -->
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <!-- 拦截所有请求(除JSP外),由DispatcherServlet处理 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 4. 解决POST请求乱码的过滤器 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!-- 对所有请求生效 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 5. 欢迎页配置 -->
    <welcome-file-list>
        <welcome-file>welcome.jsp</welcome-file>
    </welcome-file-list>
</web-app>

关键作用:

阅读全文 »

Spring 框架核心构成与模块解析:从核心容器到企业级集成

Spring 框架是 Java 企业级开发的 “基石”,其设计理念是 “模块化、松耦合、可扩展”,通过分层的模块架构覆盖从 “核心 IOC 容器” 到 “Web 开发”“数据访问”“AOP 切面” 等全场景需求。从 “核心容器→数据访问→Web 开发→AOP 与扩展” 四大维度,详细拆解每个模块的职责、核心组件及实际应用场景,并梳理模块间的协作关系。

Spring 框架整体架构图

模块

核心容器层(Core Container):Spring 的 “地基”

核心容器是 Spring 框架的基础核心,提供 IOC(控制反转)DI(依赖注入) 核心能力,所有其他模块均依赖于此层。其核心目标是 “管理对象的生命周期与依赖关系”,降低代码耦合度。

1. Spring Core:核心工具类与 IOC 基础

  • 核心职责:提供 Spring 框架的底层核心工具类,是 IOC 容器的 “骨架”。
  • 核心组件:
    • BeanFactory:IOC 容器的顶层接口,采用工厂模式管理 Bean,负责 Bean 的创建、依赖注入与生命周期控制。
      • 特点:延迟初始化(容器实例化时不创建 Bean,仅在调用 getBean() 时才实例化并装配依赖),适合内存敏感场景。
      • 常用实现:DefaultListableBeanFactory(Spring 内部默认实现,支持 XML / 注解配置)。
    • BeanDefinition:描述 Bean 的 “元数据”(如类名、属性、依赖、作用域等),是容器创建 Bean 的依据。
  • 关键作用:定义 IOC 容器的基本规范,为其他模块提供基础支持(如 Bean 注册、依赖解析)。
阅读全文 »

Spring MVC 核心流程与配置详解:从请求到响应的完整链路

Spring MVC 是基于 MVC 设计模式的 Web 框架,其核心是通过 DispatcherServlet(前端控制器) 统一调度所有请求,配合 HandlerMapping、HandlerAdapter、ViewResolver 等组件完成 “请求处理→业务逻辑→视图渲染” 的全流程。,从 “执行流程拆解→核心组件职责→Java 配置方式” 三个维度,彻底讲透 Spring MVC 的工作原理。

Spring MVC 核心执行流程(图文解析)

执行流程

Spring MVC 的执行流程围绕 DispatcherServlet 展开,共 8 个关键步骤,每个步骤由特定组件协作完成,确保请求按规范流转:

步骤 1:用户发送请求,DispatcherServlet 接收请求

  • 触发点:用户通过浏览器 / 客户端发送 HTTP 请求(如 GET /user/list),请求首先到达 Web 容器(如 Tomcat);
  • DispatcherServlet 角色:作为 Spring MVC 的 “前端控制器”,是所有请求的统一入口,负责全局流程控制,自身不处理具体业务逻辑;
  • 底层机制:Web 容器通过 web.xml 或 Java 配置,将所有请求(或指定 URL 模式)映射到 DispatcherServlet(如配置 url-pattern: / 拦截所有请求)。

步骤 2:DispatcherServlet 调用 HandlerMapping,获取 HandlerExecutionChain

  • HandlerMapping 职责:根据请求 URL 找到对应的 “处理器(Handler,通常是 Controller 的方法)”,并返回 HandlerExecutionChain 对象;
  • HandlerExecutionChain 组成:包含两部分:
    1. Handler:具体的业务处理器(如 UserControllergetUserList() 方法);
    2. HandlerInterceptor 数组:请求处理前后的拦截器(如日志拦截器、权限拦截器);
  • 核心设计模式策略模式。Spring 提供多种 HandlerMapping 实现(如 RequestMappingHandlerMapping 用于注解式 Controller),可灵活切换映射策略(如按 URL 路径、按请求参数映射)。
阅读全文 »
0%