春季@Component,@Repository和@Service注释之间有什么区别?
@Component
、@Repository
和@Service
注释是否可以在Spring中互换使用,或者除了用作符号设备之外,它们是否还提供任何特定功能?
换句话说,如果我有一个 Service 类,并且我将注释从 更改为 ,它是否仍会以相同的方式运行?@Service
@Component
或者注释是否也会影响类的行为和功能?
@Component
、@Repository
和@Service
注释是否可以在Spring中互换使用,或者除了用作符号设备之外,它们是否还提供任何特定功能?
换句话说,如果我有一个 Service 类,并且我将注释从 更改为 ,它是否仍会以相同的方式运行?@Service
@Component
或者注释是否也会影响类的行为和功能?
来自春季文档:
批注是满足存储库(也称为数据访问对象或 DAO)的角色或构造型的任何类的标记。此标记的用途之一是异常的自动翻译,如异常翻译中所述。
@Repository
Spring 提供了进一步的构造型注释:、 和 。 是任何 Spring 管理的组件的通用构造型。、和 是针对更具体用例(分别在持久性层、服务和表示层)的专用化。因此,您可以使用 对组件类进行批注,但是,通过使用 、 或 相反,您的类更适合于通过工具进行处理或与方面相关联。
@Component
@Service
@Controller
@Component
@Repository
@Service
@Controller
@Component
@Component
@Repository
@Service
@Controller
例如,这些构造型批注是切入点的理想目标。,,并且还可以在Spring框架的未来版本中携带其他语义。因此,如果您在使用服务图层或用于服务图层之间进行选择,显然是更好的选择。同样,如前所述,已经支持将其作为持久性层中自动异常转换的标记。
@Repository
@Service
@Controller
@Component
@Service
@Service
@Repository
注解 | 意义 |
---|---|
@Component |
任何 Spring 管理组件的通用构造型 |
@Repository |
持久性层的构造型 |
@Service |
服务层的构造型 |
@Controller |
表示层的构造型(弹簧-mvc) |
由于许多答案已经说明了这些注释的用途,因此我们将在这里重点介绍它们之间的一些细微差异。
首先是相似性
值得再次强调的第一点是,对于BeanDefinition的扫描自动检测和依赖注入,所有这些注释(即@Component,@Service,@Repository,@Controller)都是相同的。我们可以用一个来代替另一个,并且仍然可以四处走动。
@Component
这是一个通用的构造型批注,指示该类是弹簧组件。
@Component
的特别之处在于只扫描而不寻找,并且一般来说。它们被扫描,因为它们本身被注释为 。<context:component-scan>
@Component
@Controller
@Service
@Repository
@Component
只需看一下 和 注释定义:@Controller
@Service
@Repository
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
因此,说 ,并且是特殊类型的注释是没有错的。 选取它们并将其后续类注册为 bean,就像用 .@Controller
@Service
@Repository
@Component
<context:component-scan>
@Component
特殊类型注释也会被扫描,因为它们本身也带有注释,这意味着它们也是s。如果我们定义自己的自定义注释并用 注释它,它也将被扫描@Component
@Component
@Component
<context:component-scan>
@Repository
这是为了指示该类定义了一个数据存储库。
@Repository有什么特别之处?
除了指出,这是一个基于注释的配置,的工作是捕获特定于平台的异常,并将它们作为Spring的统一未检查异常之一重新抛出。为此,我们提供了 ,我们需要在 Spring 的应用程序上下文中添加,如下所示:@Repository
PersistenceExceptionTranslationPostProcessor
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
这个Bean后处理器为任何带有注释的Bean添加了一个顾问程序,以便捕获任何特定于平台的异常,然后将其作为Spring的未检查数据访问异常之一重新抛出。@Repository
@Controller
注释指示特定类充当控制器的角色。批注充当带批注的类的构造型,指示其角色。@Controller
@Controller
@Controller有什么特别之处?
我们不能将此注释与任何其他类似 或 切换,即使它们看起来相同。调度程序扫描带有注释的类,并检测其中带有注释的方法。我们只能在那些类被注释的方法中使用on/in,并且它不能与 ,等一起使用。@Service
@Repository
@Controller
@RequestMapping
@RequestMapping
@Controller
@Component
@Service
@Repository
注意:如果一个类已经通过任何替代方法注册为bean,例如通过@Bean
或通过@Component
,@Service
等...批注,然后,如果类也使用@RequestMapping
注释进行批注,则可以选取@RequestMapping
。但那是另一种情况。
@Service
@Service
Bean 在存储库层中保存业务逻辑和调用方法。
@Service有什么特别之处?
除了它用于指示它持有业务逻辑的事实之外,在此注释中没有其他明显内容;但谁知道呢,春天将来可能会增加一些额外的特殊情况。
还有什么?
与上述类似,将来 Spring 可能会为 添加特殊功能,并基于它们的分层约定。因此,尊重约定并将其与图层一起使用始终是一个好主意。@Service
@Controller
@Repository