可以不恰当地使用Spring的@Component的特殊变体吗?即如果我调用我的服务类@Repository而不是@Service或反过来。 是否有任何防止这种不恰当使用的保护措施,或者只是建议根据上下文正确使用它们而不需要Spring的任何强制执行?
有人可以告诉我每个Stereotype究竟发生了什么吗?我读了javadocs并且没有完全理解Spring Stereotype提供的每个特殊功能集
答案 0 :(得分:3)
是的,您可以使用@Repository
或@Service
注释任何类,并且它们的行为都相同,但文档中的有趣点是:
因此,您可以使用@Component注释组件类,但是通过使用@ Repository,@ Service或@Controller注释它们,您的类更适合通过工具处理或与方面关联。例如,这些刻板印象注释使成为切入点的理想目标。
因此,如果您选择使用@Component或@Service 你的服务层,@ Service显然是更好的选择。同样的, 如上所述,已经支持@Repository作为标记 持久层中的自动异常翻译。
在这里你可以看到正在讨论的两个重要事项第一段和第二段中切入点的理想目标为自动例外翻译
显然,如果你知道 AOP ,第一个是可以理解的,第二个是关于这些注释的一个美好的事情。让我们看一下文档自动异常翻译的含义:
常见数据访问异常。 Spring可以从您选择的O / R映射工具中包装异常,将它们从专有(可能已检查)的异常转换为公共运行时DataAccessException层次结构。这允许您处理大多数不可恢复的持久性异常,仅在适当的层中处理,而不会产生令人讨厌的样板捕获/抛出和异常声明。您仍然可以在任何需要的地方捕获和处理异常。请记住,JDBC异常(包括特定于DB的方言)也会转换为相同的层次结构,这意味着您可以在一致的编程模型中使用JDBC执行某些操作。
所以基本上,它们是相同的,但是当你深挖时,它们会略有不同。希望你明白了。
例如,如果我们使用@Service
注释注释所有类,则所有这些类都将在容器中注册,但事情会有所不同。请注意,如果您使用@Repository
注释注释某个类,后处理器会自动查找所有异常转换器(PersistenceExceptionTranslator接口的实现)并建议所有标记有@Repository注释的bean,以便发现的转换器可以拦截并对抛出的异常应用适当的翻译。
所以,再一次,它是关于某种异常处理的。现在,如果您使用@Service
注释而非@Repository
注释对类进行注释,则不会发现所需的转换器。
现在关于 @Service 注释。此注释不会比 @Component 带来更多的表格。它们是相同的,唯一的区别是 @Service 注释是 @Component 的特化,它根据文档添加的唯一专业是
这个注释是一个通用的刻板印象,个别团队可能会缩小其语义并在适当时使用。 因此, @Service 只是增加了比 @Component 更多的理解。
所以,最后,我们发现所有内容几乎完全相同,但在 @Repository 注释中,在DAO类的情况下有更多好处。