Java全栈面试宝典:内存模型与Spring设计模式深度解析

目录

一、JVM内存模型进阶篇

[🔥 问题13:堆与栈的六大维度对比](#🔥 问题13:堆与栈的六大维度对比)

内存结构对比图

核心差异对照表

[🔥 问题14:三区联动内存模型解析](#🔥 问题14:三区联动内存模型解析)

代码内存分配图解

三区协作流程图

二、Spring设计模式全景解析

[🌟 Spring框架七大设计模式](#🌟 Spring框架七大设计模式)

[1. 工厂模式(Factory Pattern)](#1. 工厂模式(Factory Pattern))

[2. 单例模式(Singleton Pattern)](#2. 单例模式(Singleton Pattern))

[3. 代理模式(Proxy Pattern)](#3. 代理模式(Proxy Pattern))

[4. 模板方法模式(Template Method)](#4. 模板方法模式(Template Method))

[5. 观察者模式(Observer Pattern)](#5. 观察者模式(Observer Pattern))

[6. 适配器模式(Adapter Pattern)](#6. 适配器模式(Adapter Pattern))

[7. 装饰器模式(Decorator Pattern)](#7. 装饰器模式(Decorator Pattern))

三、Spring核心容器模块深度剖析

[Spring Context模块架构](#Spring Context模块架构)

核心功能解析

四、高频面试题强化训练

[1. Spring中如何保证线程安全?](#1. Spring中如何保证线程安全?)

[2. BeanFactory与ApplicationContext的区别?](#2. BeanFactory与ApplicationContext的区别?)

[3. 如何实现自定义Bean作用域?](#3. 如何实现自定义Bean作用域?)


一、JVM内存模型进阶篇

🔥 问题13:堆与栈的六大维度对比

内存结构对比图
核心差异对照表
对比维度 堆(Heap) 栈(Stack)
存储内容 对象实例、数组 局部变量、方法参数
线程共享 全局共享 线程私有
生命周期 由GC管理 方法执行结束自动释放
空间分配 动态分配 编译期确定大小
默认容量 数百MB~数GB 1MB(可调优)
访问速度 较慢(寻址开销) 极快(直接操作栈指针)
内存碎片 频繁GC产生碎片 几乎无碎片
异常类型 OutOfMemoryError StackOverflowError

🔥 问题14:三区联动内存模型解析

代码内存分配图解
java 复制代码
public class MemoryModelDemo {
    private String user;          // 堆中对象成员变量
    
    public void execute() {
        int count = 0;            // 栈帧中的局部变量
        String msg = "Hello";     // 栈存引用,堆存字符串对象
        Object obj = new Object(); // 栈存引用,堆存对象实例
    }
}
三区协作流程图

二、Spring设计模式全景解析

🌟 Spring框架七大设计模式

1. 工厂模式(Factory Pattern)

应用场景 :BeanFactory体系
实现原理

java 复制代码
public interface BeanFactory {
    Object getBean(String name);
}

public class DefaultListableBeanFactory implements BeanFactory {
    private Map<String, Object> beanCache = new ConcurrentHashMap<>();
    
    public Object getBean(String name) {
        return beanCache.get(name);
    }
}
2. 单例模式(Singleton Pattern)

实现方式

java 复制代码
@Component
@Scope("singleton") // 默认作用域
public class OrderService {
    // 单例实现
}
3. 代理模式(Proxy Pattern)

AOP实现

java 复制代码
public class JdkDynamicProxy implements InvocationHandler {
    private Object target;
    
    public Object createProxy(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(
            target.getClass().getClassLoader(),
            target.getClass().getInterfaces(),
            this);
    }
    
    public Object invoke(Object proxy, Method method, Object[] args) {
        // 前置增强
        Object result = method.invoke(target, args);
        // 后置增强
        return result;
    }
}
4. 模板方法模式(Template Method)

JdbcTemplate应用

java 复制代码
public class JdbcTemplate {
    public <T> T query(String sql, ResultSetExtractor<T> extractor) {
        // 1.获取连接
        // 2.创建Statement
        // 3.执行查询(模板方法)
        // 4.结果提取(抽象方法)
        // 5.释放资源
    }
}
复制代码
5. 观察者模式(Observer Pattern)

事件驱动模型

java 复制代码
// 定义事件
public class OrderEvent extends ApplicationEvent {
    public OrderEvent(Object source) {
        super(source);
    }
}

// 监听器实现
@Component
public class OrderListener implements ApplicationListener<OrderEvent> {
    public void onApplicationEvent(OrderEvent event) {
        // 处理订单事件
    }
}
6. 适配器模式(Adapter Pattern)

HandlerAdapter实现

java 复制代码
public interface HandlerAdapter {
    boolean supports(Object handler);
    ModelAndView handle(HttpServletRequest request, 
                       HttpServletResponse response, 
                       Object handler);
}

public class RequestMappingHandlerAdapter implements HandlerAdapter {
    // 适配不同处理器
}
7. 装饰器模式(Decorator Pattern)

HttpRequest增强

java 复制代码
public class ContentCachingRequestWrapper extends HttpServletRequestWrapper {
    private byte[] cachedContent;
    
    public ContentCachingRequestWrapper(HttpServletRequest request) {
        super(request);
    }
    
    // 增强getInputStream方法
    public ServletInputStream getInputStream() {
        // 缓存读取逻辑
    }
}

三、Spring核心容器模块深度剖析

Spring Context模块架构

核心功能解析
  1. Bean生命周期管理

    java 复制代码
    public class BeanLifecycleDemo implements 
        BeanNameAware, 
        BeanFactoryAware,
        ApplicationContextAware,
        InitializingBean,
        DisposableBean {
        
        // 实现各阶段回调方法
    }
  2. 国际化支持

    java 复制代码
    MessageSource messageSource = context.getBean(MessageSource.class);
    String msg = messageSource.getMessage(
        "welcome.message", 
        new Object[]{"用户"}, 
        Locale.CHINA);
  3. 事件传播机制

    java 复制代码
    context.publishEvent(new CustomEvent(this));
  4. 环境抽象

    java 复制代码
    Environment env = context.getEnvironment();
    String profile = env.getProperty("spring.profiles.active");

四、高频面试题强化训练

1. Spring中如何保证线程安全?

  • 方案一:使用原型(Prototype)作用域

  • 方案二:ThreadLocal变量隔离

  • 方案三:同步代码块控制

  • 最佳实践:无状态Bean设计

2. BeanFactory与ApplicationContext的区别?

维度 BeanFactory ApplicationContext
功能范围 基础IoC容器 企业级扩展容器
加载方式 延迟加载 预加载
国际化支持 不支持 支持
事件机制 完整事件发布体系
资源访问 基础ResourceLoader 增强资源模式

3. 如何实现自定义Bean作用域?

java 复制代码
public class ThreadScope implements Scope {
    private final ThreadLocal<Map<String, Object>> threadLocal = 
        ThreadLocal.withInitial(HashMap::new);
        
    public Object get(String name, ObjectFactory<?> objectFactory) {
        Map<String, Object> scope = threadLocal.get();
        return scope.computeIfAbsent(name, k -> objectFactory.getObject());
    }
    
    // 实现其他接口方法
}

// 注册作用域
context.getBeanFactory().registerScope("thread", new ThreadScope());

实战建议

  1. 在Spring Boot中通过@EnableAsync实现异步处理

  2. 使用@Conditional注解实现条件化Bean加载

  3. 通过自定义BeanPostProcessor实现扩展功能

💬 你在项目中应用过哪些Spring设计模式?遇到哪些印象深刻的问题?

🎁 关注+转发,后续持续更新《Spring面试和JVM深度解析》等博客内容

相关推荐
酒尘&1 小时前
JS数组不止Array!索引集合类全面解析
开发语言·前端·javascript·学习·js
冬夜戏雪1 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
CC.GG2 小时前
【C++】二叉搜索树
java·c++·redis
姚不倒2 小时前
负载均衡的概念、策略以及两个核心组件 Nginx 和 Kube-proxy 的对比。
运维·nginx·云原生·kubernetes
地瓜伯伯2 小时前
Nginx终极配置指南:负载均衡、限流、反向代理、IP白名单、SSL、云原生、DNS解析、缓存加速全都有
spring boot·nginx·spring·spring cloud·微服务·云原生·负载均衡
wubba lubba dub dub7502 小时前
第二十八周 学习周报
学习
思成不止于此2 小时前
MySQL 查询实战(三):排序与综合练习
数据库·笔记·学习·mysql
QiZhang | UESTC2 小时前
学习日记day42
学习
深海潜水员3 小时前
OpenGL 学习笔记 第一章:绘制一个窗口
c++·笔记·学习·图形渲染·opengl
用户47949283569153 小时前
"讲讲原型链" —— 面试官最爱问的 JavaScript 基础
前端·javascript·面试