1. 程式人生 > 實用技巧 >基於註解注入物件

基於註解注入物件

自動裝配註解就是為了讓我們在IoC容器執行的過程中,自動的為某個屬性注入資料自動裝配註解就是為依賴注入存在的兩類自動裝配註解。按型別裝配和按名稱裝配按名稱注入。例ref="beanId"註解又提供了一種選擇:按型別裝配。不推薦使用推薦使用按名稱裝配@Named和@Inject要匹配使用@Resource是這幾個中最強大的註解
s07MVC是採用分層的方式一次的逐級進行呼叫也就是controller依賴於service,service依賴於daoservice依賴於dao程式碼上的體現,在service類中新增一個UserDao型別的屬性,然後用@Autowired按型別註解 初始化IoC容器發現setService中輸出語句未執行
    public void setUdao(UserDao udao) {
        System.out.println("setUdao:" + udao);
        this.udao = udao;
    }
裝配註解放在不同位置上如果裝配註解放在set方法上,則自動按型別/名稱對set方法引數進行注入如果放在屬性上,不再執行set方法。Spring IoC容器會自動通過反射技術將private修飾符自動改為public,直接進行賦值。如果基於註解完成依賴注入的話,通常是不用加set方法的,多數情況下,直接在屬性上裝配註解@Autowired基於型別裝配工作中不建議使用例:給dao加個IUserDao介面,讓UserDao去實現這個介面。與此同時,因為我們有了介面了,作為UserService中按照面向物件程式設計的理念屬性的型別就應該從具體的類變成介面了。比如原有的UserDao是基於mysql資料庫進行的開發,但是隨著公司技術轉型,可能要遷移資料。這時基於介面再建立一個實現類即可。
然後初始化IoC容器會丟擲NoUniqueBeanDefinitionException異常,不是唯一的bean定義。發現兩個bean,userDao和userOracleDao。出現這個錯誤是因為採用了按型別注入。解決辦法:1.去掉UserDao的@Repository註解2.對於已經出現重複的兩個類來說,通過引入額外的一個註解@Primary,如果在IoC容器中出現多個相同的物件的話預設去採用@Primary描述的類。究其根本就是在我們容器中,可能會出現多個相同型別的物件,為了儘量避免這個問題,通常在實際專案中採用按名稱進行注入,因為名稱在專案中都是唯一的。
private UserDao udao;
// 實現介面以後
private IUserDao udao;