Spring 筆記1

1.在java開發領域,Spring相對於EJB來講是一種輕量級的,非侵入性的Java開發框架,曾經有兩本很暢銷的書《Expert one-on-one J2EE Design and Development》和《Expert one-on-one J2EEdevelopment without EJB》是java高手進階必看的寶典,Spring就是從這兩本書的理論發展起來的。html

Spring主要核心是:java

(1).控制反轉(IOC):之前傳統的java開發模式中,當須要一個對象時咱們,咱們會本身使用new或者getInstance等直接或者間接調用構造方法建立一個對象,而在Spring開發模式中,Spring容器使用了工廠模式爲咱們建立了所須要的對象,咱們使用時不須要本身去建立,直接調用Spring爲咱們提供的對象便可,這就是控制反轉的思想。實例化一個java對象有三種方式:使用類構造器,使用靜態工廠方法,使用實例工廠方法,當使用spring時咱們就不須要關心經過何種方式實例化一個對象,spring經過控制反起色制自動爲咱們實例化一個對象。web

(2).依賴注入(DI):Spring使用java Bean對象的Set方法或者帶參數的構造方法爲咱們在建立所需對象時將其屬性自動設置所須要的值的過程就是依賴注入的基本思想。spring

(3).面向切面編程(AOP):在面向對象編程(OOP)思想中,咱們將事物縱向抽象成一個個的對象。而在面向切面編程中,咱們將一個個對象某些相似的方面橫向抽象成一個切面,對這個切面進行一些如權限驗證,事物管理,記錄日誌等公用操做處理的過程就是面向切面編程的思想。編程

2.在Spring中,全部管理的對象都是JavaBean對象,而BeanFactory和ApplicationContext就是spring框架的兩個IOC容器,如今通常使用ApplicationnContext,其不但包含了BeanFactory的做用,同時還進行更多的擴展。數組

實例化Spring IOC容器的簡單方法:框架

(1).方法1:ide

 

[java]  view plain copy
 
  1. //若是隻有一個spring配置文件也能夠直接傳遞一個string參數,不須要使用數組  
  2. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{「spring配置文件路徑」});  

 

 

(2).方法2:函數

 

[java]  view plain copy
 
  1. Resource res = new FileSystemResource(「spring配置文件」);  
  2. BeanFactory factory = new XMLBeanFactory(res);  

 

 

2. Spring多個配置文件組合方法:this

不少時候,因爲Spring須要管理和配置的東西比較多,若是都放在一個配置文件中,配置文件會變的比較大,同時不方便與維護,通常好的作法是按照功能模塊將Spring配置文件分開,例如:DAO層配置到一個spring-dao.xml配置文件中,Service層配置到spring-service.xml文件中,Struts的action配置到spring-action.xml文件中,而後經過下面兩種辦法將這些分散的配置文件組合起來:

(1).方法1:在一個做爲Spring總配置文件中的<bean>元素定義以前,經過<import>元素將要引入的spring其餘配置文件引入,例如:

 

[xhtml]  view plain copy
 
  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.對於JavaSE的工程,當使用下面方法獲取ApplicationContext對象時將全部的spring配置文件經過數組傳遞進去,也可使用通配符如spring-*.xml方式。

 

[java]  view plain copy
 
  1. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{「spring配置文件路徑」});  

 

 

b.對於JavaEE工程,在web.xml文件中指定spring配置文件時能夠指定多個,中間有逗號「,」分隔,也可使用通配符方式。

3. spring配置文件bean的配置規則:

(1).一個Bean能夠經過一個id屬性唯一指定和引用,若是spring配置文件中有兩個以上相同的id時,spring會報錯id衝突。

(2).一個Bean也能夠經過一個name屬性來引用和指定,若是spring配置文件中有兩個以上相同name的Bean,則spring經過name引用時,運行時後面的會自動覆蓋前面相同name的bean引用,而不會報錯。

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

對於spring配置一個bean時,若是須要給該bean提供一些初始化參數,則須要經過依賴注入方式,所謂的依賴注入就是經過spring將bean所須要的一些參數傳遞到bean實例對象的過程,spring的依賴注入有3種方式:

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

 

[xhtml]  view plain copy
 
  1. <bean id=」……」 class=」……」>  
  2.        <constructor-arg>構造函數須要的參數1</constructor-arg>  
  3.        <constructor-arg>構造函數須要的參數2</constructor-arg>  
  4.        ……  
  5. </bean>  

 

 

