@Repository 明确标识 DAO 层组件,启用 Spring 异常翻译机制,将 SQLException 等转为 DataAccessException;语义清晰且支持工具识别,需配合组件扫描与异常翻译器(如 PersistenceExceptionTranslationPostProcessor)。

@Repository 是 Spring 框架提供的一个用于标识数据访问层(DAO 层)组件的注解,它的核心作用是将类标记为 Spring 管理的 Bean,并自动处理数据访问异常——把特定技术的异常(如 JDBC 的 SQLException、Hibernate 的 HibernateException)统一转换为 Spring 的 统一数据访问异常体系(如 DataAccessException 及其子类)。
为什么用 @Repository 而不是 @Component?
语义更明确:@Repository 表明这个类专用于数据库操作,便于团队理解职责,也方便工具识别(如 IDE、静态分析)。更重要的是,它启用了 Spring 的异常翻译机制——只要该类被 Spring 扫描到并注册为 Bean,且配置了对应的数据源和异常翻译器(如 SQLExceptionTranslator),底层抛出的原始异常就会被自动包装成 Spring 的运行时异常。
基本用法:标注 DAO 类
在自定义的 DAO 接口实现类上直接添加 @Repository:
@Repository
public class UserDaoImpl implements UserDao {
private final JdbcTemplate jdbcTemplate;
<pre class="brush:php;toolbar:false;">public UserDaoImpl(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public User findById(Long id) {
// 若执行 SQL 出错(如表不存在),SQLException 会被自动转为 DataAccessException
return jdbcTemplate.queryForObject(
"SELECT * FROM users WHERE id = ?",
new BeanPropertyRowMapper<>(User.class),
id
);
}}
立即学习“Java免费学习笔记(深入)”;
注意:确保该类所在的包已被 Spring 的组件扫描(如通过 @ComponentScan 或 Spring Boot 的默认扫描规则)。
配合异常处理更有效
@Repository 自身不捕获异常,但它让异常能被 Spring 的统一异常处理机制识别。你可以结合 @ControllerAdvice 全局处理 DataAccessException:
- 避免在每个 DAO 方法里写 try-catch 处理底层异常
- 业务层只需关注业务逻辑,不用关心是 MySQL 还是 PostgreSQL 抛的错
- 日志记录、告警或降级策略可集中定义
小提醒:别忘了开启异常翻译
Spring Boot 项目默认已启用;如果是传统 Spring XML 配置,需确保配置了异常翻译器,例如:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
这个后处理器会为所有标注 @Repository 的 Bean 创建代理,完成异常转换。


















