我们可以在春季使用没有@repository批注的DAO吗

时间:2019-05-18 13:41:31

标签: spring

我对春季DAO有疑问。 如果不使用@repository注释,是否可以使用不带@repository注释的DAO?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

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

@Repository异常翻译有什么用?好吧,这取决于应用程序。如果您不必支持其他基础数据存储,或者使用像Hibernate这样的ORM,它已经提供了异常转换,那么@Repository不会增加太多。但是,如果没有别的,注释就是好的文档,用于标记组件在应用程序体系结构中作为存储库的作用。

答案 2 :(得分:0)

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

存储库注释是标记注释,Spring使用它来使其可用于组件扫描以及启用带有数据访问层的其他方面。从下面的源代码中,您可以看到@Component。

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

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