|
1.在java開(kāi)發(fā)領(lǐng)域,Spring相對(duì)于EJB來(lái)說(shuō)是一種輕量級(jí)的,非侵入性的Java開(kāi)發(fā)框架,曾經(jīng)有兩本很暢銷的書《Expert one-on-one J2EE Design and Development》和《Expert one-on-one J2EEdevelopment without EJB》是java高手進(jìn)階必看的寶典,Spring就是從這兩本書的理論發(fā)展起來(lái)的。 Spring主要核心是: (1).控制反轉(zhuǎn)(IOC):以前傳統(tǒng)的java開(kāi)發(fā)模式中,當(dāng)需要一個(gè)對(duì)象時(shí)我們,我們會(huì)自己使用new或者getInstance等直接或者間接調(diào)用構(gòu)造方法創(chuàng)建一個(gè)對(duì)象,而在Spring開(kāi)發(fā)模式中,Spring容器使用了工廠模式為我們創(chuàng)建了所需要的對(duì)象,我們使用時(shí)不需要自己去創(chuàng)建,直接調(diào)用Spring為我們提供的對(duì)象即可,這就是控制反轉(zhuǎn)的思想。實(shí)例化一個(gè)java對(duì)象有三種方式:使用類構(gòu)造器,使用靜態(tài)工廠方法,使用實(shí)例工廠方法,當(dāng)使用spring時(shí)我們就不需要關(guān)心通過(guò)何種方式實(shí)例化一個(gè)對(duì)象,spring通過(guò)控制反轉(zhuǎn)機(jī)制自動(dòng)為我們實(shí)例化一個(gè)對(duì)象。 (2).依賴注入(DI):Spring使用java Bean對(duì)象的Set方法或者帶參數(shù)的構(gòu)造方法為我們?cè)趧?chuàng)建所需對(duì)象時(shí)將其屬性自動(dòng)設(shè)置所需要的值的過(guò)程就是依賴注入的基本思想。 (3).面向切面編程(AOP):在面向?qū)ο缶幊?span lang="EN-US">(OOP)思想中,我們將事物縱向抽象成一個(gè)個(gè)的對(duì)象。而在面向切面編程中,我們將一個(gè)個(gè)對(duì)象某些類似的方面橫向抽象成一個(gè)切面,對(duì)這個(gè)切面進(jìn)行一些如權(quán)限驗(yàn)證,事物管理,記錄日志等公用操作處理的過(guò)程就是面向切面編程的思想。 2.在Spring中,所有管理的對(duì)象都是JavaBean對(duì)象,而BeanFactory和ApplicationContext就是spring框架的兩個(gè)IOC容器,現(xiàn)在一般使用ApplicationnContext,其不但包含了BeanFactory的作用,同時(shí)還進(jìn)行更多的擴(kuò)展。 實(shí)例化Spring IOC容器的簡(jiǎn)單方法: (1).方法1: [java] view plaincopy
(2).方法2: [java] view plaincopy
2. Spring多個(gè)配置文件組合方法: 很多時(shí)候,由于Spring需要管理和配置的東西比較多,如果都放在一個(gè)配置文件中,配置文件會(huì)變的比較大,同時(shí)不方便與維護(hù),一般好的做法是按照功能模塊將Spring配置文件分開(kāi),例如:DAO層配置到一個(gè)spring-dao.xml配置文件中,Service層配置到spring-service.xml文件中,Struts的action配置到spring-action.xml文件中,然后通過(guò)下面兩種辦法將這些分散的配置文件組合起來(lái): (1).方法1:在一個(gè)作為Spring總配置文件中的<bean>元素定義之前,通過(guò)<import>元素將要引入的spring其他配置文件引入,例如: [xhtml] view plaincopy
(2).方法2: a.對(duì)于JavaSE的工程,當(dāng)使用下面方法獲取ApplicationContext對(duì)象時(shí)將所有的spring配置文件通過(guò)數(shù)組傳遞進(jìn)去,也可以使用通配符如spring-*.xml方式。 [java] view plaincopy
b.對(duì)于JavaEE工程,在web.xml文件中指定spring配置文件時(shí)可以指定多個(gè),中間有逗號(hào)“,”分隔,也可以使用通配符方式。 3. spring配置文件bean的配置規(guī)則: (1).一個(gè)Bean可以通過(guò)一個(gè)id屬性惟一指定和引用,如果spring配置文件中有兩個(gè)以上相同的id時(shí),spring會(huì)報(bào)錯(cuò)id沖突。 (2).一個(gè)Bean也可以通過(guò)一個(gè)name屬性來(lái)引用和指定,如果spring配置文件中有兩個(gè)以上相同name的Bean,則spring通過(guò)name引用時(shí),運(yùn)行時(shí)后面的會(huì)自動(dòng)覆蓋前面相同name的bean引用,而不會(huì)報(bào)錯(cuò)。 4.spring依賴注入3種方式: 對(duì)于spring配置一個(gè)bean時(shí),如果需要給該bean提供一些初始化參數(shù),則需要通過(guò)依賴注入方式,所謂的依賴注入就是通過(guò)spring將bean所需要的一些參數(shù)傳遞到bean實(shí)例對(duì)象的過(guò)程,spring的依賴注入有3種方式: (1).使用構(gòu)造器注入: [xhtml] view plaincopy
使用構(gòu)造器注入方式時(shí):spring在實(shí)例化該Bean時(shí)會(huì)調(diào)用配置參數(shù)符合的構(gòu)造方法。 (2).使用屬性的setter注入: [xhtml] view plaincopy
使用屬性的setter注入方式時(shí),所注入的屬性必須提供setter和getter方法,spring在實(shí)例化時(shí)會(huì)自動(dòng)調(diào)用無(wú)參數(shù)的構(gòu)造方法或者靜態(tài)工廠方法,實(shí)例化之后自動(dòng)調(diào)用屬性的set方法將值設(shè)置進(jìn)去。 (3).使用Field字段注入方式,該方式是spring2.5以后提供的基于java 注解(annotation)方式的注入,就是在java中的字段上或者setter方法上通過(guò)使用注解方式進(jìn)行spring的依賴注入。 例如: a.字段注入: [java] view plaincopy
b. 屬性注入: [java] view plaincopy
5.spring通過(guò)注入方式注入依賴bean的方法: Spring中為一個(gè)bean注入其依賴的另一個(gè)bean時(shí),通過(guò)使用ref來(lái)注入另一個(gè)bean,簡(jiǎn)單例子如下: 如果bean2中通過(guò)bean1屬性引用了bean1則通過(guò)下面方式注入: [xhtml] view plaincopy
6.spring的集合注入: 當(dāng)需要給Bean的集合引用注入值時(shí),spring也提供了相應(yīng)的方法: (1).Set集合注入: [xhtml] view plaincopy
(2).List集合注入: [xhtml] view plaincopy
(3).Map集合注入: [xhtml] view plaincopy
(4).Properties注入: [xhtml] view plaincopy
注意:Spring會(huì)自動(dòng)將其數(shù)據(jù)類型轉(zhuǎn)換,支持泛型。 Java注解(Annotation)是通過(guò)在java源文件上添加標(biāo)記字段,然后通過(guò)反射的反射在編譯或者運(yùn)行時(shí)獲取這些標(biāo)記字段以及其標(biāo)記目標(biāo),然后進(jìn)行相應(yīng)處理的方法,曾經(jīng)風(fēng)靡一時(shí)的XDoclet就是最早的java注解的工作原理說(shuō)明。使用注解可以進(jìn)行某些配置,大大減少xml配置文件的書寫麻煩,但是也有人認(rèn)為注解方式不方便理解和維護(hù),因此對(duì)于注解VS XML配置文件一直爭(zhēng)論不斷,個(gè)人感覺(jué)沒(méi)有好壞之分,合適就是最好的。 (1).JDK內(nèi)置注解: JDK內(nèi)置了3個(gè)注解: a. @Override:聲明某個(gè)方法被重寫。 b. @Deprectated:聲明某個(gè)方法過(guò)時(shí),不推薦使用。 c. @SuppressWarning({“unchecked”,…….}):告訴編譯器對(duì)于那些警告信息忽略。 (2).自定義java注解: Java注解就是一種特殊的接口,自定java注解非常方便,簡(jiǎn)單例子如下: [java] view plaincopy
(3).若要想自定義的注解可以被繼承,則需要在自定義注解類上加上“@Inherited”注解。 注意和說(shuō)明: a. java的注解實(shí)際上是自動(dòng)繼承了java.lang.annotation.Annotation接口,因此在自定義注解時(shí)不能繼承其他的注解或者接口。 b. Retention:告訴編譯器如何處理注解,即注解運(yùn)行在什么時(shí)刻。 RetentionPolicy是個(gè)枚舉類型,有以下三種狀態(tài)值: 1).SOURCE:該注解存儲(chǔ)在源文件中,編譯過(guò)后即廢棄。 2).CLASS:該注解存儲(chǔ)在class文件中,是其缺省的值。 3).RUNTIME:該注解存儲(chǔ)在class文件中,并且有Java虛擬機(jī)讀入解析,該類型非常重要,可以使用反射機(jī)制獲取注解相關(guān)信息,可以進(jìn)行程序分析處理。 c. @Target:指定注解的目標(biāo)使用對(duì)象。 ElementType也是個(gè)枚舉類型,有以下幾種狀態(tài)值: 1).TYPE:該注解適用于class,interface,enum等類級(jí)別的目標(biāo)對(duì)象。 2).FIELD:該注解適用于類中字段級(jí)別的目標(biāo)對(duì)象。 3).METHOD:該注解適用于類中方法級(jí)別的目標(biāo)對(duì)象。 4).PARAMETER:該注解適用于方法參數(shù)級(jí)別的目標(biāo)對(duì)象。 5).CONSTRUCTOR:該注解適用于類構(gòu)造方法。 6).LOCAL_VARIABLE:該注解適用于局部變量。 7).ANNOTATION_TYPE:該注解適用于annotation對(duì)象。 8).PACKAGE:該注解適用于package對(duì)象。 d.注解里面只能聲明屬性,不能聲明方法,聲明屬性的方式比較特殊: 語(yǔ)法格式為:數(shù)據(jù)類型 屬性() default 默認(rèn)值(默認(rèn)值是可選的); 如:Stringvalue(); 使用時(shí),“注解對(duì)象(屬性=屬性值)”為注解指定屬性值,通過(guò)“注解對(duì)象.屬性;”就可以得到注解屬性的值。 e.注解的解析:使用java反射機(jī)制獲得注解的目標(biāo)對(duì)象就可以得到注解對(duì)象,如: 通過(guò)反射得到了注解目標(biāo)的Field對(duì)象field,則通過(guò)“field.getAnnotation(注解類.class);”就可以得到注解對(duì)象。 9. 基于注解的Spring配置準(zhǔn)備條件: 從Spring2.5以后,Spring開(kāi)始全面支持注解方式配置,所以可以不用寫xml配置文件,一樣可以使用spring。 (1).使用spring注解方式,必須加入spring注解方式所依賴的jar包:common-annotation.jar。 (2).使用注解方式時(shí),必須在spring配置文件的schema中添加注解的命名空間如下: [xhtml] view plaincopy
(3).在spring配置文件中注冊(cè)注解處理器: 在spring配置文件中<.bean>元素之前添加: [xhtml] view plaincopy
10. 基于注解的spring配置: Spring2.5中使用四個(gè)注解按功能來(lái)進(jìn)行對(duì)bean的配置: (1).@Component:泛指組件,對(duì)于一般不好歸類的java Bean使用。 (2).@Service:用于標(biāo)注配置業(yè)務(wù)層(service層)組件。 (3).@Controller:用于標(biāo)注配置控制層的組件(如Struts中的action)。 (4).@Repository:用于標(biāo)注配置數(shù)據(jù)訪問(wèn)層組件,即一般的DAO層Bean對(duì)象。 注意:對(duì)于使用spring注解方式配置的bean對(duì)象,bean引用時(shí)默認(rèn)名稱為被注解名稱的首字母小寫形式,也可以指定名稱,如:@Service(“userDao“)。 11. Spring的自動(dòng)裝配: 自動(dòng)裝配的是指不用手動(dòng)顯式配置java Bean之間依賴關(guān)系,而是讓spring依據(jù)某種規(guī)則自動(dòng)將合適的對(duì)象注入到目標(biāo)對(duì)象的過(guò)程。Spring中常用@Autowire和@Resource來(lái)進(jìn)行自動(dòng)裝配。 (1).@Autowire:默認(rèn)是按照對(duì)象的數(shù)據(jù)類型進(jìn)行自動(dòng)裝配的,如 [java] view plaincopy
spring框架在運(yùn)行時(shí)會(huì)自動(dòng)將類型為UserDao的對(duì)象注入進(jìn)來(lái)。 (2).@Resource:默認(rèn)是按照名稱或者Id進(jìn)行自動(dòng)裝配的,只有當(dāng)找不到匹配的名稱或者Id時(shí)才按類型進(jìn)行裝配,如: [java] view plaincopy
spring框架在運(yùn)行時(shí)會(huì)將配置名稱或者id為“userDao”的對(duì)象注入進(jìn)來(lái)。 注意:@Autowire和@Resource都既可以寫在字段上,也可以寫在set方法上。 12. Spring的自動(dòng)掃描: Spring自動(dòng)掃描機(jī)制是指,我們使用基于注解的spring配置方式后,spring的配置文件中只需要注冊(cè)注解處理器,不用顯式地配置Bean,當(dāng)spring在運(yùn)行時(shí)會(huì)自動(dòng)掃描根據(jù)給定的條件下類路徑中的所有bean,根據(jù)注解將它們注入和裝配起來(lái)并進(jìn)行初始化的過(guò)程。 自動(dòng)掃描很簡(jiǎn)單,只需要在spring的配置文件中添加如: [xhtml] view plaincopy
Spring在運(yùn)行時(shí)就可以對(duì)指定的包中所有添加了Spring注解的bean自動(dòng)掃描,注入,裝配和初始化。 注意:基于注解的spring配置,自動(dòng)裝配和自動(dòng)掃描是緊密聯(lián)系在一起協(xié)同工作的,都需要引入context的命名空間。
|
|
|