Hibernate的做用:
1.能夠解決以面向對象的方式操做數據庫的問題
請求參數(String)→Strut2→Action(對象)→業務邏輯組件(面向對象)
2.因此任何一個ORM框架均可以代替Hibernate,JPA更加能夠;
Spring能作什麼?
A.解決各層組件之間的硬編碼耦合(類名的直接耦合)
可讓各組件之間以「面向接口」的方式編程,從而提供更好的可擴展性
B.能解決事務、權限檢查等這種具備通用性質、橫切性質的處理邏輯
C.Spring提供了對大部分操做的簡化功能
Spring再次簡化了開發者的工做量程序員
兩大功能:
- 提升程序的可擴展性、可維護性
- 能夠提升程序員的開發效率數據庫
==============解決各組件之間的硬編碼耦合(類名的直接耦合)==============
1.讓各組件之間面向接口編程;
2.程序員還須要本身寫一個工廠,組件經過工廠去主動獲取它所依賴的組件
Spring是什麼?
Spring是大工廠,全部的Java對象均可由它來產生,它是全部對象的工廠,超級工廠
Spring的安裝:
(1)導入Spring Jar包
(2)增長一個Spring配置文件
(3)獲取Spring容器(Spring工廠),再經過工廠去獲取工廠中的產品編程
Spring容器(超級工廠)
1. BeanFactory
AppicationContext
CassPathXmlApplicationContext FileSystemXmlApplicationContext
A組件,須要去調用B組件的方法
- 稱爲A組件依賴B組件數組
- 傳統模式下: A組件主動去建立B組件
- 工廠模式下: A組件調用B組件的工廠去獲取B組件
- Spring模式下: A組件只要爲B組件提供一個setter方法便可,而後在Spring配置文件中配置便可網絡
Spring的本質:
經過XML配置來驅動Java代碼
Spring用的熟,幾乎全部Java代碼都放在XML去配置
要求:眼中看到的XML配置,心中想的是執行的Java代碼session
ApplicationContext多BeanFactory的以下功能:
A.國際化支持
B.支持資源(來自磁盤、網絡、IO流、Web應用的文件或數據)訪問
C.加載多個配置文件
D.事件支持
每一個Bean除了可擁有id以外,還能夠擁有不少個別名(外號)框架
/**************************************************
Spring是一個超級大工廠
對Spring來講:一切都是Bean
即便構造器私有(用private修飾),Spring依然能夠建立Bean的實例
**************************************************/編碼
Bean的做用域:
singleton - 當ApplictionContext初始化時,容器會自動初始化全部singleton Bean
每次程序向Spring容器請求時,Spring容器老是返回最開始建立的singleton Bean
prototype- 每次程序向Spring容器請求時,Spring容器會臨時去建立prototype Bean
request - 要在Web應用纔有效。每一個用戶請求,Spring建立一個Bean實例
request - 要在Web應用纔有效。每一個用戶會話,Spring都只建立一個Bean實例
global session -在portlet context纔有效
/******************************************************************
W3C推薦:
XML文檔應該多用於子元素,少用屬性。
<user name="孫悟空" address="花果山"/>
與下面方式對比
<user>
<name>孫悟空</name>
<address>花果山</address>
<user>
能夠擴展
<user>
<name>
<first>悟空</first>
<last>孫</last>
</name>
<address>
<detail>花果山</detail>
<zip>5423423</zip>
</address>
<user>
W3C告訴咱們:應該多用子元素,儘可能少用屬性,子元素是擴展性更好
******************************************************************/prototype
不管是<property .../>(調用setter方法)仍是<constructor-arg.../>(有參數的構造器)
=================須要傳入各類類型的實參=================
1.基本類型及其包裝類、String、Date等標量類型。用value屬性或value子元素傳入值
2.自定義類。須要ref或嵌套Bean傳入值
3.List、Set、數組、Map等集合對象
==============嵌套Bean==============
嵌套Bean不是直接定義雜<beans.../>元素中,而是定義在<property.../>或<constructor-arg.../>裏
結論:嵌套Bean與外層的Bean的配置幾乎徹底同樣的。
只是嵌套Bean不須要id,Spring容器不能直接訪問。嵌套Bean是做爲setter方法、構造器的參數值;
==============注入集合屬性==============
list 元素負責建立List集合和數組
map元素負責建立Map集合
set元素負責建立Set集合
props元素負責建立Properties集合
================依賴檢查================
它不會產生實際的影響,它會對配置文件進行語法層次的檢查
強制要求必須爲setter方法配置合適的依賴注入
在有些時候,程序員可能因爲某些失誤,致使配置文件出錯,或漏了配置
========實例化Bean的3種方式========
1.調用構造器來建立Bean
2.調用工廠類的靜態工廠方法
3.調用實例工廠的實例工廠方法
不管是靜態工廠方法,仍是實例工廠方法,都須要增長一個factory-method屬性
實例工廠方法,還須要指定factory-bean屬性
/*******************************
今天的要點:
1.建立對象的3種方式
2.如何控制它調用有參數的構造器
3.如何控制執行的setter方法
4.如何爲setter方法/構造器傳入參數值
*******************************/
==========FactoryBean==========
它是一個接口,接口裏有3個方法:getObject()、getObjectType()、isSingleton();
若是一個Bean實現了該接口,並在容器中配置了該Bean,接下來程序獲取該Bean的時候,實際上返回的只是該Bean的getObject方法的返回值。
因爲getObject()方法由程序員本身實現,所以咱們想在這個方法裏作什麼就能夠作什麼。
==========BeanNameAware==========
若是MyBean實現了BeanNameAware接口
Spring建立該Bean以後,會當即、自動調用它的setBeanName方法
經過BeanNameAware接口,保證咱們在首先Bean類時,就能夠得到配置該Bean時指定id
==========Bean的生命週期==========
Bean有4個做用域:singleton prototype request session
對於singleton做用域的Bean,Spring會負責管理它的生命週期
singleton Bean與Spring容器的生存期限是相同的
Spring建立Bean實例以後,會當即調用它的對應的setter方法
1.Bean設值注入以後,添加本身的處理代碼
A.讓Bean實現InitializingBean
B.直接用init-method屬性來指定初始化方法
--這兩種機制,只要使用一種便可;
2.Bean銷燬以前
A.讓Bean實現DisposableBean
B.直接用destroy-method屬性來指定銷燬以前的方法
--這兩種機制,只要使用一種便可;
*******Bean生命週期行爲*******
建立實例 → 注入依賴關係 ↓ Bean初始化過程 | 調用afterPropertiesSet | ↓ | 調用init-method方法 ↓ 對外提供服務 ↓ Bean銷燬以前的行爲 | 調用destroy | ↓ | 調用destroy-method方法 → Bean實例被銷燬