回顧Spring(一)

0.框架

框架,即framework。框架通常是成熟的,不斷升級的軟件。是對特定應用領域中的應用系統的部分設計和實現的總體結構。java

由於軟件系統發展到今天已經很複雜了,特別是服務器端軟件,涉及到的知識,內容,問題太多。在某些方面使用別人成熟的框架,就至關於讓別人幫你完成一些基礎工做,你只須要集中精力完成系統的業務邏輯設計。並且框架通常是成熟,穩健的,他能夠處理系統不少細節問題,好比,事務處理,安全性,數據流控制等問題。還有框架通常都通過不少人使用,因此結構很好,因此擴展性也很好,並且它是不斷升級的,你能夠直接享受別人升級代碼帶來的好處。spring

一、Spring簡介

  1. Spring是一個開源框架
  2. Spring爲簡化企業級開發而生,使用SpringJavaBean就能夠實現不少之前要靠EJB才能實現的功能。
  3. Spring是一個IOC(DI)AOP容器框架。
  4. Spring的優良特性
    • 非侵入式:基於Spring開發的應用中的對象能夠不依賴於SpringAPI
    • 依賴注入DI——Dependency Injection,反轉控制(IOC)最經典的實現。
    • 面向切面編程Aspect Oriented Programming——AOP
    • 容器Spring是一個容器,由於它包含而且管理應用對象的生命週期
    • 組件化Spring實現了使用簡單的組件配置組合成一個複雜的應用。在 Spring 中可使用XMLJava註解組合這些對象。
    • 一站式:在IOCAOP的基礎上能夠整合各類企業應用的開源框架和優秀的第三方類庫(實際上Spring 自身也提供了表述層的SpringMVC和持久層的Spring JDBC)。
  5. Spring模塊

1.一、搭建Spring運行時環境

  1. 加入JAR
    • ① Spring自身JAR包:spring-framework-4.0.0.RELEASE\libs目錄下express

      spring-beans-4.0.0.RELEASE.jar編程

      spring-context-4.0.0.RELE2ASE.jar數組

      spring-core-4.0.0.RELEASE.jar安全

      spring-expression-4.0.0.RELEASE.jar服務器

      ② commons-logging-1.1.1.jar
  2. Spring Tool Suite工具中經過以下步驟建立Spring的配置文件

         ① File->New->Spring Bean Configuration Fileapp

         ② 爲文件取名字 例如:applicationContext.xml框架

1.二、HelloWord

  1. 建立一個實體類
    package cn.edu.hbuas.entity;
    
    public class Person {
    	private Integer id;
    	private String name;
    	
    	public Person() {
    		
    	}
    	
    	
    	public Person(Integer id, String name) {
    		super();
    		this.id = id;
    		this.name = name;
    	}
    
    
    	@Override
    	public String toString() {
    		return "Person [id=" + id + ", name=" + name + "]";
    	}
    
    
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	
    }
  2. 建立Spring配置文件
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="person" class="cn.edu.hbuas.entity.Person" >
    	<property name="id" value="111"></property>
    	<property name="name" value="小明"></property>
    </bean>
    	
    </beans>

     

  3. 測試:經過SpringIOC容器建立Student類實例
package cn.edu.hbuas.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.edu.hbuas.entity.Person;

public class TestBySpring {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
		
		Person person=(Person)ac.getBean("person");
		System.out.println(person);
	}

}

 

二、IOC容器和Bean的配置

2.一、IOC(Inversion of Control):反轉控制

反轉控制的思想徹底顛覆了應用程序組件獲取資源的傳統方式:反轉了資源的獲取方向——改由容器主動的將資源推送給須要的組件,開發人員不須要知道容器是如何建立資源對象的,只須要提供接收資源的方式便可,極大的下降了學習成本,提升了開發的效率。這種行爲也稱爲查找的被動形式。ide

傳統方式:   我想吃飯    我須要買菜作飯

反轉控制:   我想吃飯    張口就行

2.二、DI(Dependency Injection):依賴注入

IOC的另外一種表述方式:即組件以一些預先定義好的方式(例如:setter 方法)接受來自於容器的資源注入。相對於IOC而言,這種表述更直接。

總結: IOC 就是一種反轉控制的思想, DI是對IOC的一種具體實現。

2.三、IOC容器在Spring中的實現

IOC容器在最底層實質上就是一個對象工廠.

1)在經過IOC容器讀取Bean的實例以前,須要先將IOC容器自己實例化。

2Spring提供了IOC容器的兩種實現方式

               ① BeanFactory:IOC容器的基本實現,是Spring內部的基礎設施,是面向Spring自己的,不是提供給開發人員使用的。

                ② ApplicationContext:BeanFactory的子接口,提供了更多高級特性。面向Spring的使用者,幾乎全部場合都使用ApplicationContext而不是底層的BeanFactory

