spring詳解(一)

一、什麼是spring。
Spring是分層的JavaSE/EE full-stack 輕量級開源框架
以IoC(Inverse of Control 反轉控制)和AOP(Aspect Oriented Programming 面向切面編程爲內核)
官網:springsource.org/
Spring的出現是爲了取代EJB的臃腫、低效、脫離現實。
二、spring的優點。
1、方便解耦,簡化開發
Spring就是一個大工廠,可以將所有對象創建和依賴關係維護,交給Spring管理
2、AOP編程的支持
Spring提供面向切面編程,可以方便的實現對程序進行權限攔截、運行監控等功能
3、聲明式事務的支持
只需要通過配置就可以完成對事務的管理,而無需手動編程
4、方便程序的測試
Spring對Junit4支持,可以通過註解方便的測試Spring程序
5、方便集成各種優秀框架
Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
6、降低JavaEE API的使用難度
Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大降低
三、開發spring所需核心jar。
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
還需要下載commons-logging日誌包
commons-logging-1.1.1.jar ,log4j.jar
提示:spring3.0.X 版本 asm jar包 已經被合併到 spring core包中
四、spring IOC。
顧名思義,IoC Inverse of Control 反轉控制的概念,就是將原本在程序中手動創建service對象的控制權,交由Spring框架管理,簡單說,就是創建service對象控制權被反轉到了Spring框架
五、依賴注入。
DI:Dependency Injection 依賴注入,在Spring框架負責創建Bean對象時,動態的將依賴對象注入到Bean組件

六、spring 工廠模式理念。


七、反轉控制demo。
//通過srping容器來獲得helloService
ApplicationContext applicationContext = new ClassPathXMLAppliacationContext("applicationContext.xml");
HelloService helloService = applicationContext.getBean("helloService",HelloService.class);
在applicationContext.xml配置bean
<bean id="helloService" class="Service的類全名"></bean>
八、BeanFactory和ApplicationContext。
對BeanFactory採取延遲加載,第一次getBean時纔會初始化Bean。
ApplicationContext是對BeanFactory擴展,提供了更多功能
國際化處理
事件傳遞
Bean自動裝配
各種不同應用層的Context實現
九、MyEclipse 編寫Spring配置文件無提示解決。
方案一: 聯網下載 
springframework.org/schema/beans/spring-beans.xsd 
方案二: 採用本地schema配置
Myeclipse window-preferences- 搜索xml catalog
選中User Specified Entries -- Add 操作
location 瀏覽選中 解壓spring 包中 schema\beans\spring-beans-3.2.xsd
修改Key type 爲 Schema location

key 修改爲springframework.org/schema/beans/spring-beans.xsd 點擊OK

十、實例化bean的三種方式。

1.默認無參構造函數實例化。

2.使用靜態工廠實例化。

3.使用動態工廠實例化。

十一、bean的作用域。

1.singleton作用域。

在配置<bean>的時候有個scope屬性,可以在這裏設置bean的作用域,當設置爲singleton的時候,在IOC容器中只會創建bean定義的唯一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,並且所有針對該bean的後續請求和引用都將返回被緩存的對象實例,這裏要注意的是singleton作用域和GOF設計模式中的單例是完全不同的,單例設計模式表示一個ClassLoader中只有一個class存在,而這裏的singleton則表示一個容器對應一個bean,也就是說當一個bean被標識爲singleton時候,spring的IOC容器中只會存在一個該bean。

2.prototype作用域。

當使用prototype作爲作用域時,Bean會導致每次對該Bean的請求都創建一個Bean實例,所以對有狀態的Bean應該使用prorotype作用域,無狀態Bean則使用singleton作用域。還有就是Spring不能對一個prototype作用域 bean的整個生命週期負責,容器在初始化、配置、裝飾或者是裝配完一個prototype實例後,將它交給客戶端,隨後就對該prototype實例不聞不問了。不管何種作用域,容器都會調用所有對象的初始化生命週期回調方法,而對prototype而言,任何配置好的析構生命週期回調方法都將不會被調用。清除prototype作用域的對象並釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責。(讓Spring容器釋放被singleton作用域bean佔用資源的一種可行方式是,通過使用bean的後置處理器,該處理器持有要被清除的bean的引用。)
3.Web應用程序上下文的Bean
request、session、global session使用時,首先應該在web.xml中增加如下配置

