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