1. 程式人生 > >Spring快速筆記1

Spring快速筆記1

概述:

  • Spring的概述、SpringIOC入門(XML)、Spring的Bean管理、Spring屬性注入

  • Spring的IOC的註解方式、Spring的AOP開發(XML)

  • Spring的AOP的註解開發、Spring的宣告式事務、JdbcTemplate。

  • SSH的整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用。

1. Spring概述

輕量級的Java開源框架,與2003年興起。Spring是一個分層的Java SE/EE一站式(FullStack)輕量級的開源框架。Spring:SE/EE開發的一站式

框架。

  • 一站式框架:有EE開發的每一層解決方案。

    • WEB層 :SpringMVC

    • Service層 :Spring的Bean管理,Spring宣告式事務

    • DAO層 :Spring的Jdbc模板,Spring的ORM模組:hibernate,mybatis , jdbcTemplate
      –> spring-data

      img

  • 它是為了解決企業應用開發的複雜性而建立的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個元件,同時為 J2EE 應用程式開發提供整合的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和麵向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。

  • 輕量級:與EJB對比,依賴資源少,銷燬的資源少

  • Spring的核心:控制反轉(IoC)和麵向切面程式設計(AOP)

  • Spring的優勢:

    • 方便解耦,簡化開發 (高內聚低耦合)

      • Spring就是一個大工廠(容器),可以將所有物件建立和依賴關係維護,交給Spring管理

      • spring工廠是用於生成bean

    • AOP程式設計的支援

      • Spring提供面向切面程式設計,可以方便的實現對程式進行許可權攔截、執行監控等功能

    • 宣告式事務的支援

      • 只需要通過配置就可以完成對事務的管理,而無需手動程式設計

    • 方便程式的測試

      • Spring對Junit4支援,可以通過註解方便的測試Spring程式

    • 方便整合各種優秀框架

      • Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支援

    • 降低JavaEE API的使用難度

      • Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠端呼叫等),都提供了封裝,使這些API應用難度大大降低

  • Spring版本:3.x/4.x/5.x

 

2. 體系結構

1546928971185

1546929344283

 

3. IOC:控制反轉

Inversion of Control:將物件的建立權反轉給(交給)Spring,Spring就是一個大的容器、大工廠。

3.1 構建步驟:

建立工程->匯入JAR包(4核心+1個依賴)->配置檔案後原始碼中使用

3.2 工程

  • docs :Spring的開發規範和API——doc下有pdf版本文件:spring開發規範

  • libs :Spring的開發的jar和原始碼

  • schema :Spring的配置檔案的約束

img

3.3 為什麼使用IOC

與開發中的設計模式有關:從傳統的直接建立物件的模式,到“介面+實現類”的模式,再到簡單工廠模式;主要是在一步步進行程式模組間的解耦問題,而Spring是目前最優秀的解耦方式組織成的框架。Spring就是一個自動化的大工廠。

解耦的主要作用:OCP原則——對原始碼修改的關閉、對擴充套件的開放。尤其在大型專案組織中見效。

1546932254486

3.4 示例

  • 使用Spring來進行簡單工廠的代替,通過配置檔案,Spring能夠解析XMl檔案並使用底層的反射機制進行例項的生產。

  • Spring採用Schema形式的xml配置檔案,一般開發中直接在SRC目錄下,慣例命名為applicationContext.xml。基本的配置,名稱空間等可以在spring解析目錄下的\docs\spring-framework-reference\html\xsd-configuration.html找到。

    <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 -->
    	<bean id="userDao" class="com.leehao.springlearning.spring1.UserDaoImpl"></bean> 
    </beans>
    --------------------------------------------------------------------------------
    public void demo1(){
        //解析配置檔案
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        //直接獲取bean
        UserDao userDao = applicationContext.getBean(UserDao.class);
        userDao.save();
    }
    

3.5 IOC和DI

​ IOC就是把控制權交給spring,類的例項通過其去構造。而DI則是在IOC的條件前提下,Spring管理當前類時,可以把與之依賴的屬性注入(設定)到當前物件中。

 

 

4. Spring的工廠類

Spring的兩個工廠類BeanFactory和ApplicationContext,是兩個不同的版本,ApplicationContext繼承BeanFactory。

img

  • Bean載入的兩種情形:

    • 使用BeanFactory,慢載入過程;在第一次呼叫Bean時才會新建物件

    • 使用ApplicationContext,載入完xml檔案後,即刻初始化物件。

    • ApplicationContext有兩個實現類

      • ClassPathXmlApplicationContext :載入類路徑下src的配置檔案

      • FileSystemXmlApplicationContext :載入檔案系統下的配置檔案

 

5. Spring 的配置

5.1 Bean配置

  • ID和Name:

    • id :使用了約束中的唯一約束。裡面不能出現特殊字元的。

    • name :沒有使用約束中的唯一約束(理論上可以出現重複的,但是實際開發不能出現的)。裡面可以出現特殊字元。n Spring和Struts1框架整合的時候使用:<bean name="/user" class=""/>

  • 生命週期:

    • init-method :Bean被初始化的時候執行的方法

    • destroy-method :Bean被銷燬的時候執行的方法(Bean是單例建立的,關閉工廠的例項時會觸發;多例時不會觸發)

  • Bean的作用範圍

    • scope:Bean的作用範圍,5個取值;
      • singleton :預設的,Spring會採用單例模式建立這個物件。
      • prototype :多例模式。(Struts2和Spring整合一定會用到)
      • request :應用在web專案中,Spring建立這個類以後,將這個類存入到request範圍中
      • session :應用在web專案中,Spring建立這個類以後,將這個類存入到session範圍中
      • globalsession :應用在web專案中,必須在porlet環境下使用(如百度和百度地圖的子網站等)。但是如果沒有這種環境,相當於session。

 