ApplicationContext的主要實現類:

  1. ClassPathXmlApplicationContext:對應類路徑下的XML格式的配置文件
  2. FileSystemXmlApplicationContext:對應文件系統中的XML格式的配置文件
  3. 在初始化時就建立單例的bean,也能夠經過配置的方式指定建立的Bean是多實例的。

2.四、給bean的屬性賦值

2.4.一、依賴注入的方式

    1. 經過beansetXxx()方法賦值

Hello World中使用的就是這種方式

    2. 經過bean的構造器賦值

 

  1. Spring自動匹配合適的構造器
  2. 經過索引值指定參數位置

    3.P名稱空間

 

爲了簡化XML文件的配置,愈來愈多的XML文件採用屬性而非子元素配置信息。Spring2.5版本開始引入了一個新的p命名空間,能夠經過<bean>元素屬性的方式配置Bean 的屬性。使用p命名空間後,基於XML的配置方式將進一步簡化。

2.4.2、爲屬性賦值時可用的值

  1.  字面量

    1. 可使用字符串表示的值,能夠經過value屬性或value子節點的方式指定
    2. 基本數據類型及其封裝類、String等類型均可以採起字面值注入的方式
    3. 若字面值中包含特殊字符,可使用<![CDATA[]]>把字面值包裹起來
  2. null
    <bean class="cn.edu.hbuas.entity" id="bookNull" >
         <property name= "id" value ="2000"/>
         <property name= "name">
             <null/>
         </property>
    </bean >

3.引用類型

<bean id="action" class="cn.edu.hbuas.action">
          <property name="service" ref="service"/>
          <property name="service.dao.dataSource" value="DBCP"/>
</bean>

4.集合屬性

        數組和List

  • 配置java.util.List類型的屬性,須要指定<list>標籤,在標籤裏包含一些元素。
  • 能夠經過<value>指定簡單的常量值,經過<ref>指定對其餘Bean的引用。
  • 配置java.util.Set須要使用<set>標籤,定義的方法與List同樣。
<bean id="shop" class="cn.edu.hbuas.bean.Shop" >
           <property name= "categoryList">
               <!-- 以字面量爲值的List集合 -->
               <list>
                    <value> 歷史</value >
                    <value> 軍事</value >
               </list>
           </property>
           <property name= "bookList">
               <!-- 以bean的引用爲值的List集合 -->
               <list>
                    <ref bean= "book01"/>
                    <ref bean= "book02"/>
               </list>
           </property>
     </bean >

        Map

  • Java.util.Map經過<map>標籤訂義,<map>標籤裏可使用多個<entry>做爲子標籤。一個entry至關於一條鍵值對。
  • 必須在<key>標籤裏定義鍵。
  • 由於鍵和值的類型沒有限制,因此能夠自由地爲它們指定<value><ref><bean><null/>
<bean id="cup" class="cn.edu.hbuas.bean.Cup">
	<property name="bookMap">
		<map>
			<entry>
				<key>
					<value>1001</value>
				</key>
				<value>孫老師</value>
			</entry>
			<entry>
				<key>
					<value>bookKey02</value>
				</key>
				<ref bean="book02"/>
			</entry>
		</map>
	</property>
</bean>

2.五、FactoryBean

Spring中有兩種類型的bean,一種是普通bean,另外一種是工廠bean,即FactoryBean

  • 工廠bean跟普通bean不一樣,其返回的對象不是指定類的一個實例,而是該工廠beangetObject方法所返回的對象。
  • 工廠bean必須實現org.springframework.beans.factory.FactoryBean接口。

<bean id="product" class="cn.edu.hbuas.bean.ProductFactory">
	<property name="productName" value="Mp3" />
</bean>

2.六、bean的做用域

 

  • Spring中,能夠在<bean>元素的scope屬性裏設置bean的做用域,以決定這個bean是單實例的仍是多實例的。
  • 默認狀況下,Spring只爲每一個在IOC容器裏聲明的bean建立惟一一個實例,整個IOC容器範圍內都能共享該實例:全部後續的getBean()調用和bean引用都將返回這個惟一的bean實例。該做用域被稱爲singleton,它是全部bean的默認做用域。

bean的做用域爲單例時,Spring會在IOC容器對象建立時就建立bean的對象實例。而當bean的做用域爲prototype時,IOC容器在獲取bean的實例時建立bean的實例對象。

2.七、bean的生命週期

Spring IOC容器對bean的生命週期進行管理的過程:

經過構造器或工廠方法建立bean實例

bean的屬性設置值和對其餘bean的引用

調用bean的初始化方法

④  bean可使用了

