簡體   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