<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    MicroFish

    Open & Open hits
    隨筆 - 33, 文章 - 2, 評論 - 4, 引用 - 0
    數據加載中……

    《Pro Spring》學習筆記(6)--基礎進階(1)

    ?

    ????? Spring不僅提供了基本的IOC功能,借助于BeanFactory以及其它組件,我們還可以使用其它一些更高級的功能。但是需要注意的是,使用這些高級功能,將不可避免的使得我們的工程依賴于Spring。這些高級功能大致包括:管理bean的生命周期,讓bean感知Spring(Spring aware),使用方法注入,使用FactoryBean,使用PropertyEditor以及了解Spring的ApplicationContext
    ??????有時候,我們需要在bean的生命周期中的某些階段做一些相應的操作(類似于Servlet和EJB),像其它IOC容器一樣,Spring也提供了管理bean生命周期的功能。兩個主要的階段是:
    post-initialization(bean初始化之后)和pre-destruction(bean銷毀之前).
    ????? post-initialization是指在Spring完成了bean的所有依賴注入以及相應的檢測之后,
    ????? pre-destruction是指在Spring銷毀bean之前。
    ????? post-initialization和pre-destruction只能應用于sigleton模式的bean,因為非sigleton的bean的生命周期并不由Spring控制(它們是由JVM控制的)。
    ????? Spring提供了兩種機制來實現bean生命周期的管理:基于接口的和基于指定方法的。
    ????? 使用基于接口的機制,我們需要實現Spring的相關接口,然后,Spring會使用回調機制在指定的階段調用接口中定義的方法,從而實現bean生命周期的管理。而使用基于指定方法的機制,我們需要在BeanFactory的配置中指定相應的方法名稱,Spring會使用Java的反射機制在指定的階段調用我們指定的方法,從而實現bean生命周期的管理。
    ????? 選擇哪種機制取決于我們的工程的需要。基于接口的機制要求我們實現Spring的接口,這會帶來對Spring的依賴,但是當我們定義了很多相同類型的bean時,使用基于接口的機制可以免去我們為每個bean定義指定相應方法的麻煩。基于指定方法的機制則可以讓我們避免對Spring的依賴,這在當我們使用第三方的類庫(因此,我們無法修改其代碼來實現Spring的接口)時是非常有用的。
    ????? 以post-initialization為例:
    ????? 使用基于接口的機制,我們需要實現Spring的InitializingBean接口的afterPropertiesSet方法
    ????? public class SimpleBeanWithInterface implements InitializingBean {
    ????????? ...
    ????????? public void afterPropertiesSet() throws Exception {
    ????????????? ...
    ??????? ? }
    ????????? ...
    ????? }
    ????? <beans>
    ???????? <bean id="simpleBean1"
    ???????? class="com.apress.prospring.ch5.lifecycle.SimpleBeanWithInterface">
    ???????????? ...
    ???????? </bean>
    ????? </beans>
    ????? 使用基于指定方法的機制,我們只需在BeanFactory的配置中指定相應的方法名稱
    ????? <beans>
    ????????? <bean id="simpleBean1"
    ????????? class="com.apress.prospring.ch5.lifecycle.SimpleBean"
    ????????? init-method="init">
    ????????????? ...
    ??????????</bean>
    ????? </beans>

    ????? SimpleBean中包含對應的init方法
    ????? public class SimpleBean {
    ????????? ...
    ????????? public void init() {
    ????????????? ...
    ????????? }
    ????????? ...
    ????? }

    ????? 需要注意的是,init方法必須不包含任何參數,盡管我們可以為init方法指定任意的返回值,但Spring會忽略它,因此最好的做法是在init方法中拋出異常來表明初始化失敗了。
    ????? 我們也可以同時使用這兩種機制,這時,Spring會先調用InitializingBean接口的afterPropertiesSet方法,再調用我們自己指定的init方法。
    ????? 相對的,pre-destruction使用DisposableBean接口的destroy方法和bean標簽的destroy-method屬性
    ????? 相對于依賴查找(Dependency Lookup),依賴注入(Dependency Injection)最大的賣點就是容器的無關性,但是有時候,我們確實需要和容器進行一些交互,例如訪問BeanFactory或者是獲得bean的名稱等。
    ??????為了獲得bean的名稱,我們需要實現Spring的BeanNameAware接口,BeanNameAware只有一個方法,void setBeanName(String name),只要我們的bean實現了BeanNameAware接口,Spring就會在bean配置結束,其它生命周期相關的回調函數(initialization或者 destroy)調用之前,回調該方法置入bean的名稱。
    ????? 類似的,為了訪問beanFactory,我們需要實現Spring的BeanFactoryAware接口的
    void setBeanFactory(BeanFactory factory)方法。

    posted @ 2006-12-21 10:23 劉璐 閱讀(357) | 評論 (0)編輯 收藏

    《Pro Spring》學習筆記(5)--配置BeanFactory(2)

    ?

    ??????BeanFactory中的每個bean都必須至少有一個唯一的名字,Spring為了靈活的支持各種情形,使用了相對復雜的命名體系。如果我們為bean指定了id屬性,那么id屬性的值將成為bean的名稱,如果沒有指定id屬性,Spring將使用name屬性的第一個值(多個值用逗號或者分號分隔)作為bean的名稱,如果name屬性也沒有指定,Spring將使用bean的類名(包括package的完整類名)來作為bean的名稱,對于多個bean使用相同類名的情況,Spring會在類名后面添加#2,#3等序號來加以區別。不管怎么說,使用id屬性來指定bean的名稱總是一個不錯的選擇。
    ???? 在Spring中,所有bean默認都是以單例(singleton)形態存在的,也就是說我們通過BeanFactory的getBean方法獲取的同一名稱的bean是完全相同的,即:beanFactory.getBean("name")==beanFactory.getBean("name")。更改bean的形態為非singleton(原型的,prototype)是很容易的,只需在bean標簽中,指定singleton屬性為false就可以了。
    <bean id="nonSingleton" class="java.lang.String" singleton="false">
    ??? ...
    </bean>
    ????? 為了簡化配置,Spring還提供了自動組裝(Auto-Wiring)bean的功能,有四種自動組裝方式:根據名稱(byName),根據類型(byType),構造子(Constructor)以及自動偵測(autodetect)。
    ????? 使用根據名稱自動組裝時,Spring根據bean的屬性的名稱去尋找同名的bean配置。
    ????? 使用根據類型自動組裝時,Spring根據bean的屬性的類型去尋找同類型的bean配置,如果有多個同類型的bean配置,那么Spring將會拋出異常,以表示無法確定使用哪個。
    ????? 使用構造子自動組裝和使用根據類型自動組裝比較類似,需要注意的是,使用構造子自動組裝時,Spring會匹配盡可能多的參數。例如,我們有一個bean擁有兩個構造函數,第一個接收一個String類型的參數,第二個接收一個String類型和一個Integer類型的參數,這時,如果在beanFactory的配置文件中有一個String類型的bean配置和一個Integer類型的bean配置,那么Spring將會使用第二個擁有兩個參數的構造函數。
    ?????? 使用自動偵測組裝時,Spring會在根據類型自動組裝和根據構造子自動組裝之間自動作出選擇,依據是:如果bean擁有默認的(無參數的)構造函數,那么Spring使用根據類型自動組裝的方式,否則,使用根據構造子自動組裝的方式。
    ?????? 有時候,我們可能會有多個bean擁有共同的類型,或是實現一些共同的接口,因此它們會有一些相同的配置,如果能將這些相同的配置提取出來,各個bean只要繼承這些相同的配置,然后添加自己特有的配置,將會大大減少重復的配置,降低發生錯誤的可能。Spring的bean繼承機制就是出于這樣的目的而提供的。在Spring中,我們可以將這些相同的配置提取出來,配置成一個parent bean,然后各個bean(child bean)可以繼承parent bean,在child bean中,可以覆寫parent bean中的配置,也可以添加自己的配置。parent bean是通過child bean的bean標簽的parent屬性來指定的。
    <bean id="inheritParent" class="com.apress.prospring.ch4.inheritance.SimpleBean">
    ??? <property name="name">
    ??????? <value>Rob Harrop</value>
    ??? </property>
    ??? <property name="age">
    ??????? <value>22</value>
    ??? </property>
    </bean>
    <bean id="inheritChild" class="com.apress.prospring.ch4.inheritance.SimpleBean"
    parent="inheritParent">
    ??? <property name="age">
    ??????? <value>35</value>
    ??? </property>
    </bean>
    ????? 需要注意的是,bean的繼承體系并不完全等同于java的類繼承體系,我們完全可以在數個擁有相同類型的bean上使用繼承,這不會帶來任何問題。因此,相對于java的繼承體系來說,Spring 的bean繼承體系更類似于模板類型。

    posted @ 2006-12-21 10:22 劉璐 閱讀(460) | 評論 (0)編輯 收藏

    《Pro Spring》學習筆記(4)--配置BeanFactory(1)

    ?

    ??????Spring使用spring-beans.dtd文件來定義BeanFactory的XML配置規范。可以在http://www.springframework.org/dtd/spring-beans.dtd找到該dtd文件,當然,Spring的下載文件中也已經包含了該dtd文件。它被放在dist文件夾中。
    ????? 配置文件的根元素是beans,每個組件使用bean元素來定義,bean元素可以有許多屬性,其中有兩個是必須的:idclass(這里說的id是必須的并不意味著在配置文件中必須指定id,后面會詳細說明)。id表示組件的默認名稱,class表示組件的類型。
    ????? 如果使用設值注入,則需要使用property子標簽,來指定組件的屬性。
    <bean id="renderer" class="com.apress.prospring.ch2.StandardOutMessageRenderer">
    ??? <property name="messageProvider">
    ??????? <ref local="provider"/>
    ??? </property>
    </bean>
    ????? 使用構造子注入時,則使用constructor-arg子標簽,來指定構造函數的參數。
    <bean id="provider" class="com.apress.prospring.ch4.ConfigurableMessageProvider">
    ??? <constructor-arg>
    ??????? <value>This is a configurable message</value>
    ??? </constructor-arg>
    </bean>
    ????? 當構造函數有多個參數時,可以使用constructor-arg標簽的index屬性,index屬性的值從0開始。
    <bean id="provider" class="com.apress.prospring.ch4.ConfigurableMessageProvider">
    ??? <constructor-arg index="0">
    ??????? <value>first parameter</value>
    ??? </constructor-arg>
    ??? <constructor-arg index="1">
    ??????? <value>second parameter</value>
    ??? </constructor-arg>

    </bean>
    ???? 在使用構造子注入時,需要注意的問題是要避免構造子沖突的情況發生。考慮下面的情況:
    public class ConstructorConfusion {
    ??? public ConstructorConfusion(String someValue) {
    ??????? System.out.println("ConstructorConfusion(String) called");
    ??? }
    ??? public ConstructorConfusion(int someValue) {
    ??????? System.out.println("ConstructorConfusion(int) called");
    ??? }
    }
    ???? 使用如下配置文件
    <bean id="constructorConfusion" class="com.apress.prospring.ch4.ConstructorConfusion">
    ??? <constructor-arg>
    ??????? <value>90</value>
    ??? </constructor-arg>
    </bean>
    ???? 那么,當實例化組件constructorConfusion時,將輸出ConstructorConfusion(String) called,也就是說參數類型為String的構造函數被調用了,這顯然不符合我們的要求。為了讓Spring調用參數為int的構造函數來實例化組件constructorConfusion,我們需要在配置文件中明確的告訴Spring,需要使用哪個構造函數,這需要使用constructor-argtype屬性。
    <bean id="constructorConfusion" class="com.apress.prospring.ch4.ConstructorConfusion">
    ??? <constructor-arg type="int">
    ??????? <value>90</value>
    ??? </constructor-arg>
    </bean>
    ???? 我們不僅可以構造單個BeanFactory,而且可以建立有繼承關系的多個BeanFactory。只需要將父BeanFactory作為參數傳給子BeanFactory的構造函數即可。
    BeanFactory parent =
    ??? new XmlBeanFactory(new FileSystemResource("./ch4/src/conf/parent.xml"));
    BeanFactory child =
    ??? new XmlBeanFactory(new FileSystemResource("./ch4/src/conf/beans.xml"), parent);
    ???? 如果子BeanFactory和父BeanFactory中含有名稱相同的Bean,那么在子BeanFactory中使用
    <ref bean="sameNameBean"/>引用的將是子BeanFactory中的bean,為了引用父BeanFactory中的bean,我們需要使用ref標簽的parent屬性,<ref parent="sameNameBean"/>
    ???? 為了注入集合屬性,Spring提供了list,map,setprops標簽,分別對應List,Map,Set和Properties,我們甚至可以嵌套的使用它們(List of Maps of Sets of Lists)。
    <bean id="injectCollection" class="com.apress.prospring.ch4.CollectionInjection">
    ??? <property name="map">
    ??????? <map>
    ??????????? <entry key="someValue">
    ??????????????? <value>Hello World!</value>
    ??????????? </entry>
    ??????????? <entry key="someBean">
    ??????????????? <ref local="oracle"/>
    ????????????</entry>
    ??????? </map>
    ??? </property>
    ??? <property name="props">
    ??????? <props>
    ??????????? <prop key="firstName">
    ??????????????? Rob
    ??????????? </prop>
    ??????????? <prop key="secondName">
    ??????????????? Harrop
    ??????????? </prop>
    ??????? </props>
    ??? </property>
    ??? <property name="set">
    ??????? <set>
    ??????????? <value>Hello World!</value>
    ??????????? <ref local="oracle"/>
    ??????? </set>
    ??? </property>
    ??? <property name="list">
    ??????? <list>
    ??????????? <value>Hello World!</value>
    ??????????? <ref local="oracle"/>
    ????????</list>
    ??? </property>
    </bean>

    posted @ 2006-12-21 10:22 劉璐 閱讀(590) | 評論 (0)編輯 收藏

    《Pro Spring》學習筆記(3)--Spring中的IOC

    ?

    ??????控制反轉包括兩種類型:依賴查找(Dependency Lookup)和依賴注入(Dependency Injection),我們主要討論的是依賴注入。
    ????? 依賴注入可以分為兩種類型:構造子注入(Constructor Dependency Injection)和設值注入(Setter Dependency Injection)
    ????? 構造子注入,組件的依賴關系是通過構造函數來提供的,每個依賴關系對應構造函數的各個參數,IOC容器在實例化組件時,通過構造函數注入依賴關系。
    public class ConstructorInjection {
    ??? private Dependency dep;
    ??? public ConstructorInjection(Dependency dep) {
    ??????? this.dep = dep;
    ??? }
    }
    構造子注入適用于在使用某個組件之前,確保所有的依賴關系都已注入。
    ????? 設值注入,組件的依賴關系是通過JavaBean形式的setter方法注入的,IOC容器通過調用相應的set方法注入依賴關系。
    public class SetterInjection {
    ??? private Dependency dep;
    ??? public void setMyDependency(Dependency dep) {
    ??????? this.dep = dep;
    ??? }
    }
    設值注入適用于需要給某些依賴關系提供默認值的情況。
    ????? Spring IOC容器的核心是BeanFactory,BeanFactory負責管理組件以及組件間的依賴關系。術語bean在Spring中代表由容器管理的任何組件。Spring提供了兩種常用的BeanFactory實現:DefaultListableBeanFactory和XmlBeanFactory。
    ????? 在BeanFactory中,每個bean都至少有一個名稱,作為唯一標識,如果bean擁有多個名稱的話,那么除第一個名稱外的其它名稱都將被認為是別名。
    ????? DefaultListableBeanFactory可以使用PropertiesBeanDefinitionReader或者XmlBeanDefinitionReader(當然還可以是其它任何實現了BeanDefinitionReader接口的Bean定義讀取器)來讀取配置文件。
    //使用PropertiesBeanDefinitionReader
    private static BeanFactory getBeanFactory() throws Exception {
    ??? // get the bean factory
    ??? DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    ??? // create a definition reader
    ??? PropertiesBeanDefinitionReader rdr = new PropertiesBeanDefinitionReader(factory);
    ??? // load the configuration options
    ???
    Properties props = new Properties();
    ??? props.load(new FileInputStream("./ch2/src/conf/beans.properties"));
    ??? rdr.registerBeanDefinitions(props);
    ??? return factory;
    }
    //使用XmlBeanDefinitionReader
    private static BeanFactory getBeanFactory() throws Exception {
    ??? // get the bean factory
    ??? DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    ??? // create a definition reader
    ??? XmlBeanDefinitionReader rdr = new XmlBeanDefinitionReader(factory);
    ??? // load the configuration options
    ??? rdr.loadBeanDefinitions(new FileSystemResource("ch4/src/conf/beans.xml"));
    ????return factory;
    }
    ????? XmlBeanFactory繼承了DefaultListableBeanFactory,在使用XML配置文件時可以簡化代碼的編寫,這也是我們最常用的BeanFactory。
    private static BeanFactory getBeanFactory() throws Exception {
    ??? XmlBeanFactory factory =
    ??????? new XmlBeanFactory(new FileSystemResource("ch4/src/conf/beans.xml"));
    ????return factory;
    }
    ????? 獲得了BeanFactory對象后,我們就可以使用bean的名稱來獲取我們需要的組件對象了。
    Oracle oracle = (Oracle)factoyr.get("oracle");

    posted @ 2006-12-21 10:20 劉璐 閱讀(316) | 評論 (0)編輯 收藏

    《Pro Spring》學習筆記(2)--何為Spring

    ?

    ??????Spring通常被稱為是構造Java工程的輕量級框架。這其中包含了兩方面的內容:首先,你可以使用Spring構造各種Java工程,而不是像Apache的Struts那樣,僅僅局限于Web工程。其次,所謂輕量級框架,并不是指類的數量或是工程的規模是輕量級的,用Spring的話說,輕量級就意味著更少的影響,你可以很容易的修改你的程序來獲得Spring提供的各種好處,也可以很容易的從你的工程中去除Spring。當然,需要注意的是,這僅僅是指Spring的核心組件。Spring還提供了很多其它的組件,像數據訪問等,使用這些組件,將使得你的工程與Spring框架形成耦合,但是,相比于你獲得的好處而言,這些耦合根本算不得什么。
    ????? Spring框架的核心是基于控制反轉(Invdersion Of Control, IOC)理論的,控制反轉使得我們可以在外部來創建和管理組件之間的依賴關系。例如:類Foo依賴于一個Bar類型的實例來執行某些操作,傳統的方式是,Foo使用new關鍵字或者從某個工廠類來創建一個Bar類的實例。然而,使用控制反轉,一個Bar類型的實例將在運行時由外部程序提供。這種方式可以很形象的看作是在運行時,將依賴的組件實例注入到當前組件中。因此,在某些時候,控制反轉也被稱為依賴注入(Dependency Injection, DI)。在Spring中,你可以認為控制反轉就等同于依賴注入。
    ????? 依賴注入給我們帶來的好處包括:
    ????? 1.減少了組件關聯的代碼:你不再需要在組件內部自己創建需要使用的其它組件,它們會在運行時自動被注入進來,特別是當某些組件需要通過JNDI來獲得,或是根本無法直接獲得,例如遠程資源時,DI帶來的好處就更加明顯了。
    ????? 2.將依賴關系移到代碼外:這會帶來兩點好處,首先,你可以在外部方便的管理組件間的依賴關系,而不需要重新編譯代碼。其次,你可以方便的切換某些依賴的實現類,例如將PostgreSQL的DAO實現切換為Oracle的DAO實現。
    ????? 3.統一的依賴管理:傳統的散布在工程各處的管理依賴關系的代碼將不復存在,所有的依賴信息都集中在一個統一的地方,這使得維護變得容易,同時降低了發生錯誤的可能。
    ????? 4.提高了可測試性:你可以很容易的替換依賴類的實現方式,如使用mock實現來代替真正的實現方式。假設我們需要測試業務對象(Business Object, BO),我們就可以使用mock實現來代替真正的DAO實現,從而避免真正地訪問數據庫,這大大提高了測試的效率。
    ????? 5.遵循良好的設計方式:使用DI通常意味著遵循面向接口的設計方式。毫無疑問,面向接口是一種良好的設計方式。
    ????? Spring框架還包括了以下這些方面的內容:
    ????? 1.面向方面的編程(Aspect Oriented Programming, AOP)
    ????? 2.數據訪問(Accessing Data in Spring)
    ????? 3.事務管理(Managing Transactions)
    ????? 4.簡化J2EE的整合(Simplifying and Integrating with J2EE)
    ????? 5.Web層的MVC框架(MVC in the?Web Tier)
    ????? 6.對遠程訪問的支持(Remoting Support)
    ????? 7.郵件支持(Mail Support)
    ????? 8.任務安排的支持(Job Scheduling Support)
    ????? 9.簡化的異常處理(Simplified Exception Handling)
    ????? 10.源代碼級的元數據(Source Level Metadata)

    posted @ 2006-12-21 10:20 劉璐 閱讀(353) | 評論 (0)編輯 收藏

    僅列出標題
    共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
    主站蜘蛛池模板: 免费h黄肉动漫在线观看| 手机看黄av免费网址| 国产jizzjizz免费视频| 亚洲中文字幕乱码AV波多JI | 久久亚洲AV成人无码国产 | aa午夜免费剧场| 亚洲av午夜精品一区二区三区| 亚洲AV无码一区二区三区牲色| 四虎永久免费影院| 美女一级毛片免费观看| 亚洲日韩在线观看| 国产麻豆一精品一AV一免费| 无码专区—VA亚洲V天堂| 99在线观看免费视频| 亚洲人成在久久综合网站| 精品国产一区二区三区免费看 | 最近更新免费中文字幕大全| 亚洲AV成人精品网站在线播放| 色欲国产麻豆一精品一AV一免费 | 免费大片黄在线观看yw| 亚洲狠狠色丁香婷婷综合| 国产免费AV片无码永久免费| 2022国内精品免费福利视频| 亚洲AV永久无码精品水牛影视| 热re99久久6国产精品免费| 国产精品久久亚洲不卡动漫| 国产又大又长又粗又硬的免费视频| 理论秋霞在线看免费| 亚洲伊人色欲综合网| 五月婷婷综合免费| 国产精品亚洲综合一区在线观看| 久久久久国产成人精品亚洲午夜| 一级毛片免费观看| 激情无码亚洲一区二区三区 | 亚洲JLZZJLZZ少妇| 亚洲精品国产精品乱码在线观看| 99久久综合精品免费 | 在线毛片片免费观看| 亚洲欧洲无码AV不卡在线| 伊人久久大香线蕉亚洲五月天| 69av免费观看|