Spring筆記之SpringIOC

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

Spring主要核心是:

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

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

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

2.在Spring中,所有管理的對象都是JavaBean對象,而BeanFactory和ApplicationContext就是spring框架的兩個IOC容器,現在一般使用ApplicationnContext,其不但包含了BeanFactory的作用,同時還進行更多的擴展。

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

(1).方法1:

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

(2).方法2:

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

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

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

(1).方法1:在一個作爲Spring總配置文件中的<bean>元素定義之前,通過<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.對於JavaSE的工程,當使用下面方法獲取ApplicationContext對象時將所有的spring配置文件通過數組傳遞進去,也可以使用通配符如spring-*.xml方式。

  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).使用構造器注入:

  1. <bean id=”……” class=”……”>  
  2.        <constructor-arg>構造函數需要的參數1</constructor-arg>  
  3.        <constructor-arg>構造函數需要的參數2</constructor-arg>  
  4.        ……  
  5. </bean>  
 

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

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

  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.字段注入:

  1. @Resource  
  2. private  UserDao dao;  
 

b. 屬性注入:

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

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

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

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

  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集合注入:

  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會自動將其數據類型轉換,支持泛型。
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註解非常方便,簡單例子如下:

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

  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>元素之前添加:

點擊打開鏈接

  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:默認是按照對象的數據類型進行自動裝配的,如

  1. @Autowire  
  2. private UserDao userDao;  
 

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

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

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

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

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

12.   Spring的自動掃描:

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

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

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

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

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

轉自:點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章