如果你使用的是Servlet 2.4+的web容器,那麼你僅需要在web應用的XML聲明文件web.xml中增加下述ContextListener即可:

	<web-app>
		<listener>
			<listener-class>
				org.springframework.web.context.request.RequestContextListener
			</listener-class>
		</listener>
	</web-app>

3.1、request
request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效。

    <bean id="loginAction" class="org.han.action.LoginAction" scope="session"/>

3.2、session
表示僅在當前會話中有效
    <bean id="loginAction" class="org.han.action.LoginAction" scope="session"/>
3.3、global session
global session作用域類似於標準的HTTP Session作用域,不過它僅僅在基於portlet的web應用中才有意義。Portlet規範定義了全局Session的概念,它被所有構成某個portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定於全局portlet Session的生命週期範圍內。如果你在web中使用global session作用域來標識bean,那麼web會自動當成session類型來使用。
<bean id="loginAction" class="<span style="color: rgb(51, 51, 51); font-family: Arial; ">org.han.action.LoginAction</span><span style="color: rgb(51, 51, 51); font-family: Arial; ">" scope="globalSession"/></span>
4、自定義作用域
在spring2.0中作用域是可以任意擴展的,但是不能覆蓋singleton和prototype,spring的作用域由接口org.springframework.beans.factory.config.Scope來定義,自定義自己的作用域只要實現該接口即可
十二、spring中bean的生命週期。
一個Bean從創建到銷燬,如果是用BeanFactory來生成,管理Bean的話,會經歷幾個執行階段

1:Bean的建立:
容器尋找Bean的定義信息並將其實例化。
2:屬性注入:
使用依賴注入,Spring按照Bean定義信息配置Bean所有屬性
3:BeanNameAware的setBeanName():
如果Bean類有實現org.springframework.beans.BeanNameAware接口,工廠調用Bean的setBeanName()方法傳遞Bean的ID。
4:BeanFactoryAware的setBeanFactory():
如果Bean類有實現org.springframework.beans.factory.BeanFactoryAware接口,工廠調用setBeanFactory()方法傳入工廠自身。
5:BeanPostProcessors的ProcessBeforeInitialization()
如果有org.springframework.beans.factory.config.BeanPostProcessors和Bean關聯,那麼其postProcessBeforeInitialization()方法將被將被調用。
6:initializingBean的afterPropertiesSet():
如果Bean類已實現org.springframework.beans.factory.InitializingBean接口,則執行他的afterProPertiesSet()方法
7:Bean定義文件中定義init-method:
可以在Bean定義文件中使用"init-method"屬性設定方法名稱例如:
如果有以上設置的話,則執行到這個階段,就會執行initBean()方法
8:BeanPostProcessors的ProcessaAfterInitialization()
如果有任何的BeanPostProcessors實例與Bean實例關聯,則執行BeanPostProcessors實例的ProcessaAfterInitialization()方法
此時,Bean已經可以被應用系統使用,並且將保留在BeanFactory中知道它不在被使用。有兩種方法可以將其從BeanFactory中刪除掉:
1:DisposableBean的destroy()
在容器關閉時,如果Bean類有實現org.springframework.beans.factory.DisposableBean接口,則執行他的destroy()方法
2:Bean定義文件中定義destroy-method
在容器關閉時,可以在Bean定義文件中使用"destroy-method"屬性設定方法名稱,例如:
如果有以上設定的話,則進行至這個階段時,就會執行destroy()方法,如果是使用ApplicationContext來生成並管理Bean的話則稍有不同,使用ApplicationContext來生成及管理Bean實例的話,在執行BeanFactoryAware的setBeanFactory()階段後,若Bean類上有實現org.springframework.context.ApplicationContextAware接口,則執行其setApplicationContext()方法,接着才執行BeanPostProcessors的ProcessBeforeInitialization()及之後的流程。

發佈了28 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章