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 注解)。