1. 程式人生 > >######Spring第5天ssh整合(註解版)難理解知識點:【自定義 方法加註解的方式】給dao注入sessionFactory屬性+【搞清@Autowared和@Resource含義】

######Spring第5天ssh整合(註解版)難理解知識點:【自定義 方法加註解的方式】給dao注入sessionFactory屬性+【搞清@Autowared和@Resource含義】

===【方法加註解的方式】給dao注入sessionFactory屬性(繼承父類的屬性),第一次見!===具體怎麼用的,看原始碼。(後面有寫)

以前都是屬性+註解注入屬性。

[email protected]和@Resource到底是幹嘛的?

剛學IOC時可能能夠立馬說出,是

IOC註解方式:引入外部物件的,維護物件間依賴關係的。

===ps:IOC xml方式 是在<bean>的property屬性裡設定另一個bean作為屬性。bean間依賴。通過屬性注入。===直觀簡單易懂。

但是使用IOC註解方式,也只不過是:

把<bean>配置刪掉,換成類上的 @Component、@Repository、@Service、@Controller,

再在上一層類中(比如service注入dao物件 service是上一層物件)  宣告一個被注入類的物件屬性,並且加上@Autowared或@Resource註解即可。

IOC註解方式就是這麼簡單。

===但是 當時沒有深入思考,並多加練習。理解不深刻。導致現在很容易就忘了。

不像 IOC xml方式簡單明瞭,想忘都忘不了!就是屬性注入。

===小結①:

①【屬性注入就是IOC,IOC就是屬性注入】。

②不管直觀的xml方式,還是有點抽象的註解方式。

===【屬性注入本質】都是兩步:【①建立物件,②呼叫一個物件的set方法 注入 另一個物件】

===小結②:IOC註解方式:

①建立物件,

===就是:(對【應屬性注入的本質工作】第一步)

在我們需要在spring xml配置裡寫<bean>的類上 加上: @Component、@Repository、@Service、@Controller,

//===註解不帶任何屬性,bean名稱預設是類名首字母小寫。

===###==service、dao只需要是單例,spring預設建立物件也是單例。所以不用配置屬性。

===###==service在注入dao時,使用:@Autowared就行:通過型別自動匹配。不需要加任何註解屬性。

②呼叫一個物件的set方法 注入 另一個物件,

===就是:(對【應屬性注入的本質工作】第二步)

案例: service宣告一個dao類的物件(被注入物件)屬性,並且在屬性上加註解:加上@Autowared或@Resource註解即可。

@Autowared 最好用。

@Resource最好寫上註解屬性name="bean ID"。===不寫屬性,預設的匹配規則不清楚。一般不這樣用。

======前面可能看起來還很簡單。

service注入dao經典,爛熟,很簡單。

但是使用jdbc:dao注入 dataSource屬性(C3p0、dbcp等資料庫),jdbcTemplate屬性,熟練使用【IOC 註解方式 注入屬性】,也還好。。

後面遇到SSH整合時,

使用dao注入sessionFactory:  這就有點暈了。是很暈。

原因總結如下:

①spring配置檔案裡,有一個sessionFactory,但不是org.hibernate.SessionFactory。

<!-- sessionFactory :整合hibernate方式2:在spring中配置hibernate屬性 -->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
②重頭戲來了:dao注入sessionFactory:


第一眼我絕對看不懂。

後來對比jdbc 方式:繼承JdbcDaoSupport,總結了一下:

要注入sessionFactory(jdbc裡是DataSOurce),首先要知道:

①sessionFactory是spring給我們建立的。===jdbc的DataSource也是。

//===【HibernateDaoSupport的getHibernateTemplate()原始碼】:
//因為現在HibernateTemplate肯定是null,所以會呼叫HibernateDaoSupport的createHibernateTemplate();
//createHibernateTemplate(sessionFactory)原始碼:呼叫new HibernateTemplate(sessionFactory);
//HibernateTemplate構造方法會呼叫setSessionFactory(sessionFactory)。
//===總之HibernateTemplate的setSessionFactory(sessionFactory),引數是傳過來的 HibernateDaoSupport的sessionFactory屬性。

