在了解Spring框架中@Repository
@Component
, @Service
@Controller
, @Repository
@Controller
和@Repository
批注之间的区别之前,了解@Component
批注在Spring中的作用很重要。 在Spring的初始发行期间,所有bean都用于在XML文件中声明。 对于大型项目,这很快成为一项艰巨的任务,Spring团队很快就意识到了问题。 在更高版本中,它们提供基于注释的依赖项注入和基于Java的配置。 从Spring 2.5开始,引入了基于注释的依赖注入 ,该注入自动将类扫描并注册为使用@Component
注释进行注释的Spring bean。 这意味着您不必使用<bean>
;来声明该bean。 标记并注入依赖项,它将由Spring自动完成。 使用<context:component-scan>
标记启用和禁用此功能。
既然您知道了@Component
批注的作用,接下来让我们看看@Service
@Controller
, @Repository
@Controller
和@Repository
批注的作用。 在某些情况下,它们不过是@Component
注释的特殊形式。 而不是在Spring MVC中的控制器类上使用@Component
,我们使用@Controller
, which is more readable and appropriate
。
通过使用该批注,我们可以做两件事,首先,我们声明该类是Spring bean,并且应该由Spring ApplicationContext创建和维护,而且还要指出它是MVC设置中的控制器。 特定于Web的工具和功能使用后一种属性。
例如,DispatcherServlet将在使用@Controlle
r注释但不使用@Component
注释的类上查找@RequestMapping
。
这意味着@Component
和@Controller
在bean创建和依赖注入方面是相同的,但后来是前者的一种特殊形式。 即使将@Controller
注释替换为@Controller
@Compoenent
,Spring也会自动检测并注册控制器类,但对于请求映射,它可能无法按预期工作。 您可以进一步看到,
@Service
和@Repository
批注也是如此,它们是服务和持久层中@Component
化。 应该使用@Service
而不是@Component
注释对服务层中的Spring Bean进行注释,而使用@Repositor
y注释对持久性层中的Spring Bean进行注释。
通过使用专门的注释,我们用一块石头打了两只鸟。 首先,它们被视为Spring bean,其次,您可以放置该层所需的特殊行为。
例如, @Repository's
不仅可以帮助基于注释的配置,还可以捕获特定于平台的异常,并将它们作为Spring统一的未经检查的异常之一重新抛出。
虽然如此,您还需要在应用程序上下文中将org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor声明为Spring bean。
这个bean后处理器将顾问程序添加到任何使用@Repository
注释的bean,以便捕获任何特定于平台的异常,然后将其重新抛出为Spring的未经检查的数据访问异常之一。 您还可以在Udemy上查看Spring Framework 5:Guru入门,了解更多详细信息。
这也是Spring Interview常见问题之一,并且从Spring认证的角度来看很受欢迎。 基于这些注释及其在Spring专业认证考试中的用法,您还会发现几个问题。
Spring中的组件扫描如何工作?
从Spring 2.0开始,Spring提供了<context:component-scan>
和注释驱动的依赖项注入,以自动检测并注册Spring bean,而不是在XML文件中指定它们。 但是,它仅扫描@Component
,通常不会查找@Controller
, @Service
@Controller
和@Repository
。 扫描它们是因为它们本身带有@Component
注释。
只需看看@Controller
, @Service
@Controller
和@Repository
批注定义即可:
@Component
public @interface Service {….}@Componentpublic @interface Repository {….}@Componentpublic @interface Controller {…}
因此,说@Controller
, @Service
@Controller
和@Repository
是@Component
批注的特殊类型是没有错的。 <context:component-scan>
拾取它们并将其以下类注册为bean,就像它们使用@Component
进行注释一样。
之所以扫描它们,是因为它们本身带有@Component
注释。 如果您定义自己的自定义注释并使用@Component
对其进行注释,那么还将使用<context:component-scan>
。
如果您想了解有关Spring中的依赖项注入,自动装配以及不同类型的配置(例如Spring中基于XML,基于注释和Java配置)的更多信息,建议您参加Pluralsight上的Spring基础知识课程 。 也可以免费试用。
摘要
这是@Service
@Component
, @Service
@Controller
, @Repository
@Controller
和@Repository
批注在Spring Framework中的作用的很好总结:
-
@Component
是任何Spring管理的组件或bean的通用@Component
型。 -
@Repository
是持久层的@Repository
型。 -
@Service
是服务层的@Service
型。 -
@Controller
是表示层(spring-MVC)的@Controller
型。
这是解释Spring Framework中所有这些注释的层次结构的漂亮图表:
这是所有有关的区别@Component
, @Controller
, @Service
和@Repository
在Spring框架 。 就像我说过的那样,当启用上下文扫描时,它们全部用于自动检测Spring Bean,并且在依赖项注入方面基本上提供了相同的功能。
它们唯一的区别在于用途,即在Spring MVC中使用@Controller
定义控制器,首先是Spring bean,然后是controller。 类似地, @Service
Service用于注释类,这些类在Service层中保存业务逻辑,而@Repository
在Data Access层中使用。
您可以在Pluralsight上的Bryna Hassen的Spring基础知识课程中了解有关组件扫描以及Spring框架如何自动检测bean的更多信息。 您也可以免费获得10天。
简而言之,您应该根据特定类所属的图层使用最合适的注释。
您可能喜欢的其他Spring Framework文章和面试问题
- Spring MVC中
@RestController
和@Controller
之间的@RestController
? - Spring MVC在内部如何工作?
- Spring MVC中DispatcherServlet的用途是什么?
- 如何在Java Web应用程序中启用Spring安全性?
- Spring MVC中的@RequestParam和@PathVariable之间的区别?
- Craig Walls的《春天在行动》
- Eugen Paraschiv的Spring Master Class REST
感谢您到目前为止阅读本文。 如果您喜欢这篇文章,请与您的朋友和同事分享。 如果您有任何问题或反馈,请留言。
翻译自: https://www.javacodegeeks.com/2017/11/difference-component-service-controller-repository-spring.html