2017-02-19 37 views
0

Spring的@Component的特殊变体是不恰当的使用的吗?即如果我打电话给我的服务类@Repository而不是@Service或相反。 有没有对这种不恰当使用的保护措施,或者它只是建议他们根据上下文正确使用,而不需要Spring的任何强制执行?春天使用不当的刻板印象以及他们在幕后做了些什么

可能有人请让我知道每个刻板印象到底会发生?我阅读的javadoc,不完全明白专门设置的功能?每个春天刻板印象提供

回答

3

是的,你可以注释任何类与@Repository@Service,且二者的行为相同,但在这里来自文档有趣的观点:

因此,您可以用@Component来注解你的组件类,但如果用@Repository注解它们,@服务或@Controller来代替,你的类是更适合于通过工具进行处理或与方面相关联。例如,这些原型注释使成为切入点的理想目标。

因此,如果您选择@Component或@Service作为 您的服务层,@Service显然是更好的选择。同样, 如上所述,@ Repository已被支持作为您的持久层中的标记,用于 自动异常转换

在这里你可以看到两个重要的东西,在第一对和第二届一个为自动异常翻译

显然正在讨论理想的目标为切入点,一日1是可以理解的,如果你是知道的AOP,第二个是关于这些注释的一件美丽的事情。让我们看看会不会自动异常翻译平均文档:

通用数据访问异常。 Spring可以从你选择的O/R映射工具中封装异常,将它们从专有(可能被检查的)异常转换为公共运行时DataAccessException层次结构。这允许您仅在适当的层中处理大多数不可恢复的持久性异常,而不会产生烦人的样板捕获/抛出和异常声明。您仍然可以在需要的任何地方捕获和处理异常。请记住,JDBC异常(包括特定于数据库的方言)也会转换为相同的层次结构,这意味着您可以在一致的编程模型中使用JDBC执行一些操作。

所以基本上,他们是一样的,但他们有点不同,当你深挖。希望你明白了。例如,如果我们使用@Service注释标注所有类,则所有这些类都将在容器中注册,但事情会有所不同。看到,如果您使用@Repository批注注释了某个类,后处理器将自动查找所有异常转换器(PersistenceExceptionTranslator接口的实现)并建议所有标记有@Repository注释的bean,以便发现的转换器可以拦截并应用相应的转换抛出的异常。

所以,这又是一个关于某种异常处理的问题。现在,如果您使用@Service注释而不是@Repository注释对类进行注释,则不会发现所需的译员。

现在关于@服务注释。此注释不会带来比@Component更多的表格。他们是一样的,唯一不同的是@Service注释是专业化@Component,唯一的专业化它根据文档的

这个注解是增加了一个通用的刻板印象和个人的团队可能会缩小它们的语义并酌情使用。 因此,@Service只比@Component增加了更多的了解。

所以,在最后,我们才知道,都是有细微的差别,其中@Repository标注在DAO类的情况下,一些更多的好处几乎相同。

相关问题