Spring中@Component, @Repository, @Service和@Controller注解的区别
Spring 注解 是提供有关程序的数据的元数据的一种形式。注释用于提供关于程序的补充信息。它对注释代码的操作没有直接影响。它不会改变已编译程序的操作。在这里,我们将讨论Spring中4个最重要的注释@Component, @Repository, @Service和@Controller之间的区别。
@Component 注解
@Component是一个类级注释。它用来将一个类表示为一个组件。我们可以在整个应用程序中使用@Component将这些bean标记为Spring的托管组件。一个组件负责一些操作。Spring框架在将类标记为组件时提供了另外三个特定的注释。
- @Service
- @Repository
- @Controller
@Service 注解
在应用程序中,业务逻辑驻留在服务层中,因此我们使用 @Service 注解 表示一个类属于该层。这是一个专业 @Component注解 . @Service注解最重要的一点是,它只能应用于类。它用于将类标记为服务提供者。因此,总的来说@Service注释用于提供一些业务功能的类。当使用基于注释的配置和类路径扫描时,Spring上下文将自动检测这些类。
@Repository 注解
@Repository注释也是一种专门化 @Component 注解,用于表明类提供了对对象进行存储、检索、更新、删除和搜索操作的机制。虽然它是@Component注释的专门化,所以Spring Repository类是通过类路径扫描由Spring框架自动检测的。这个注释是一种通用原型注释,非常接近DAO模式,其中DAO类负责提供数据库表上的CRUD操作。
@Controller 注解
Spring @Controller注释也是一个专门化的 @Component 注解。@Controller注释表示一个特定的类充当 controller . Spring Controller注释通常与基于的注释处理程序方法结合使用 @RequestMapping注释。它只能应用于类。它用于将一个类标记为web请求处理程序。它主要用于Spring MVC应用程序。这个注释充当被注释类的原型,指出它的角色。dispatcher会扫描这些带注释的类,寻找映射的方法并进行检测 @RequestMapping 注解.
相似处
在开发人员面前出现的一个有趣的问题是,@Component、@Repository、@Service和@Controller注释是否可以在Spring中互换使用,或者它们是否提供了任何特定的功能?换句话说,如果我们有一个Service类,我们把注释从@Service改为@Component,它的行为还会保持不变吗?
因此,为了回答相同的问题,对于BeanDefinition的扫描自动检测和依赖注入,所有这些注释(@Component、@Repository、@Service和@Controller)都是相同的。我们可以用一个来代替另一个,仍然可以走我们的路。
现在我们已经清楚了@Component是一个通用原型注释,它表明这个类是spring组件,而@Repository、@Service和@Controller注释是@Component注释的特殊类型。现在让我们最后通过绘图来结束 所有注释类型之间的差异表 要更好地把握,认识到以下几点:
@Service 注解 | @Repository 注解 | @Controller 注解 |
---|---|---|
@Service注释用于提供某些业务功能的类。 | @Repository注释用于表示类提供了对对象进行存储、检索、更新、删除和搜索操作的机制。 | @Controller注释表示一个特定的类充当控制器的角色。 |
@Service注释是@Component注释的专门化。 | @Repository注释也是@Component注释的专门化。 | @Controller注释也是@Component注释的专门化。 |
它用于将类标记为服务提供者。 | 它用于将接口标记为DAO(数据访问对象)提供程序。 | 它用于将一个类标记为web请求处理程序。 |
它是服务层的原型。 | 它也是DAO层的原型。 | 它也是表示层(spring-MVC)的原型。 |
切换是可能的。但不建议这样做。 | 切换是可能的。但不建议这样做。 | 我们不能将这个注释与@Service或@Repository之类的任何其他注释进行切换。 |
它是一个原型注释。 | 它也是一个原型注释。 | 它也是一个原型注释。 |