@Repository、@Service、@Controller 和 @Component

來源:互聯網
上載者:User

標籤:http   使用   os   io   檔案   資料   ar   .net   

@Repository、@Service、@Controller 和 @Component 將類標識為Bean

Spring 自 2.0 版本開始,陸續引入了一些註解用於簡化 Spring 的開發。@Repository註解便屬於最先引入的一批,它用於將資料訪問層 (DAO 層 ) 的類標識為 Spring Bean。具體只需將該註解標註在 DAO類上即可。同時,為了讓 Spring 能夠掃描類路徑中的類並識別出 @Repository 註解,需要在 XML 設定檔中啟用Bean 的自動掃描功能,這可以通過<context:component-scan/>實現。如下所示:


 // 首先使用 @Repository 將 DAO 類聲明為 Bean 

 package bookstore.dao; 

 @Repository 

 public class UserDaoImpl implements UserDao{ …… } 


 // 其次,在 XML 設定檔中啟動 Spring 的自動掃描功能

 <beans … > 

    ……

 <context:component-scan base-package=”bookstore.dao” /> 

……

 </beans> 


如此,我們就不再需要在 XML 中顯式使用 <bean/> 進行Bean 的配置。Spring 在容器初始化時將自動掃描 base-package 指定的包及其子包下的所有 class檔案,所有標註了 @Repository 的類都將被註冊為 Spring Bean。


為什麼 @Repository 只能標註在 DAO 類上呢?這是因為該註解的作用不只是將類識別為Bean,同時它還能將所標註的類中拋出的資料訪問異常封裝為 Spring 的資料訪問異常類型。 Spring本身提供了一個豐富的並且是與具體的資料訪問技術無關的資料訪問異常結構,用於封裝不同的持久層架構拋出的異常,使得異常獨立於底層的架構。


Spring 2.5 在 @Repository的基礎上增加了功能類似的額外三個註解:@Component、@Service、@Constroller,它們分別用於軟體系統的不同層次:


@Component 是一個泛化的概念,僅僅表示一個組件 (Bean) ,可以作用在任何層次。

@Service 通常作用在業務層,但是目前該功能與 @Component 相同。

@Constroller 通常作用在控制層,但是目前該功能與 @Component 相同。

通過在類上使用 @Repository、@Component、@Service 和 @Constroller 註解,Spring會自動建立相應的 BeanDefinition 對象,並註冊到 ApplicationContext 中。這些類就成了 Spring受管組件。這三個註解除了作用於不同軟體層次的類,其使用方式與 @Repository 是完全相同的。


另外,除了上面的四個註解外,使用者可以建立自訂的註解,然後在註解上標註 @Component,那麼,該自訂註解便具有了與所@Component 相同的功能。不過這個功能並不常用。


當一個 Bean 被自動檢測到時,會根據那個掃描器的 BeanNameGenerator 策略產生它的 bean名稱。預設情況下,對於包含 name 屬性的 @Component、@Repository、 @Service 和@Controller,會把 name 取值作為 Bean 的名字。如果這個註解不包含 name值或是其他被自訂過濾器發現的組件,預設 Bean 名稱會是小寫開頭的非限定類名。如果你不想使用預設 bean命名策略,可以提供一個自訂的命名策略。首先實現 BeanNameGenerator介面,確認包含了一個預設的無參數構造方法。然後在配置掃描器時提供一個全限定類名,如下所示:


 <beans ...> 

 <context:component-scan 

    base-package="a.b" name-generator="a.SimpleNameGenerator"/> 

 </beans> 


與通過 XML 配置的 Spring Bean 一樣,通過上述註解標識的Bean,其預設範圍是"singleton",為了配合這四個註解,在標註 Bean 的同時能夠指定 Bean 的範圍,Spring2.5 引入了 @Scope 註解。使用該註解時只需提供範圍的名稱就行了,如下所示:


 @Scope("prototype") 

 @Repository 

 public class Demo { … } 


如果你想提供一個自訂的範圍解析策略而不使用基於註解的方法,只需實現 ScopeMetadataResolver介面,確認包含一個預設的沒有參數的構造方法。然後在配置掃描器時提供全限定類名:


 <context:component-scan base-package="a.b"

 scope-resolver="footmark.SimpleScopeResolver" />


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.