spring注解.doc_第1頁
spring注解.doc_第2頁
spring注解.doc_第3頁
spring注解.doc_第4頁
spring注解.doc_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1. 使用Spring注解來注入屬性 1.1. 使用注解以前我們是怎樣注入屬性的 類的實現(xiàn): Java代碼 1. publicclassUserManagerImplimplementsUserManager 2. privateUserDaouserDao; 3. publicvoidsetUserDao(UserDaouserDao) 4. this.userDao=userDao; 5. 6. . 7. public class UserManagerImpl implements UserManager private UserDao userDao;public void setUserDao(UserDao userDao) this.userDao = userDao;.配置文件: Java代碼 1. 2. 3. 4. 5. 6. 1.2. 引入Autowired注解(不推薦使用,建議使用Resource) 類的實現(xiàn)(對成員變量進行標注) Java代碼 1. publicclassUserManagerImplimplementsUserManager 2. Autowired3. privateUserDaouserDao; 4. . 5. public class UserManagerImpl implements UserManager Autowiredprivate UserDao userDao;.或者(對方法進行標注) Java代碼 1. publicclassUserManagerImplimplementsUserManager 2. privateUserDaouserDao; 3. Autowired4. publicvoidsetUserDao(UserDaouserDao) 5. this.userDao=userDao; 6. 7. . 8. public class UserManagerImpl implements UserManager private UserDao userDao;Autowiredpublic void setUserDao(UserDao userDao) this.userDao = userDao;.配置文件 Java代碼 1. 2. 3. 4. Autowired可以對成員變量、方法和構造函數(shù)進行標注,來完成自動裝配的工作。以上兩種不同實現(xiàn)方式中,Autowired的標注位置不同,它們都會在Spring在初始化userManagerImpl這個bean時,自動裝配userDao這個屬性,區(qū)別是:第一種實現(xiàn)中,Spring會直接將UserDao類型的唯一一個bean賦值給userDao這個成員變量;第二種實現(xiàn)中,Spring會調用setUserDao方法來將UserDao類型的唯一一個bean裝配到userDao這個屬性。 1.3. 讓Autowired工作起來 要使Autowired能夠工作,還需要在配置文件中加入以下代碼 Java代碼 1. 1.4. Qualifier Autowired是根據(jù)類型進行自動裝配的。在上面的例子中,如果當Spring上下文中存在不止一個UserDao類型的bean時,就會拋出BeanCreationException異常;如果Spring上下文中不存在UserDao類型的bean,也會拋出BeanCreationException異常。我們可以使用Qualifier配合Autowired來解決這些問題。 1. 可能存在多個UserDao實例 Java代碼 1. Autowired2. publicvoidsetUserDao(Qualifier(userDao)UserDaouserDao) 3. this.userDao=userDao; 4. Autowiredpublic void setUserDao(Qualifier(userDao) UserDao userDao) this.userDao = userDao;這樣,Spring會找到id為userDao的bean進行裝配。 2. 可能不存在UserDao實例 Java代碼 1. Autowired(required=false) 2. publicvoidsetUserDao(UserDaouserDao) 3. this.userDao=userDao; 4. Autowired(required = false)public void setUserDao(UserDao userDao) this.userDao = userDao;1.5. Resource(JSR-250標準注解,推薦使用它來代替Spring專有的Autowired注解) Spring 不但支持自己定義的Autowired注解,還支持幾個由JSR-250規(guī)范定義的注解,它們分別是Resource、PostConstruct以及PreDestroy。 Resource的作用相當于Autowired,只不過Autowired按byType自動注入,而Resource默認按byName自動注入罷了。Resource有兩個屬性是比較重要的,分別是name和type,Spring將Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。 Resource裝配順序 1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常 2. 如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常 3. 如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常 4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配(見2);如果沒有匹配,則回退為一個原始類型(UserDao)進行匹配,如果匹配則自動裝配; 1.6. PostConstruct(JSR-250) 在方法上加上注解PostConstruct,這個方法就會在Bean初始化之后被Spring容器執(zhí)行(注:Bean初始化包括,實例化Bean,并裝配Bean的屬性(依賴注入)。 它的一個典型的應用場景是,當你需要往Bean里注入一個其父類中定義的屬性,而你又無法復寫父類的屬性或屬性的setter方法時,如: Java代碼 1. publicclassUserDaoImplextendsHibernateDaoSupportimplementsUserDao 2. privateSessionFactorymySessionFacotry; 3. Resource4. publicvoidsetMySessionFacotry(SessionFactorysessionFacotry) 5. this.mySessionFacotry=sessionFacotry; 6. 7. PostConstruct8. publicvoidinjectSessionFactory() 9. super.setSessionFactory(mySessionFacotry); 10. 11. . 12. public class UserDaoImpl extends HibernateDaoSupport implements UserDao private SessionFactory mySessionFacotry;Resourcepublic void setMySessionFacotry(SessionFactory sessionFacotry) this.mySessionFacotry = sessionFacotry;PostConstructpublic void injectSessionFactory() super.setSessionFactory(mySessionFacotry);.這里通過PostConstruct,為UserDaoImpl的父類里定義的一個sessionFactory私有屬性,注入了我們自己定義的sessionFactory(父類的setSessionFactory方法為final,不可復寫),之后我們就可以通過調用super.getSessionFactory()來訪問該屬性了。 1.7. PreDestroy(JSR-250) 在方法上加上注解PreDestroy,這個方法就會在Bean初始化之后被Spring容器執(zhí)行。由于我們當前還沒有需要用到它的場景,這里不不去演示。其用法同PostConstruct。 1.8. 使用簡化配置 Spring2.1添加了一個新的context的Schema命名空間,該命名空間對注釋驅動、屬性文件引入、加載期織入等功能提供了便捷的配置。我們知道注釋本身是不會做任何事情的,它僅提供元數(shù)據(jù)信息。要使元數(shù)據(jù)信息真正起作用,必須讓負責處理這些元數(shù)據(jù)的處理器工作起來。 AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor就是處理這些注釋元數(shù)據(jù)的處理器。但是直接在Spring配置文件中定義這些Bean顯得比較笨拙。Spring為我們提供了一種方便的注冊這些BeanPostProcessor的方式,這就是: Java代碼 1. 6. 7. 將隱式地向Spring容器注冊AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、 PersistenceAnnotationBeanPostProcessor以及RequiredAnnotationBeanPostProcessor這4個BeanPostProcessor。 2. 使用Spring注解完成Bean的定義 以上我們介紹了通過Autowired或Resource來實現(xiàn)在Bean中自動注入的功能,下面我們將介紹如何注解Bean,從而從XML配置文件中完全移除Bean定義的配置。 2.1. Component(不推薦使用)、Repository、Service、Controller 只需要在對應的類上加上一個Component注解,就將該類定義為一個Bean了: Java代碼 1. Component2. publicclassUserDaoImplextendsHibernateDaoSupportimplementsUserDao 3. . 4. Componentpublic class UserDaoImpl extends HibernateDaoSupport implements UserDao .使用Component注解定義的Bean,默認的名稱(id)是小寫開頭的非限定類名。如這里定義的Bean名稱就是userDaoImpl。你也可以指定Bean的名稱: Component(userDao) Component是所有受Spring管理組件的通用形式,Spring還提供了更加細化的注解形式:Repository、Service、Controller,它們分別對應存儲層Bean,業(yè)務層Bean,和展示層Bean。目前版本(2.5)中,這些注解與Component的語義是一樣的,完全通用,在Spring以后的版本中可能會給它們追加更多的語義。所以,我們推薦使用Repository、Service、Controller來替代Component。 2.2. 使用讓Bean定義注解工作起來 Java代碼 1. 6. 7. 這里,所有通過元素定義Bean的配置內容已經被移除,僅需要添加一行配置就解決所有問題了Spring XML配置文件得到了極致的簡化(當然配置元數(shù)據(jù)還是需要的,只不過以注釋形式存在罷了)。的base-package屬性指定了需要掃描的類包,類包及其遞歸子包中所有的類都會被處理。 還允許定義過濾器將基包下的某些類納入或排除。Spring支持以下4種類型的過濾方式: 過濾器類型 表達式范例 說明 注解 org.example.SomeAnnotation 將所有使用SomeAnnotation注解的類過濾出來 類名指定 org.example.SomeClass 過濾指定的類 正則表達式 com.kedacom.spring.annotation.web.* 通過正則表達式過濾一些類 AspectJ表達式 org.example.*Service+ 通過AspectJ表達式過濾一些類 以正則表達式為例,我列舉一個應用實例: Java代碼 1. 2. 3. 值得注意的是配置項不但啟用了對類包進行掃描以實施注釋驅動Bean定義的功能,同時還啟用了注釋驅動自動注入的功能(即還隱式地在內部注冊了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),因此

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論