使用構造器注入方式時:spring在實例化該Bean時會調用配置參數符合的構造方法。

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

 

[xhtml]  view plain copy
 
  1. <bean id=」……」 class=」……」>  
  2.        <property name=」屬性1」 value=」……」/>  
  3.        <property name=」屬性2」 value=」……」/>  
  4.        ……  
  5. </bean>  

 

 

使用屬性的setter注入方式時,所注入的屬性必須提供setter和getter方法,spring在實例化時會自動調用無參數的構造方法或者靜態工廠方法,實例化以後自動調用屬性的set方法將值設置進去。

(3).使用Field字段注入方式,該方式是spring2.5之後提供的基於java 註解(annotation)方式的注入,就是在java中的字段上或者setter方法上經過使用註解方式進行spring的依賴注入。

例如:

a.字段注入:

 

[java]  view plain copy
 
  1. @Resource  
  2. private  UserDao dao;  

 

 

b. 屬性注入:

 

[java]  view plain copy
 
  1. @Resource  
  2. public void setUserDao(UserDao dao){  
  3.        this.dao = dao;  
  4. }  

 

 

5.spring經過注入方式注入依賴bean的方法:

Spring中爲一個bean注入其依賴的另外一個bean時,經過使用ref來注入另外一個bean,簡單例子以下:

若是bean2中經過bean1屬性引用了bean1則經過下面方式注入:

 

[xhtml]  view plain copy
 
  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的集合注入:

當須要給Bean的集合引用注入值時,spring也提供了相應的方法:

(1).Set集合注入:

 

[xhtml]  view plain copy
 
  1. <bean id=」……」 class=」……」>  
  2. <set>  
  3.               <value>value1</value>  
  4.               <value>value2</value>  
  5.               ……  
  6.        </set>  
  7. </bean>  

 

 

(2).List集合注入:

 

[xhtml]  view plain copy
 
  1. <bean id=」……」 class=」……」>  
  2. <list>  
  3.               <value>value1</value>  
  4.               <value>value2</value>  
  5.               ……  
  6.        </list>  
  7. </bean>  

 

 

(3).Map集合注入:

 

[xhtml]  view plain copy
 
  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注入:

 

[xhtml]  view plain copy
 
  1. <bean id=」……」 class=」……」>  
  2. <props>  
  3.               <prop key=」key1」>value1</prop>  
  4.               <prop key=」key2」>value2</prop>  
  5.               ……  
  6.        </props>  
  7. </bean>  

 

 

注意:Spring會自動將其數據類型轉換,支持泛型。
8. Java註解(Annotation)簡單介紹:

Java註解(Annotation)是經過在java源文件上添加標記字段,而後經過反射的反射在編譯或者運行時獲取這些標記字段以及其標記目標,而後進行相應處理的方法,曾經風靡一時的XDoclet就是最先的java註解的工做原理說明。使用註解能夠進行某些配置,大大減小xml配置文件的書寫麻煩,可是也有人認爲註解方式不方便理解和維護,所以對於註解VS XML配置文件一直爭論不斷,我的感受沒有好壞之分,合適就是最好的。

(1).JDK內置註解:

JDK內置了3個註解:

a.      @Override:聲明某個方法被重寫。

b.      @Deprectated:聲明某個方法過期,不推薦使用。

c.      @SuppressWarning({「unchecked」,…….}):告訴編譯器對於那些警告信息忽略。

(2).自定義java註解:

Java註解就是一種特殊的接口,自定java註解很是方便,簡單例子以下:

 

[java]  view plain copy
 
  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target(ElementType.CLASS)  
  3. public @interface TestAnnotation{  
  4. String value() default 「」;  
  5. }  

 

 

(3).若要想自定義的註解能夠被繼承,則須要在自定義註解類上加上「@Inherited」註解。

注意和說明:

a. java的註解其實是自動繼承了java.lang.annotation.Annotation接口,所以在自定義註解時不能繼承其餘的註解或者接口。

b. Retention:告訴編譯器如何處理註解,即註解運行在什麼時刻。

RetentionPolicy是個枚舉類型,有如下三種狀態值:

1).SOURCE:該註解存儲在源文件中,編譯事後即廢棄。

2).CLASS:該註解存儲在class文件中,是其缺省的值。

3).RUNTIME:該註解存儲在class文件中,而且有Java虛擬機讀入解析,該類型很是重要,可使用反射機制獲取註解相關信息,能夠進行程序分析處理。