5.2 屬性注入

  • 使用構造方式的注入——xml

  • 使用set方法的注入——xml

    <bean id="car" class="com.leehao.springlearning.DI.Car" >
        <property name="name" value="BMW"></property>
        <property name="price">
            <value>100000</value>
        </property>
    </bean>	
    <bean id="user" class="com.leehao.springlearning.DI.User">
        <constructor-arg name="name" value="真三"></constructor-arg>
        <constructor-arg name="car" ref="car"></constructor-arg>
    </bean>
    
  • 使用帶名稱空間的方式注入——xml

    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:p="http://www.springframework.org/schema/p"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    <!-- 使用名稱空間p -->
    <bean id="car2" class="com.leehao.springlearning.DI.Car" p:name="QQ" p:price="1000"/>
    
  • SpEL(Spring Expression Language)的方式注入:去除了value-ref,所有的屬性全都使用name和value兩個標籤決定。在SpEL中,value的值使用#{SpEl}的方式複製,可以是常量、表示式、操作、Bean物件和其他物件等。<property name="" value="#{表示式}">

    • #{123}、#{‘jack’} : 數字、字串

    • #{beanId} :另一個bean引用

    • #{beanId.propName} :操作資料

    • #{beanId.toString()} :執行方法

    • #{T(類).欄位|方法} :靜態方法或欄位

    <!-- SpEL -->
    <bean id="car3" class="com.leehao.springlearning.DI.Car" >
        <property name="name" value="#{'TT'}"></property>
        <property name="price" value="#{200+300}"></property>
    </bean>
    <bean id="car4" class="com.leehao.springlearning.DI.Car">
        <property name="name" value="#{user.name}"></property>
    </bean>
    

 

5.3 集合屬性的注入

  • 集合注入:在xml中的property加入子標籤,可以注入set/list/map等集合屬性

    • property中普通資料標籤<value>
    • 引用資料標籤<ref>
    <!-- 集合型別的注入 -->
    <bean id="collectionBean" class="com.leehao.springlearning.DI.CollectionBean">
        <!-- list和陣列一樣 -->
        <property name="stus">
            <list>
                <value>張三</value>
                <value>李四</value>
            </list>
        </property>
        <property name="list">
            <list>
                <value>AAAAA</value>
                <value>BBBBB</value>
            </list>
        </property>
        <property name="mySet">
            <set>
                <value>你好</value>
                <value>當然</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="aaa" value="888"/>
                <entry key="bbb" value="999"/>
            </map>
        </property>	
    </bean>
    

5.4 Spring建立Bean的三種方式

  • 預設工廠、靜態工廠、例項工廠

    • 預設工廠,Spring就是一個大工廠、大容器;預設使用無參的建構函式進行。這種方式,Bean必須含有無參的建構函式

      <!-- 配置Bean -->
      <bean id="userDao" class="com.leehao.springlearning.spring1.UserDaoImpl"/> 
      ---------------------------------------------------------------------------
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
      UserDao userDao = (UserDao) applicationContext.getBean("userDao");
      userDao.save();
      
    • 靜態工廠,常用與spring整合其他框架(工具)。值得注意的是,一旦在spring中配置了靜態工廠,所有的獲取Bean都會通過靜態工廠的工廠方法去建立,沒有則返回null。

      <!-- 靜態工廠 -->
      <bean id="userDao2" class="com.leehao.springlearning.factory.StaticFactory" factory-method="createUserDao"/>
      ---------------------------------------------------------------------------
      public class StaticFactory {
      	public static UserDao createUserDao() {
      		System.out.println("Static Factory...");
      		return new UserDaoImpl();
      	}
      }
      
    • 例項工廠,必須先有工廠例項物件,通過例項物件建立物件。提供所有的方法都是“非靜態”的。

      public class InstanceFactory {
      	/**
      	 * 例項工廠,不再是static的方法建立新物件
      	 */
      	public UserDao createUserDao() {
      		System.out.println("instance ....");
      		return new UserDaoImpl();
      	}
      }
      --------------------------------------------------------------------
      <!-- 例項工廠 -->
      	<bean id="myfac" class="com.leehao.springlearning.factory.InstanceFactory" />
      	<bean id="userDao3" factory-bean="myfac" factory-method="createUserDao" />
      
    • 實驗中發現,其實使用ClassXMLPathApplicationContext進行初始化的時候,無論是靜態工廠、還是例項工廠,都會被解析完然後去實現。在解析完xml檔案後,能夠看到已經建立了各種工廠方法已經被執行了。

  • Bean的種類:普通、FactoryBean和BeanFactory

    • 普通:<id= ,calss=A>,spring直接給建立A的例項,並返回
    • BeanFactory生產任意的bean,是一個工廠類
    • FactoryBean是一個特定的Bean,只生產某一特定的物件例項。Bean必須實現Factorybean介面,提供Getobject方法返回特定的bean. <id, class=FB> 建立FB例項,呼叫getObject,返回方法返回值。例如ProxyFactoryBean

 

5.5 Spring的分模組開發

和struts等框架一樣,Spring也可以分模組各自開發,具有不同的xml檔案,在總的applicationContext.xml檔案中引入各個模組即可。

  • 方式一:使用時,可以使用ApplicationContext工廠,載入多個xml檔案進行初始化

  • 方式二:多個檔案引用到一個最終載入的檔案中,使用import:<import resource="com/application2.xml"/>