當容器關閉時,調用bean的銷燬方法

在配置bean時,經過init-methoddestroy-method 屬性爲bean指定初始化和銷燬方法

 

bean的後置處理器

         ① bean後置處理器容許在調用初始化方法先後bean進行額外的處理

         ② bean後置處理器對IOC容器裏的全部bean實例逐一處理,而非單一實例。

       其典型應用是:檢查bean屬性的正確性或根據特定的標準更改bean的屬性。

         ③ bean後置處理器須要實現接口:

org.springframework.beans.factory.config.BeanPostProcessor。在初始化方法被調用先後,Spring將把每一個bean實例分別傳遞給上述接口的如下兩個方法:

  • postProcessBeforeInitialization(Object, String)
  • postProcessAfterInitialization(Object, String)
  1. 添加bean後置處理器後bean的生命週期

         ①經過構造器或工廠方法建立bean實例

         ②bean屬性設置值和對其餘bean的引用

         ③bean實例傳遞給bean後置處理器的postProcessBeforeInitialization()方法

         ④調用bean初始化方法

         ⑤bean實例傳遞給bean後置處理器的postProcessAfterInitialization()方法

         ⑥bean可使用了

         ⑦當容器關閉時調用bean銷燬方法

2.八、自動裝配

  1. 手動裝配:以valueref的方式明確指定屬性值都是手動裝配。
  2. 自動裝配:根據指定的裝配規則,不須要明確指定Spring自動將匹配的屬性值注入bean中。

2.8.一、裝配模式

  • 根據類型自動裝配:將類型匹配的bean做爲屬性注入到另外一個bean中。若IOC容器中有多個與目標bean類型一致的beanSpring將沒法斷定哪一個bean最合適該屬性,因此不能執行自動裝配
  • 根據名稱自動裝配:必須將目標bean的名稱和屬性名設置的徹底相同

 

2.九、經過註解配置bean

相對於使用註解的方式實現的自動裝配,在XML文檔中進行的自動裝配略顯笨拙,在項目中更多的使用註解的方式實現。

 

1.普通組件:@Component

                   標識一個受Spring IOC容器管理的組件

2.持久化層組件:@Repository

標識一個受Spring IOC容器管理的持久化層組件

3.業務邏輯層組件:@Service

標識一個受Spring IOC容器管理的業務邏輯層組件

4.表述層控制器組件:@Controller

標識一個受Spring IOC容器管理的表述層控制器組件

組件命名規則

  1. 默認狀況:使用組件的簡單類名首字母小寫後獲得的字符串做爲beanid
  2. 使用組件註解的value屬性指定beanid

注意:事實上Spring並無能力識別一個組件究竟是不是它所標記的類型,@Respository@Service@Controller這幾個註解僅僅是爲了讓開發人員本身明確當前的組件扮演的角色。

組件掃描

組件被上述註解標識後還須要經過Spring進行掃描纔可以偵測到。

指定被掃描的package:

<context:component-scan base-package="類路徑"/>

組件裝配

Controller組件中每每須要用到Service組件的實例,Service組件中每每須要用到       Repository組件的實例。Spring能夠經過註解的方式幫咱們實現屬性的裝配。

@Autowired

  1. 根據類型實現自動裝配。
  2. 構造器、普通字段、一切具備參數的方法均可以應用@Autowired 註解
  3. 默認狀況下,全部使用@Autowired註解的屬性都須要被設置。當Spring找不到匹 配的bean裝配屬性時,會拋出異常。
  4. 若某一屬性容許不被設置,能夠設置@Autowired註解的required屬性爲 false
  5. 默認狀況下,當IOC容器裏存在多個類型兼容的bean時,Spring會嘗試匹配beanid值是否與變量名相同,若是相同則進行裝配。若是beanid值不相同,經過類型的自動裝配將沒法工做。此時能夠在@Qualifier註解裏提供bean的名稱。Spring甚至容許在方法的形參上標註@Qualifiter註解以指定注入bean的名稱。       
  6. @Autowired註解也能夠應用在數組類型的屬性上,此時Spring將會把全部匹配的bean進行自動裝配。
  7. @Autowired註解也能夠應用在集合屬性上,此時Spring讀取該集合的類型信息,而後自動裝配全部與之兼容的bean
  8. @Autowired註解用在java.util.Map上時,若該Map的鍵值爲String,那麼 Spring將自動裝配與值類型兼容的bean做爲值,並以beanid值做爲鍵。

@Resource

         @Resource註解要求提供一個bean名稱的屬性,若該屬性爲空,則自動採用標註處的變量或方法名做爲bean的名稱。

@Inject

@Inject@Autowired註解同樣也是按類型注入匹配的bean,但沒有reqired屬性。

相關文章
相關標籤/搜索