我对春季DAO有疑问。 如果不使用@repository注释,是否可以使用不带@repository注释的DAO?
答案 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