繁体   English   中英

我们可以在春天使用没有@repository注释的DAO

[英]Can we use DAO without @repository annotations in spring

我对春天DAO有疑问。 这是否可以在没有@ repository注释的情况下使用DAO?如果假设我没有使用@repository将会发生什么?

@Repository注释导致类被组件扫描实例化为spring bean。 如果删除它并且不以其他方式创建此bean(xml配置,Java配置,工厂bean等),则无法将其注入其他bean并且无法将bean注入其中,因此您必须创建它并管理依赖项手动。

TL; DR: @Respository的值用于自动异常转换。

使用存储库(如数据库)时,不同的系统可能会抛出实际上意味着同一事物的不同异常。

例如,当存在唯一ID冲突时,Postgres可能抛出PSQLException,而MySQL可能抛出MySQLIntegrityConstraintViolationException。 如果您必须支持不同的数据库(可能包括NoSQL数据库),那么处理所有可能的特定于供应商的异常类型可能会很痛苦。

除了作为@Component@Repository注释还告诉Spring将所有这些低级异常映射/转换为统一的DataAccessException层次结构,这是一个运行时异常。 现在我们可以简单地编写DataAccessException代码,而不用担心特定于供应商的异常。

@Repository异常翻译有用吗? 那么,这取决于应用程序。 如果您不必支持不同的底层数据存储,或者使用像已经提供异常转换的Hibernate这样的ORM,那么@Repository不会增加太多。 但如果不出意外,注释可以作为良好的文档来标记组件在应用程序架构中作为存储库的角色。

如果您像任何其他bean一样标记/初始化DAO类(使用@ Component / @ Service等注释或通过@Bean实例化)它将起作用,但是您将丢失特定于Repository的Spring特性(一个这样的特性是Spring包装数据库特定的DataAccessException异常)。

存储库注释是一个标记注释,Spring使用它来使其可用于组件扫描以及启用额外的Aspects与数据访问层。 从下面的源代码中,您可以看到,目的@Component。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {

这是一篇非常好的文章https://stackoverflow.com/a/38549461/7321990

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM