Java全栈面试宝典:线程机制与Spring依赖注入深度解析

目录

一、Java线程核心机制

🔥 问题3:start()与run()的底层执行差异

线程启动流程图解

核心差异对照表

代码验证示例

🔥 问题4:Thread与Runnable的六大维度对比

类关系UML图

最佳实践代码

🔥 问题5:线程参数传递三大方案

参数传递方案对比

Lambda传参最佳实践

二、Spring依赖注入全景解析

🌟 Spring依赖注入四大方式

DI实现方式对比表

构造器注入最佳实践

🌟 Spring自动装配原理图解

自动装配注解对比

三、高频面试题强化训练

1. Spring为什么推荐构造器注入?

2. @Autowired与@Resource的区别?

3. 如何解决多个同类型Bean的冲突?


一、Java线程核心机制

🔥 问题3:start()与run()的底层执行差异

线程启动流程图解

 
核心差异对照表
方法执行线程调用次数JVM操作典型应用场景
start()新创建的子线程单次触发native线程创建多线程任务启动
run()主调用线程多次普通Java方法调用单线程测试/调试
代码验证示例
public class StartVsRun {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("当前线程: " + Thread.currentThread().getName());
        });
        
        thread.start();  // 输出: Thread-0
        thread.run();    // 输出: main
    }
}

🔥 问题4:Thread与Runnable的六大维度对比

类关系UML图

维度ThreadRunnable
类型具体类接口
继承限制占用继承名额不占用
资源共享实例变量独立可共享同一实例
扩展性单继承限制支持多实现
线程池兼容性需包装为Runnable直接支持
设计模式具体实现策略模式
最佳实践代码
// 推荐实现方式
public class DownloadTask implements Runnable {
    private String url;
    
    public DownloadTask(String url) {
        this.url = url;
    }
    
    @Override
    public void run() {
        // 文件下载逻辑
    }
}

// 使用示例
ExecutorService pool = Executors.newFixedThreadPool(5);
pool.execute(new DownloadTask("https://example.com/file1"));
pool.execute(new DownloadTask("https://example.com/file2"));

🔥 问题5:线程参数传递三大方案

参数传递方案对比
方式实现示例优点缺点
构造器传参new MyThread(param).start()线程安全创建后参数不可变
成员变量传参thread.setConfig(config)灵活修改需处理线程可见性问题
回调函数传参executor.submit(() -> task(param))Lambda简洁要求参数final或等效
Lambda传参最佳实践
public class ThreadParamDemo {
    public static void main(String[] args) {
        String config = "server.properties";
        
        // Lambda传参(实质是闭包)
        new Thread(() -> loadConfig(config)).start();
        
        // 通过Future传参
        ExecutorService pool = Executors.newSingleThreadExecutor();
        Future<String> future = pool.submit(() -> processData(config));
    }
    
    private static void loadConfig(String path) {
        // 配置文件加载逻辑
    }
    
    private static String processData(String input) {
        // 数据处理逻辑
        return "processed_" + input;
    }
}

二、Spring依赖注入全景解析

🌟 Spring依赖注入四大方式

DI实现方式对比表
注入方式实现示例优点缺点
构造器注入new Service(dao)不可变/线程安全参数多时代码冗长
Setter注入service.setDao(dao)灵活可选依赖可能破坏不变性
字段注入@Autowired private Dao dao代码简洁测试困难/隐藏依赖
方法注入@Autowired public void init(Dao dao)精确控制时机使用频率较低
构造器注入最佳实践
@Service
public class OrderService {
    private final PaymentService paymentService;
    private final InventoryService inventoryService;
    
    @Autowired
    public OrderService(PaymentService paymentService, 
                       InventoryService inventoryService) {
        this.paymentService = paymentService;
        this.inventoryService = inventoryService;
    }
}

🌟 Spring自动装配原理图解

自动装配注解对比
注解装配方式适用场景冲突解决
@Autowired按类型优先多数单实现场景@Qualifier指定名称
@Resource按名称优先JNDI资源注入名称不存在时按类型
@Inject与@Autowired类似JSR-330标准实现需要额外依赖

三、高频面试题强化训练

1. Spring为什么推荐构造器注入?

  • 不可变性:确保依赖项在初始化后不变

  • 循环依赖检测:启动时立即发现依赖问题

  • 测试友好:便于通过构造器传递Mock对象

  • 线程安全:避免并发修改依赖项

2. @Autowired与@Resource的区别?

维度@Autowired@Resource
标准归属Spring专属JSR-250标准
默认装配策略按类型按名称
必需性控制required=false
参数指定方式@Qualifiername属性
应用范围字段/构造器/方法字段/setter方法

3. 如何解决多个同类型Bean的冲突?

// 方案一:使用@Primary标记主候选
@Bean
@Primary
public DataSource masterDataSource() {
    return new HikariDataSource();
}

// 方案二:使用@Qualifier指定名称
@Autowired
@Qualifier("backupDataSource")
private DataSource dataSource;

// 方案三:使用自定义限定注解
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier("report")
public @interface ReportDataSource {}

@Bean
@ReportDataSource
public DataSource reportDataSource() {
    return new DruidDataSource();
}

实战建议

  1. 在Spring Boot中通过@ConfigurationProperties实现类型安全配置注入

  2. 使用@Lazy注解延迟初始化资源密集型Bean

  3. 通过@Profile实现环境特定的Bean装配

💬 你在项目中更倾向于使用哪种依赖注入方式?遇到过哪些注入难题?
🎁 关注+转发,抽送《阿里Java开发手册》电子书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值