//===也就是dao的父類的sessionFactory屬性。

②getHibernateTemplate()建立hibernateTemplate物件時,內部將SessionFactory注入到了hibernateTemplate。

dao注入SessionFactory就是傳 給HibernateTemplate用的,用來建立hibernateTemplate。

雖然getHibernateTemplate()無引數,spring底層可能是用建構函式傳入SessionFactory屬性的方式 接收到當前專案的SessionFactory的。不用管。

===總之:######【dao要注入sessionFactory,就是在dao類裡 呼叫父類的setSessionFactory(SessionFactory sf)方法即可。(已測)】 

######因為:因為【只有父類HibernateDaoSupport(API)的setSessionFactory(sessionFactory)《才能成功注入》spring自動為我們建立的sessionFactory】。 

====最終還是因為 【sessionFactory物件是:spring自動為我們建立。】

自定義屬性,無法注入(匹配到)spring建立的sessionFactory。

所以我們不能自己在dao寫一個沒有呼叫父類setSessionFactory(sessionFactory)的  setSessionFactory(sessionFactory)方法。 

==######=下面是測試案例,隨意一個 加了@Autowired的方法,lalala(sessionFactory),

只要呼叫了super. setSessionFactory(sessionFactory)。

執行都ok


圖片二:


=====通過以上學習總結:

spring的IOC(就是屬性注入),並不是那麼簡單的。還要多留心。

====終極問題結論:【@Autowared和@Resource只是注入屬性】,只相當於set方法,【###不能建立物件】。

###spring再牛,也不能單憑一個屬性名就能建立物件。

相關推薦

######Spring5ssh整合(註解)理解知識點定義 方法註解方式dao注入sessionFactory屬性+搞清@Autowared@Resource含義

===【方法加註解的方式】給dao注入sessionFactory屬性(繼承父類的屬性),第一次見!===具體怎麼用的,看原始碼。(後面有寫) 以前都是屬性+註解注入屬性。 [email protected]和@Resource到底是幹嘛的? 剛學IOC時可能能

SpringSSH框架整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用

目錄 1.SSH整合方式一:無障礙整合 1.1SSH框架整合開發回顧 1.2SSH整合 1.2.1第一步:建立web專案,引入jar包 1.2.2第二步:引入配置檔案 1.2.3第三步:建立包結構 1.2.4第四步:建立相關類 1.2.5第五步:引入相關的頁面

SpringAOP之xml

Spring的第三天AOP之xml版 ssm框架  spring  AOP介紹 AOP(Aspect Oriented Programming),面向切面程式設計。它出來的目的並不是去取代oop

SpringSpring的AOP的註解開發、Spring的宣告式事務、JdbcTemplate

目錄 1.Spring的AOP基於AspectJ的註解開發 1.1Spring基於ApsectJ的註解的AOP開發 1.1.1建立專案,引入jar包 1.1.2引入配置檔案 1.1.3編寫目標類並配置 1.1.4編寫切面類並配置 1.1.5使用註解的AOP物件目標類進

SpringSpring的AOP的註解開發、Spring的聲明式事務、JdbcTemplate。

spec template ntc 整合 roman 清晰 定義 method 延伸 1.1 上次課內容回顧 l Spring的IOC的註解開發 n 註解的入門 u 引入aop的包 u 引入context約束 l <context:com

python函數5(day 24)

eat style python 通過 返回 for end 位置 sta 可叠代的:對象下有__iter__方法的都是可叠代的對象 叠代器:對象.__iter__()得到的結果就是叠代器 叠代器的特性: 叠代器.__next__() 取下一個值

5 collection

深淺拷貝 lambda 淺拷貝 遞歸 str 表達式 ron 表達 lam 深淺拷貝 *函數 封裝 內嵌函數 lambda表達式 遞歸第5天 collection

學習筆記(5)

學習筆記(由老師筆記自己整理)第五天學習 ARP MAC :物理地址,全球範圍內,唯一的指定一個物理設備; 確定通信設備/終端, 一定要 IP 地址與 MAC 地址結合; 即,必須形成IP地址與MAC地址的對應關系,如下: IP --

