一:spring的基本用法:
1.關于spring容器:
spring容器是Spring的核心,該 容器負責管理spring中的java組件
//這種方式實例化容器,容器會自動預初始化所有Bean實例
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
ctx.getBean("beanName");
ps:
<li>ApplicationContext 實例正是Spring容器。
<li>ApplicationContext容器默認會實例化所有的singleton Bean
<li>Spring容器并不強制要求被管理組件是標準的javabean。
2.IOC(控制反轉也叫做依賴注入)
不管是依賴注入(Dependency Injection)還是控制反轉(Inversion of Conctrol),其含義完全相同:
當某個java實例(調用者)需要調用另一個java實例(被調用者)時,傳統情況下,通過調用者來創建被調用者的實例,通常通過new來創建,而在依賴注入的模式下創建被調用者的工作不再由調用者來完成,因此稱之為"控制反轉";創建被調用者實例的工作通常由Spring來完成,然后注入調用者,所以也稱之為"依賴注入"。
依賴注入一般有2中方式:
<li>設置注入:IoC容器使用屬性的setter方式注入被依賴的實例。<property name="" ref="">
<li>構造注入:IoC容器使用構造器來注入被依賴的實例。<constructor-arg ref="">配置構造注入的時候<constructor-arg>可以配置index屬性,用于指定該構造參數值作為第幾個構造參數值。下表從0開始。
3.Spring容器和被管理的bean:
Spring有兩個核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。他們都可以代表Spring容器。
Spring容器是生成Bean實例的工廠,并管理Spring中的bean,bean是Spring中的基本單位,在基于Spring的java EE工程,所有的組件都被當成bean處理。
包括數據源、Hibernate的SessionFactory、事務管理器。
①Spring容器:
Spring最基本的接口是BeanFactory,BeanFactory有很多實現類,通常使用XmlBeanFactory,但是對于大部分的javaEE應用而言,推薦使用ApplictionContext,它是BeanFactory的子接口,
ApplictionContext的實現類為FileSystemXmlApplicationContext和ClassPathXmlApplicationContext。
FileSystemXmlApplicationContext:基于文件系統的XML配置文件創建ApplicationContext;
ClassPathXmlApplicationContext:基于類加載路徑下的xml配置文件創建ApplicationContext。
②ApplicationContext的事件機制
ApplicationContext事件機制是基于觀察者設計模式實現的。通過ApplicationEvent類和ApplicationListener接口,其中ApplicationEvent:容器事件,必須由ApplicationContext發布;
ApplicationListener:監聽器,可有容器內的任何監聽器Bean擔任。
在Spring中已經定義了五個標準事件,分別介紹如下:
|事件|描述|
|---|---|
|ContextRefreshedEvent
|當ApplicationContext初始化或者刷新時觸發該事件。
|
|ContextClosedEvent
|當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的所有單例Bean都被銷毀。
|
|RequestHandleEvent
|在Web應用中,當一個http請求(request)結束觸發該事件。
|
|ContestStartedEvent
|Spring2.5新增的事件,當容器調用ConfigurableApplicationContext的Start()方法開始/重新開始容器時觸發該事件。
|
|ContestStopedEvent
|Spring2.5新增的事件,當容器調用ConfigurableApplicationContext的Stop()方法停止容器時觸發該事件。
|
下面通過一個例子展示如何處理Spring內定的事件(例程3.8)。創建一個Java工程,添加Spring開發能力后,新建ioc.test包。在包中新建ApplicationEventListener類,實現ApplicationListener接口,在onApplicationEvent()方法中添加事件處理代碼,如下:
package ioc.test;
2
3 //Import省略
4 public class ApplicationEventListener implements ApplicationListener {
5
6 public void onApplicationEvent(ApplicationEvent event) {
7
8 //如果是容器刷新事件
9 if(event instanceof ContextClosedEvent ){
10 System.out.println(event.getClass().getSimpleName()+" 事件已發生!");
11 }else if(event instanceof ContextRefreshedEvent ){//如果是容器關閉事件
12 System.out.println(event.getClass().getSimpleName()+" 事件已發生!");
13 }else if(event instanceof ContextStartedEvent ){
14 System.out.println(event.getClass().getSimpleName()+" 事件已發生!");
15 }else if(event instanceof ContextStoppedEvent){
16 System.out.println(event.getClass().getSimpleName()+" 事件已發生!");
17 }else{
18 System.out.println("有其它事件發生:"+event.getClass().getName());
19 }
20
21 }
22
23 }
在Spring配置文件中定義一個Bean,類為ApplicationEventListener,代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans …………
<bean id="ApplicationEventListener" class="ioc.test.ApplicationEventListener" />
</beans>
添加含有主方法的TesMain類,在主方法中,調用容器的相應方法,觸發Spring內定事件,代碼如下:
package ioc.test;
//import省略
public class TesMain {
public static void main(String[] args) {
AbstractApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// ac.refresh();//觸發ContextRefreshedEvent事件
ac.start(); //觸發ContextStartedEvent事件
ac.stop(); //觸發ContextStoppedEvent事件
ac.close(); //關閉容器,觸發ContextClosedEvent事件
}
}