




已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
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可以對成員變量、方法和構(gòu)造函數(shù)進行標注,來完成自動裝配的工作。以上兩種不同實現(xiàn)方式中,Autowired的標注位置不同,它們都會在Spring在初始化userManagerImpl這個bean時,自動裝配userDao這個屬性,區(qū)別是:第一種實現(xiàn)中,Spring會直接將UserDao類型的唯一一個bean賦值給userDao這個成員變量;第二種實現(xiàn)中,Spring會調(diào)用setUserDao方法來將UserDao類型的唯一一個bean裝配到userDao這個屬性。 1.3. 讓Autowired工作起來 要使Autowired能夠工作,還需要在配置文件中加入以下代碼 Java代碼 1. 1.4. Qualifier Autowired是根據(jù)類型進行自動裝配的。在上面的例子中,如果當(dāng)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的作用相當(dāng)于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的屬性(依賴注入)。 它的一個典型的應(yīng)用場景是,當(dāng)你需要往Bean里注入一個其父類中定義的屬性,而你又無法復(fù)寫父類的屬性或?qū)傩缘膕etter方法時,如: 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,不可復(fù)寫),之后我們就可以通過調(diào)用super.getSessionFactory()來訪問該屬性了。 1.7. PreDestroy(JSR-250) 在方法上加上注解PreDestroy,這個方法就會在Bean初始化之后被Spring容器執(zhí)行。由于我們當(dāng)前還沒有需要用到它的場景,這里不不去演示。其用法同PostConstruct。 1.8. 使用簡化配置 Spring2.1添加了一個新的context的Schema命名空間,該命名空間對注釋驅(qū)動、屬性文件引入、加載期織入等功能提供了便捷的配置。我們知道注釋本身是不會做任何事情的,它僅提供元數(shù)據(jù)信息。要使元數(shù)據(jù)信息真正起作用,必須讓負責(zé)處理這些元數(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 只需要在對應(yīng)的類上加上一個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,它們分別對應(yīng)存儲層Bean,業(yè)務(wù)層Bean,和展示層Bean。目前版本(2.5)中,這些注解與Component的語義是一樣的,完全通用,在Spring以后的版本中可能會給它們追加更多的語義。所以,我們推薦使用Repository、Service、Controller來替代Component。 2.2. 使用讓Bean定義注解工作起來 Java代碼 1. 6. 7. 這里,所有通過元素定義Bean的配置內(nèi)容已經(jīng)被移除,僅需要添加一行配置就解決所有問題了Spring XML配置文件得到了極致的簡化(當(dāng)然配置元數(shù)據(jù)還是需要的,只不過以注釋形式存在罷了)。的base-package屬性指定了需要掃描的類包,類包及其遞歸子包中所有的類都會被處理。 還允許定義過濾器將基包下的某些類納入或排除。Spring支持以下4種類型的過濾方式: 過濾器類型 表達式范例 說明 注解 org.example.SomeAnnotation 將所有使用SomeAnnotation注解的類過濾出來 類名指定 org.example.SomeClass 過濾指定的類 正則表達式 com.kedacom.spring.annotation.web.* 通過正則表達式過濾一些類 AspectJ表達式 org.example.*Service+ 通過AspectJ表達式過濾一些類 以正則表達式為例,我列舉一個應(yīng)用實例: Java代碼 1. 2. 3. 值得注意的是配置項不但啟用了對類包進行掃描以實施注釋驅(qū)動Bean定義的功能,同時還啟用了注釋驅(qū)動自動注入的功能(即還隱式地在內(nèi)部注冊了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),因此
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 系統(tǒng)集成工程師備考戰(zhàn)略試題及答案
- 招生英語測試題及答案解析
- 全文解析網(wǎng)絡(luò)規(guī)劃設(shè)計師的2025年考試試題及答案
- 網(wǎng)絡(luò)規(guī)劃設(shè)計師備考策略與試題及答案
- 全面提升初級社會工作者考試試題及答案
- 永州中考試題及答案政史
- 備考秘籍2025年系統(tǒng)分析師考試試題及答案
- 用戶行為分析在多媒體應(yīng)用設(shè)計中的應(yīng)用試題及答案
- 社會工作者的職業(yè)認同與價值觀中級社會工作者考試試題及答案
- office培訓(xùn)實操試題及答案
- 初中 初一 音樂 第二單元 影視金曲《長江之歌》 長江之歌 課件
- 裝修人員出入證
- 行車日常檢查表
- 元素周期表(空白版)
- 2021年江蘇海事職業(yè)技術(shù)學(xué)院教師招聘筆試題目及答案
- 國家開放大學(xué)《社會心理適應(yīng)》章節(jié)隨學(xué)隨練參考答案
- 內(nèi)審內(nèi)審員培訓(xùn)試題對內(nèi)審員的考試版
- 水泥庫筒倉滑模施工方案
- 華容道關(guān)卡(三張A3紙)
- 標準型號鏈條參數(shù)表-鏈節(jié)參數(shù)表
- TCCES 6003-2021 預(yù)制混凝土構(gòu)件用金屬預(yù)埋吊件
評論
0/150
提交評論