黑盒測試實踐(小組測試)5

總結 錄制 得到 努力 任務 設計 ## 文檔 人的 ###總體進展情況 #在各位成員的努力下,測試項目進入了收尾階段: -1.需求說明在莉莎同學的辛勤努力下圓滿完成。 -2.魯慧敏同學花大半天的時間,去設計完所有的用例。

思科高級路由與交換(CISCO 部分) 5

nat實現方式 路由交換技術 靜態轉換ip 動態轉換ip ping Day 05 1. 什麽是 NAT?有哪些實現方式? NAT(網絡地址轉換):通過將內部網絡的私有 IP 地址翻譯成全球唯一的公有 IP 地址,使內部網絡可 以連接到互聯網等外部網絡上。 NAT 的實現方式: 靜態轉換;I

Python5學習心得

加油 ros 困難 外國人 eps 細致 都是 上班 做事 第4天交了第一次的作業,感謝路飛學成李露老師的耐心修改,給了80分,心中倍感鼓舞。 李露老師對代碼規範提出了要求,後續要認真拜讀一下Guido van Rossum的代碼規範要求,外國人做事就是嚴謹細致,初學咱就不

5,python之路

循環 reverse() 元組 [] def .so int fault rem 已經過了兩三天了,東西一點沒來寫,今天慢慢的寫吧。 還是會按Alex Li的流程來學習,編寫 寫出自己的東西 常用的數據類型     簡單的有,str ,int ,       

javaWeb68——SSH練習

crm練習 課程內容 課程目標 1. 通過SSH框架完成基本功能的開發 使用者模組 功能一:使用者註冊功能 1. 可以先判斷登入名是否已經存在 2. 要給密碼使用MD5進行加密操作 功能二:使用者登入功能 1. 登入功能要注意

javaWeb66——SSH練習

crm練習 課程內容 課程目標 1. 通過SSH框架完成基本功能的開發 使用者模組 功能一:使用者註冊功能 1. 可以先判斷登入名是否已經存在 2. 要給密碼使用MD5進行加密操作 功能二:使用者登入功能 1. 登入功能要注意

javaWeb66——SSH練習

crm練習 課程內容 課程目標 1. 通過SSH框架完成基本功能的開發 使用者模組 功能一:使用者註冊功能 1. 可以先判斷登入名是否已經存在 2. 要給密碼使用MD5進行加密操作 功能二:使用者登入功能 1. 登入功能要注意

javaWeb64——SSH練習第二

crm練習 課程內容 課程目標 1. 通過SSH框架完成基本功能的開發 使用者模組 功能一:使用者註冊功能 1. 可以先判斷登入名是否已經存在 2. 要給密碼使用MD5進行加密操作 功能二:使用者登入功能 1. 登入功能要注意

javaWeb64——SSH練習第一

svn的使用 課程回顧:SSH三大框架整合 1. 回顧SSH開發需要的jar和配置檔案 * Struts2框架 * web.xml和struts.xml * Hibernate框架 * hibernate.cfg.xml * Customer.hbm.xml

撩課-Java每天10道面試題5

41.Iterator、ListIterator 和 Enumeration的區別? 迭代器是一種設計模式, 它是一個物件, 它可以遍歷並選擇序列中的物件, 而開發人員不需要了解 該序列的底層結構。 迭代器通常被稱為“輕量級”物件, 因為建立它的代價小。 Java中

Alpha衝刺5

Alpha第四天 1.團隊成員 鄭西坤 031602542 (隊長) 陳俊傑 031602504 陳順興 031602505 張勝男 031602540 廖鈺萍 031602323 雷光遊 031602319 蘇芳鋥 031602330 2.專案燃盡圖 3.專案

撩課-Python-每天5道面試題-5

oat pan eve 思路 radius file math res block 一. 給定一個圓心和半徑, 以及一個點坐標, 判定該點是否在圓內; 例如: 用戶輸入圓心: (1, 2) 半徑: 2.5 測試點為(2, 2)結果: 判定測試點是在圓內 思路: 結合勾股