作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题
代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。码炫课堂的个人空间-码炫码哥个人主页-面试,源码等
回答
在 Spring 中,@Service
、@Component
、@Repository
都是用于用类表示为 Spring 容器中的 Bean。
从技术层面来讲,@Service
、@Repository
和 @Controller
都是 @Component
的衍生版本,他们主要在概念上面进行了优化,以体现特定的分层架构角色。
@Component
是 Spring 框架的基础注解,用于将类声明为 Bean 组件,使其受 Spring 容器管理。它可以用在任何层次的类上,并不限定它的应用层次。@Service
用于表示业务逻辑层(Service)的类,尽管在功能上它和@Component
没有本质的区别,但是它代表的是一个业务服务。在语义上,@Service
表示这个 Bean 的业务层服务。@Repository
用于表示持久层(DAO),主要用于数据库访问和操作。它除了标注类外一个 DAO 外,还有一个核心功能:当持久层操作发生异常时,Spring 会将原始的数据库访问异常转换为 Spring 统一的数据访问异常(如DataAccessException
),从而解耦了业务逻辑和底层数据库异常的耦合关系,这种转换是的 Spring 数据库访问层能够更好地兼容各种数据库厂商的异常体系。