Spring注解之@Repository
Spring注解之@Repository
- Spring注解之@Repository
- 1、核心功能与特点
- (1)将类注册为Bean
- (2)异常转换
- (3)作为持久层标记
- 2、工作原理
- 3、示例
- 4、总结
Spring注解之@Repository
@Repository
是Spring框架下用于 数据访问层(DAO,Data Access Object)的专用注解,它标记的类负责与数据库、文件系统,外部API等进行交互,包括存储、查找、更新、删除等操作。
1、核心功能与特点
(1)将类注册为Bean
@Repository
内部包含一个 @Component
注解,因此会被Spring的组件扫描机制自动检测并注册为Bean
(2)异常转换
@Repository
自动将底层数据访问(如 JDBC、JPA、Hibernate)抛出的异常转换为Spring 的统一数据访问异常体系(DataAccessException 及其子类)。通过这种转换,开发者可以在上层Service层对异常进行统一处理,异常处理与具体数据访问技术解耦,简化处理逻辑。
(3)作为持久层标记
划分应用层次结构(Controller → Service → Repository),提高代码可读性和可维护性。
2、工作原理
被 @Repository
注解标记的类会被 @ComponentScan
检测并注册为Bean。通过 PersistenceExceptionTranslationPostProcessor
后处理器实现,代理所有 @Repository
注解的类,当该Bean的方法中抛出持久层相关的异常,代理会捕获并转换为 Spring 的异常体系,这样在上层可以简化对异常的处理逻辑,简化代码。
- 对于 JPA:自动处理 PersistenceException
- 对于 JDBC:转换 SQLException
- 对于 Hibernate:处理 HibernateException
3、示例
public interface UserRepository {User findById(Long id);List<User> findAll();User save(User user);void deleteById(Long id);
}
Repository层
@Repository("jdbcUserRepository")
public class JdbcUserRepository implements UserRepository {private final JdbcTemplate jdbcTemplate;@Autowiredpublic JdbcUserRepository(DataSource dataSource) {this.jdbcTemplate = new JdbcTemplate(dataSource);}@Overridepublic User findById(Long id) {// method body...}
}
Service层
@Service
public class UserService {@Autowired@Qualifier("jdbcUserRepository")private final UserRepository userRepository;public User getUserProfile(Long userId) {return userRepository.findById(userId);}public User registerUser(User newUser) {try {User user = userRepository.findById(userId);user.setEmail(newEmail);userRepository.save(user);} catch (DataAccessException ex) {// 统一处理所有数据访问异常log.error("数据库操作失败: {}", ex.getMessage());throw new ApplicationException("用户注册失败,请稍后再试", ex);}}
}
4、总结
注解 | 层级 | 用途 |
---|---|---|
@Controller | 控制层 | 处理 HTTP 请求和响应,后端调用Service层 |
@Service | 业务逻辑层 | 业务逻辑处理,事务管理 |
@Component | 通用 | 通用组件,不属于上述任何层 |
@Configuration | 通用 | 通用组件,不属于上述任何层 |
@Repository | 数据访问层 | 数据访问操作,数据库交互 |
@Repository
注解明确标记数据访问组件,屏蔽不同持久化技术的异常差异,使数据访问代码更加健壮、可维护。