Skip to content

Spring 面试题 ​

本文整理 Java 后端开发高频面试题的 Spring 部分。每道题统一格式:题目 → 答案 → 对比表 / 代码示例 / 一句话记忆。


1. @Component 和 @Bean 的区别是什么? ​

对比项@Component@Bean
作用对象类(标注在类上)方法(标注在 @Configuration 类的方法上)
注册方式通过组件扫描(@ComponentScan)自动注册通过方法返回值手动注册
灵活性只能注册自己编写的类可注册第三方库的类、需复杂构造的对象
自定义实例化过程由 Spring 控制可在方法中编写任意实例化逻辑
Bean 名称默认类名首字母小写默认方法名

@Component 示例(自己写的类):

java
@Component
public class UserService {
    // Spring 扫描后自动注册为 Bean
}

@Bean 示例(第三方类、需自定义构造):

java
@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplateBuilder()
                .setConnectTimeout(Duration.ofSeconds(3))
                .build();
    }

    @Bean
    public DataSource dataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.setJdbcUrl("jdbc:mysql://localhost:3306/db");
        ds.setUsername("root");
        return ds;
    }
}

💡 一句话记忆:@Component 标注自己的类(扫描注册),@Bean 标注方法(手动注册,适合第三方/复杂构造)。


2. @Autowired 和 @Resource 的区别是什么? ​

对比项@Autowired@Resource
来源Spring 提供的注解JDK 提供的注解(javax.annotation)
默认注入方式byType(按类型匹配)byName(按名称匹配)
多实现时指定配合 @Qualifier("name") 显式指定通过 name 属性指定
required 支持支持 required = false(找不到不报错)不支持
推荐场景Spring 项目优先兼容性要求、按名称注入
java
// @Autowired 按类型,多个实现时用 @Qualifier 指定
@Autowired
@Qualifier("mysqlUserRepository")
private UserRepository userRepository;

// @Resource 按名称
@Resource(name = "mysqlUserRepository")
private UserRepository userRepository;

// @Resource 不指定 name 时,先按名称再按类型
@Resource
private UserRepository userRepository;

💡 一句话记忆:@Autowired 按类型(Spring 注解),@Resource 按名称(JDK 注解)。