电竞比分网-中国电竞赛事及体育赛事平台

分享

Spring學(xué)習(xí)筆記1

 Gtwo 2015-05-06

 

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ì)象,而BeanFactoryApplicationContext就是spring框架的兩個(gè)IOC容器,現(xiàn)在一般使用ApplicationnContext,其不但包含了BeanFactory的作用,同時(shí)還進(jìn)行更多的擴(kuò)展。

實(shí)例化Spring IOC容器的簡(jiǎn)單方法:

(1).方法1

  1. //如果只有一個(gè)spring配置文件也可以直接傳遞一個(gè)string參數(shù),不需要使用數(shù)組  
  2. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{“spring配置文件路徑”});  
 

(2).方法2

  1. Resource res = new FileSystemResource(“spring配置文件”);  
  2. BeanFactory factory = new XMLBeanFactory(res);  
 

2. Spring多個(gè)配置文件組合方法:

很多時(shí)候,由于Spring需要管理和配置的東西比較多,如果都放在一個(gè)配置文件中,配置文件會(huì)變的比較大,同時(shí)不方便與維護(hù),一般好的做法是按照功能模塊將Spring配置文件分開(kāi),例如:DAO層配置到一個(gè)spring-dao.xml配置文件中,Service層配置到spring-service.xml文件中,Strutsaction配置到spring-action.xml文件中,然后通過(guò)下面兩種辦法將這些分散的配置文件組合起來(lái):

(1).方法1:在一個(gè)作為Spring總配置文件中的<bean>元素定義之前,通過(guò)<import>元素將要引入的spring其他配置文件引入,例如:

  1. <beans>  
  2.        <import resource=”spring-dao.xml”/>  
  3.        <import resource=”spring-service.xml”/>  
  4.        <import resource=”spring-action.xml”/>  
  5.        ……  
  6.        <bean>  
  7.        </bean>  
  8.        ……  
  9. </beans>  
 

(2).方法2

a.對(duì)于JavaSE的工程,當(dāng)使用下面方法獲取ApplicationContext對(duì)象時(shí)將所有的spring配置文件通過(guò)數(shù)組傳遞進(jìn)去,也可以使用通配符如spring-*.xml方式。

  1. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{“spring配置文件路徑”});  
 

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è)以上相同nameBean,則spring通過(guò)name引用時(shí),運(yùn)行時(shí)后面的會(huì)自動(dòng)覆蓋前面相同namebean引用,而不會(huì)報(bào)錯(cuò)。

4.spring依賴注入3種方式:

對(duì)于spring配置一個(gè)bean時(shí),如果需要給該bean提供一些初始化參數(shù),則需要通過(guò)依賴注入方式,所謂的依賴注入就是通過(guò)springbean所需要的一些參數(shù)傳遞到bean實(shí)例對(duì)象的過(guò)程,spring的依賴注入有3種方式:

(1).使用構(gòu)造器注入:

  1. <bean id=”……” class=”……”>  
  2.        <constructor-arg>構(gòu)造函數(shù)需要的參數(shù)1</constructor-arg>  
  3.        <constructor-arg>構(gòu)造函數(shù)需要的參數(shù)2</constructor-arg>  
  4.        ……  
  5. </bean>  
 

使用構(gòu)造器注入方式時(shí):spring在實(shí)例化該Bean時(shí)會(huì)調(diào)用配置參數(shù)符合的構(gòu)造方法。

(2).使用屬性的setter注入:

  1. <bean id=”……” class=”……”>  
  2.        <property name=”屬性1” value=”……”/>  
  3.        <property name=”屬性2” value=”……”/>  
  4.        ……  
  5. </bean>  
 

使用屬性的setter注入方式時(shí),所注入的屬性必須提供settergetter方法,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.字段注入:

  1. @Resource  
  2. private  UserDao dao;  
 

b. 屬性注入:

  1. @Resource  
  2. public void setUserDao(UserDao dao){  
  3.        this.dao = dao;  
  4. }  
 

5.spring通過(guò)注入方式注入依賴bean的方法:

Spring中為一個(gè)bean注入其依賴的另一個(gè)bean時(shí),通過(guò)使用ref來(lái)注入另一個(gè)bean,簡(jiǎn)單例子如下:

如果bean2中通過(guò)bean1屬性引用了bean1則通過(guò)下面方式注入:

  1. <beans>  
  2.        <bean id=”bean1” class=”……”>  
  3.               <property name=”屬性1” value=”……”/>  
  4.               ……  
  5.        </bean>  
  6. <bean id=”bean2” class=”……”>  
  7.               <property name=”bean1” ref=”bean1”/>  
  8.               ……  
  9.        </bean>  
  10. </beans>  
 

6.spring的集合注入:

當(dāng)需要給Bean的集合引用注入值時(shí),spring也提供了相應(yīng)的方法:

(1).Set集合注入:

  1. <bean id=”……” class=”……”>  
  2. <set>  
  3.               <value>value1</value>  
  4.               <value>value2</value>  
  5.               ……  
  6.        </set>  
  7. </bean>  
 

(2).List集合注入:

  1. <bean id=”……” class=”……”>  
  2. <list>  
  3.               <value>value1</value>  
  4.               <value>value2</value>  
  5.               ……  
  6.        </list>  
  7. </bean>  
 

(3).Map集合注入:

  1. <bean id=”……” class=”……”>  
  2. <map>  
  3.               <entry key=”key1” value=”value1”>  
  4.               <entry key=”key2” value=”value2”>  
  5.               ……  
  6.        </map>  
  7. </bean>  
 

(4).Properties注入:

  1. <bean id=”……” class=”……”>  
  2. <props>  
  3.               <prop key=”key1”>value1</prop>  
  4.               <prop key=”key2”>value2</prop>  
  5.               ……  
  6.        </props>  
  7. </bean>  
 

注意:Spring會(huì)自動(dòng)將其數(shù)據(jù)類型轉(zhuǎn)換,支持泛型。
8. Java
注解(Annotation)簡(jiǎ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)單例子如下:

  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target(ElementType.CLASS)  
  3. public @interface TestAnnotation{  
  4. String value() default “”;  
  5. }  
 

(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中添加注解的命名空間如下:

  1. xmlns:context=”http://www./schema/context”  
  2. http://www./schema/context  
  3. http://www./schema/context/spring-context-2.5.xsd  
 

(3).spring配置文件中注冊(cè)注解處理器:

spring配置文件中<.bean>元素之前添加:

  1. <context:annotation-config>  
 

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)層組件,即一般的DAOBean對(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)裝配的,如

  1. @Autowire  
  2. private UserDao userDao;  
 

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)行裝配,如:

  1. @Resource(name=”userDao”)  
  2. private UsreDao userDao;  
 

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的配置文件中添加如:

  1. <context:component-scan base-package=“要自動(dòng)掃描的包名“>  
 

Spring在運(yùn)行時(shí)就可以對(duì)指定的包中所有添加了Spring注解的bean自動(dòng)掃描,注入,裝配和初始化。

注意:基于注解的spring配置,自動(dòng)裝配和自動(dòng)掃描是緊密聯(lián)系在一起協(xié)同工作的,都需要引入context的命名空間。

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多