c. @Target:指定註解的目標使用對象。

ElementType也是個枚舉類型,有如下幾種狀態值:

1).TYPE:該註解適用於class,interface,enum等類級別的目標對象。

2).FIELD:該註解適用於類中字段級別的目標對象。

3).METHOD:該註解適用於類中方法級別的目標對象。

4).PARAMETER:該註解適用於方法參數級別的目標對象。

5).CONSTRUCTOR:該註解適用於類構造方法。

6).LOCAL_VARIABLE:該註解適用於局部變量。

7).ANNOTATION_TYPE:該註解適用於annotation對象。

8).PACKAGE:該註解適用於package對象。

d.註解裏面只能聲明屬性,不能聲明方法,聲明屬性的方式比較特殊:

語法格式爲:數據類型 屬性() default 默認值(默認值是可選的); 如:Stringvalue();

使用時,「註解對象(屬性=屬性值)」爲註解指定屬性值,經過「註解對象.屬性;」就能夠獲得註解屬性的值。

e.註解的解析:使用java反射機制得到註解的目標對象就能夠獲得註解對象,如:

經過反射獲得了註解目標的Field對象field,則經過「field.getAnnotation(註解類.class);」就能夠獲得註解對象。

9.      基於註解的Spring配置準備條件:

從Spring2.5之後,Spring開始全面支持註解方式配置,因此能夠不用寫xml配置文件,同樣可使用spring。

(1).使用spring註解方式,必須加入spring註解方式所依賴的jar包:common-annotation.jar。

(2).使用註解方式時,必須在spring配置文件的schema中添加註解的命名空間以下:

 

[xhtml]  view plain copy
 
  1. xmlns:context=」http://www.springframework.org/schema/context」  
  2. http://www.springframework.org/schema/context  
  3. http://www.springframework.org/schema/context/spring-context-2.5.xsd  

 

 

(3).在spring配置文件中註冊註解處理器:

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

 

[xhtml]  view plain copy
 
  1. <context:annotation-config>  

 

 

10.  基於註解的spring配置:

Spring2.5中使用四個註解按功能來進行對bean的配置:

(1).@Component:泛指組件,對於通常很差歸類的java Bean使用。

(2).@Service:用於標註配置業務層(service層)組件。

(3).@Controller:用於標註配置控制層的組件(如Struts中的action)。

(4).@Repository:用於標註配置數據訪問層組件,即通常的DAO層Bean對象。

注意:對於使用spring註解方式配置的bean對象,bean引用時默認名稱爲被註解名稱的首字母小寫形式,也能夠指定名稱,如:@Service(「userDao「)。

11.   Spring的自動裝配:

自動裝配的是指不用手動顯式配置java Bean之間依賴關係,而是讓spring依據某種規則自動將合適的對象注入到目標對象的過程。Spring中經常使用@Autowire和@Resource來進行自動裝配。

(1).@Autowire:默認是按照對象的數據類型進行自動裝配的,如

 

[java]  view plain copy
 
  1. @Autowire  
  2. private UserDao userDao;  

 

 

spring框架在運行時會自動將類型爲UserDao的對象注入進來。

(2).@Resource:默認是按照名稱或者Id進行自動裝配的,只有當找不到匹配的名稱或者Id時才按類型進行裝配,如:

 

[java]  view plain copy
 
  1. @Resource(name=」userDao」)  
  2. private UsreDao userDao;  

 

 

spring框架在運行時會將配置名稱或者id爲「userDao」的對象注入進來。

注意:@Autowire和@Resource都既能夠寫在字段上,也能夠寫在set方法上。

12.   Spring的自動掃描:

Spring自動掃描機制是指,咱們使用基於註解的spring配置方式後,spring的配置文件中只須要註冊註解處理器,不用顯式地配置Bean,當spring在運行時會自動掃描根據給定的條件下類路徑中的全部bean,根據註解將它們注入和裝配起來並進行初始化的過程。

自動掃描很簡單,只須要在spring的配置文件中添加如:

 

[xhtml]  view plain copy
 
  1. <context:component-scan base-package=「要自動掃描的包名「>  

 

 

Spring在運行時就能夠對指定的包中全部添加了Spring註解的bean自動掃描,注入,裝配和初始化。

注意:基於註解的spring配置,自動裝配和自動掃描是緊密聯繫在一塊兒協同工做的,都須要引入context的命名空間。

相關文章
相關標籤/搜索