Java全栈面试宝典:线程协作与Spring Bean管理深度解析

目录

一、Java线程协作核心机制

[🔥 问题9:notify与notifyAll的底层差异](#🔥 问题9:notify与notifyAll的底层差异)

对象监视器模型

核心差异对比表

代码验证示例

[🔥 问题10:yield()方法的三大使用原则](#🔥 问题10:yield()方法的三大使用原则)

方法特性解析

代码示例

[🔥 问题11:现代线程中断机制](#🔥 问题11:现代线程中断机制)

中断处理最佳实践

正确中断代码模板

[二、Spring Bean管理全景解析](#二、Spring Bean管理全景解析)

[🌟 Spring Bean核心概念](#🌟 Spring Bean核心概念)

Bean定义要素

[🌟 Spring配置方式对比](#🌟 Spring配置方式对比)

配置方式矩阵

XML注入方式示例

[🌟 Bean作用域详解](#🌟 Bean作用域详解)

作用域类型表

作用域配置示例

三、高频面试题强化训练

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

[2. 如何解决构造器注入循环依赖?](#2. 如何解决构造器注入循环依赖?)

[3. @Autowired与@Resource的区别?](#3. @Autowired与@Resource的区别?)


一、Java线程协作核心机制

🔥 问题9:notify与notifyAll的底层差异

对象监视器模型
核心差异对比表
方法 影响范围 锁竞争 适用场景
notify() 随机唤醒一个等待线程 单线程竞争 精确控制唤醒对象
notifyAll() 唤醒所有等待线程 多线程竞争 避免线程饥饿
代码验证示例
java 复制代码
public class NotifyDemo {
    private static final Object lock = new Object();
    
    public static void main(String[] args) {
        IntStream.range(0, 3).forEach(i -> new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("线程" + i + "进入等待");
                    lock.wait();
                    System.out.println("线程" + i + "被唤醒");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start());

        new Thread(() -> {
            synchronized (lock) {
                lock.notify();  // 仅唤醒一个线程
                // lock.notifyAll();  // 唤醒所有线程
            }
        }).start();
    }
}

🔥 问题10:yield()方法的三大使用原则

方法特性解析
  1. 提示性:仅建议调度器让出CPU,不保证立即切换

  2. 非阻塞性:不会释放已持有的锁资源

  3. 适用场景

    • 调试多线程竞争问题

    • 实现协作式多任务

    • 自定义并发控制结构

代码示例
java 复制代码
public class YieldDemo {
    public static void main(String[] args) {
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("线程A运行");
                Thread.yield();
            }
        }).start();

        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("线程B运行");
            }
        }).start();
    }
}

🔥 问题11:现代线程中断机制

中断处理最佳实践
正确中断代码模板
java 复制代码
public class ThreadInterruptDemo {
    public static void main(String[] args) throws InterruptedException {
        Thread worker = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    // 模拟工作
                    TimeUnit.MILLISECONDS.sleep(100);
                } catch (InterruptedException e) {
                    // 重置中断状态
                    Thread.currentThread().interrupt();
                    System.out.println("处理中断请求");
                }
            }
            System.out.println("线程优雅终止");
        });
        
        worker.start();
        TimeUnit.SECONDS.sleep(1);
        worker.interrupt();
    }
}

二、Spring Bean管理全景解析

🌟 Spring Bean核心概念

Bean定义要素
配置维度 说明 示例
类全限定名 Bean的实现类 com.example.UserService
作用域 Bean的生命周期范围 singleton/prototype
初始化方法 Bean创建后的回调方法 initMethod="initialize"
依赖关系 需要注入的其他Bean <property name="dao" ref="userDao"/>
延迟初始化 是否延迟创建Bean实例 lazy-init="true"

🌟 Spring配置方式对比

配置方式矩阵
方式 实现示例 优点 缺点
XML配置 <bean id="user" class="com.User"/> 集中管理 冗长
注解驱动 @Component 简洁快速 配置分散
Java Config @Bean注解方法 类型安全 需要编码
Groovy DSL beans { user(User) } 动态灵活 学习成本高
XML注入方式示例

xml

XML 复制代码
<!-- 构造器注入 -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
    <constructor-arg ref="config"/>
</bean>

<!-- Setter注入 -->
<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao"/>
</bean>

<!-- 工厂方法注入 -->
<bean id="calendar" class="java.util.Calendar" 
      factory-method="getInstance"/>

🌟 Bean作用域详解

作用域类型表
作用域 说明 适用场景
singleton 单例(默认) 无状态服务
prototype 每次获取新实例 有状态对象
request 每个HTTP请求独立实例 Web请求上下文
session 用户会话生命周期 用户会话数据
application ServletContext生命周期 全局共享资源
websocket WebSocket会话生命周期 实时通信场景
作用域配置示例
java 复制代码
@Configuration
public class AppConfig {
    @Bean
    @Scope("prototype")
    public PrototypeBean prototypeBean() {
        return new PrototypeBean();
    }
    
    @Bean
    @RequestScope
    public RequestBean requestBean() {
        return new RequestBean();
    }
}

三、高频面试题强化训练

1. BeanFactory与ApplicationContext的区别?

功能 BeanFactory ApplicationContext
Bean实例化时机 延迟初始化 预初始化
国际化支持 不支持 支持MessageSource
事件发布 不支持 支持ApplicationEvent
资源访问 基础ResourceLoader 增强资源模式匹配
AOP支持 需手动配置 自动代理生成

2. 如何解决构造器注入循环依赖?

3. @Autowired与@Resource的区别?

维度 @Autowired @Resource
来源 Spring框架 JSR-250标准
默认注入策略 按类型 按名称
必需性控制 required=false
适用目标 构造器/字段/方法 字段/setter方法
名称指定方式 @Qualifier name属性

实战建议

  1. 使用@Profile实现环境特定配置

  2. 通过BeanPostProcessor实现自定义初始化逻辑

  3. 结合@Conditional实现条件化Bean注册

💬 你在项目中如何处理复杂的Bean依赖关系?遇到过哪些有趣的配置问题?

🎁 关注+转发,抽送《Spring揭秘》电子书

相关推荐
nlog3n14 分钟前
Java策略模式详解
java·bash·策略模式
Qlittleboy1 小时前
windows如何安装wkhtmltoimage 给PHP使用根据HTML生成图片
开发语言·windows·php
水w2 小时前
【Android Studio】解决报错问题Algorithm HmacPBESHA256 not available
android·开发语言·android studio
冷琅辞2 小时前
Elixir语言的云计算
开发语言·后端·golang
无情白3 小时前
k8s运维面试总结(持续更新)
运维·面试·kubernetes
Mryan20053 小时前
解决GraalVM Native Maven Plugin错误:JAVA_HOME未指向GraalVM Distribution
java·开发语言·spring boot·maven
Naomi5213 小时前
自定义汇编语言(Custom Assembly Language) 和 Unix & Git
服务器·开发语言·git·unix
烂蜻蜓3 小时前
C 语言命令行参数:让程序交互更灵活
c语言·开发语言·交互
VX_CXsjNo13 小时前
免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制
java·spring boot·spring·游戏·eclipse·android studio·android-studio
zm-v-159304339863 小时前
解锁 DeepSeek 与 Matlab:攻克科研难题的技术利刃
开发语言·matlab·信息可视化