1. 程式人生 > >Spring第一天:Spring的概述、SpringIOC入門(XML)、Spring的Bean管理、Spring屬性注入

Spring第一天:Spring的概述、SpringIOC入門(XML)、Spring的Bean管理、Spring屬性注入

以前也學習過Spring框架,不過好久沒用,當時學完也沒做什麼總結,都忘的差不多了,今天再從頭開始學習一遍。無論是SSH還是SSM都離不開Spring,所以Spring還是很重要的,對於一個想要從事JavaEE開發的人,一定要好好學習Spring框架。Spring的學習計劃如下:

  1. 第一天:Spring的概述、SpringIOC入門(XML)、Spring的Bean管理、Spring屬性注入
  2. 第二天:Spring的IOC的註解方式、Spring的AOP開發(XML)
  3. 第三天:Spring的AOP的註解開發、Spring的宣告式事務、JdbcTemplate。
  4. 第四天:SSH的整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用。

目錄

1.Spring的概述

1.1Spring的概述

1.1.1什麼是Spring

1.1.2為什麼學習Spring

1.1.3Spring的版本

1.2Spring的入門(IOC)

1.2.1什麼IOC

1.2.2下載Spring的開發包

1.2.3解壓Spring的開發包

1.2.4建立web專案,引入jar包

1.2.5建立介面和類

1.2.6將實現類交給Spring管理

1.2.7編寫測試類

1.2.8IOC和DI(*****)

2Spring的工廠類

2.1Spring工廠類的結構圖

2.2BeanFactory:老版本的工廠類

2.3ApplicationContext:新版本的工廠類

3Spring的配置

3.1XML的提示配置

3.2Bean的相關的配置

3.2.1標籤的id和name的配置

3.2.2Bean的生命週期的配置(瞭解)

3.2.3Bean的作用範圍的配置(重點)

4.Spring的Bean管理(XML方式)

4.1Spring的Bean的例項化方式(瞭解)

4.1.1無參構造方法的方式(預設)

4.1.2靜態工廠例項化的方式

4.1.3例項工廠例項化的方式

4.2Spring的屬性注入

4.2.1構造方法的方式的屬性注入

4.2.2Set方法的方式的屬性注入

4.2.3P名稱空間的屬性注入(Spring2.5以後)

4.2.4SpEL的屬性注入(Spring3.0以後)

4.3集合型別屬性注入(瞭解)

5.Spring的分模組開發的配置

5.1在載入配置檔案的時候,載入多個

5.2在一個配置檔案中引入多個配置檔案


 

 

1.Spring的概述

1.1Spring的概述

1.1.1什麼是Spring

Spring是一個開放原始碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向介面的程式設計思想貫穿整個系統應用。Spring是於2003 年興起的一個輕量級的Java 開發框架,由Rod Johnson建立。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。

 

  • Spring:JavaSE/EE開發的一站式框架。
    • 一站式框架:JavaSE/EE開發的每一層的解決方案。
      • WEB層             :SpringMVC
      • Service層         :Spring的Bean管理,Spring宣告式事務
      • DAO層              :Spring的Jdbc模板,Spring的ORM模組

1.1.2為什麼學習Spring

輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小隻有1MB多的JAR檔案裡釋出。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的物件不依賴於Spring的特定類。

控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了低耦合。當應用了IoC,一個物件依賴的其它物件會通過被動的方式傳遞進來,而不是這個物件自己建立或者查詢依賴物件。你可以認為IoCJNDI相反——不是物件從容器中查詢依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它。

面向切面——Spring提供了面向切面程式設計的豐富支援,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務transaction)管理)進行內聚性的開發。應用物件只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支援。

容器——Spring包含並管理應用物件的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被建立——基於一個可配置原型(prototype),你的bean可以建立一個單獨的例項或者每次需要時都生成一個新的例項——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。

框架——Spring可以將簡單的元件配置、組合成為複雜的應用。在Spring中,應用物件被宣告式地組合,典型地是在一個XML檔案裡。Spring也提供了很多基礎功能(事務管理、持久化框架整合等等),將應用邏輯的開發留給了你。

MVC——Spring的作用是整合,但不僅僅限於整合,Spring 框架可以被看做是一個企業解決方案級別的框架。客戶端傳送請求,伺服器控制器(由DispatcherServlet實現的)完成請求的轉發,控制器呼叫一個用於對映的類HandlerMapping,該類用於將請求對映到對應的處理器來處理請求。HandlerMapping 將請求對映到對應的處理器Controller(相當於Action)在Spring 當中如果寫一些處理器元件,一般實現Controller 介面,在Controller 中就可以呼叫一些Service DAO 來進行資料操作 ModelAndView 用於存放從DAO 中取出的資料,還可以存放響應檢視的一些資料。 如果想將處理結果返回給使用者,那麼在Spring 框架中還提供一個檢視元件ViewResolver,該元件根據Controller 返回的標示,找到對應的檢視,將響應response 返回給使用者。

所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的程式碼。它們也為Spring中的各種模組提供了基礎支援。

 

1.1.3Spring的版本

Spring3.x和Spring4.x,今天學習Spring4.x

1.2Spring的入門(IOC)

1.2.1什麼IOC

  • IOC: Inversion of Control(控制反轉)。
    • 控制反轉:將物件的建立權反轉給(交給)Spring。

1.2.2下載Spring的開發包

官網:http://spring.io/

1.2.3解壓Spring的開發包

  • docs           :Spring的開發規範和API
  • libs              :Spring的開發的jar和原始碼
  • schema     :Spring的配置檔案的約束

1.2.4建立web專案,引入jar包

1.2.5建立介面和類


 

package com.albertyy.spring.demo1;

/**

 * 使用者管理DAO層介面

 * @author yxy

 *

 */

public interface UserDAO {

    public void save();

}



package com.albertyy.spring.demo1;

/**

 * 使用者管理DAO層實現類

 * @author yxy

 *

 */

public class UserDAOImpl implements UserDAO {

     private String name;



     public void setName(String name) {

         this.name = name;

     }



     @Override

     public void save() {

         System.out.println("UserDAOImpl執行了..."+name);

     }



}

  • 問題:
    • 如果底層的實現切換了,需要修改原始碼,能不能不修改程式原始碼對程式進行擴充套件呢?

1.2.6將實現類交給Spring管理

在spring的解壓路徑下:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html

 

在專案src路徑下面新建applicationContext.xml配置檔案:


<?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">



     <!-- Spring的入門的配置==================== -->

     <bean name="userDAO" class="com.albertyy.spring.demo1.UserDAOImpl">

         <property name="name" value="李慢慢" />

     </bean>





</beans>

1.2.7編寫測試類


@Test

    /**

     * 傳統方式的呼叫

     */

    public void demo1(){

       UserDAOImpl userDAO = new UserDAOImpl();

       userDAO.setName("王婉瑜");

       userDAO.save();

    }

   

    @Test

    /**

     * Spring的方式的呼叫

     */

    public void demo2(){

       // 建立Spring的工廠

       ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

       UserDAO userDAO = (UserDAO) applicationContext.getBean("userDAO");

       userDAO.save();

    }

1.2.8IOCDI*****

  1. IOC:控制反轉,將物件的建立權反轉給了Spring。
    • DI:依賴注入,前提必須有IOC的環境,Spring管理這個類的時候將類依賴的屬性注入(設定)進來。
  2. 面向物件的時候類和類的關係

            依賴

Class A{



}



Class B{

     public void xxx(A a){



       }

}

 

繼承:(is a)

 

Class A{



}

Class B extends A{



}

 

聚合:(has a)

 

2Spring的工廠類

2.1Spring工廠類的結構圖

ApplicationContext繼承BeanFactory。

2.2BeanFactory:老版本的工廠類

BeanFactory:呼叫getBean的時候,才會生成類的例項。

2.3ApplicationContext:新版本的工廠類

  • ApplicationContext:載入配置檔案的時候,就會將Spring管理的類都例項化。
  • ApplicationContext有兩個實現類
    • ClassPathXmlApplicationContext :載入類路徑下的配置檔案
    • FileSystemXmlApplicationContext  :載入檔案系統下的配置檔案
  •  

 

3Spring的配置

3.1XML的提示配置

3.2Bean的相關的配置

3.2.1<bean>標籤的id和name的配置

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

3.2.2Bean的生命週期的配置(瞭解)

  1. init-method                 :Bean被初始化的時候執行的方法
  2. destroy-method        :Bean被銷燬的時候執行的方法(Bean是單例建立,工廠關閉)

<!-- Spring的sBean的生命週期的配置=========== -->

     <bean id="customerDAO" class="com.albertyy.spring.demo2.CustomerDAOImpl" scope="prototype" init-method="setup" destroy-method="destroy"/>

    

3.2.3Bean的作用範圍的配置(重點)

  • scope:Bean的作用範圍
    • singleton                   :預設的,Spring會採用單例模式建立這個物件。
    • prototype        :多例模式。(Struts2Spring整合一定會用到)
    • request             :應用在web專案中,Spring建立這個類以後,將這個類存入到request範圍中。
    • session              :應用在web專案中,Spring建立這個類以後,將這個類存入到session範圍中。
    • globalsession   :應用在web專案中,必須在porlet環境下使用。但是如果沒有這種環境,相對於session。

 

 

4.Spring的Bean管理(XML方式)

4.1Spring的Bean的例項化方式(瞭解)

Bean已經都交給Spring管理,Spring建立這些類的時候,有幾種方式:

4.1.1無參構造方法的方式(預設)

  1. 編寫類


 

package com.albertyy.spring.demo3;

/**

 * 無引數構造方法方式

 * @author yxy

 *

 */

public class Bean1 {



     public Bean1() {

         super();

         System.out.println("Bean1的無引數的構造方法執行了...");

     }



}

  1. 編寫配置

 

<!-- 無參構造方法 -->

    <bean id="bean1" class="com.albertyy.spring.demo3.Bean1"></bean>

 

 

4.1.2靜態工廠例項化的方式

  1. 編寫Bean2的靜態工廠

package com.albertyy.spring.demo3;

/**

 * Bean2的靜態工廠

 * @author yxy

 *

 */

public class Bean2Factory {



     public static Bean2 createBean2(){

         System.out.println("Bean2Factory中方法執行了...");

         return new Bean2();

     }

}

  1. 配置

 

<!-- 靜態工廠例項化 -->

     <bean id="bean2" class="com.albertyy.spring.demo3.Bean2Factory" factory-method="createBean2"></bean>

    

 

4.1.3例項工廠例項化的方式

  1. Bean3的例項工廠


 

package com.albertyy.spring.demo3;

/**

 * Bean3的例項工廠

 * @author yxy

 *

 */

public class Bean3Factory {



     public Bean3 createBean3(){

         System.out.println("Bean3的例項工廠執行了...");

         return new Bean3();

     }

}

  1. 配置

<!-- 例項工廠例項化 -->

<bean id="bean3Factory" class="com.albertyy.spring.demo3.Bean3Factory" ></bean>

<bean id="bean3" factory-bean="bean3Factory"  factory-method="createBean3" ></bean>

 

4.2Spring的屬性注入

4.2.1構造方法的方式的屬性注入

  1. 構造方法的屬性注入

<!-- 構造方法的方式 -->

     <bean id="car" class="com.albertyy.spring.demo4.Car">

         <constructor-arg name="name" value="寶馬"/>

         <constructor-arg name="price" value="800000"/>

     </bean>

4.2.2Set方法的方式的屬性注入

  1. Set方法的屬性注入

<!-- set方法的方式 -->

     <bean id="car2" class=" com.albertyy.spring.demo4.Car2">

         <property name="name" value="賓士"/>

         <property name="price" value="1000000"/>

     </bean>

 

  1. Set方法設定物件型別的屬性


 


<!-- set方法注入物件型別的屬性 -->

     <bean id="employee" class=" com.albertyy.spring.demo4.Employee">

         value:設定普通型別的值,ref:設定其他的類的id或name

         <property name="name" value="濤哥"/>

         <property name="car2" ref="car2"/>

     </bean>

4.2.3P名稱空間的屬性注入(Spring2.5以後)

  • 通過引入p名稱空間完成屬性的注入:
    • 寫法:
      • 普通屬性         p:屬性名=”值”
      • 物件屬性         p:屬性名-ref=”值”
  • P名稱空間的引入
  1. 使用p名稱空間

<!-- 改為p名稱空間的方式 -->

     <bean id="car2" class=" com.albertyy.spring.demo4.Car2" p:name="奇瑞QQ" p:price="30000"></bean>

    

     <bean id="employee" class=" com.albertyy.spring.demo4.Employee" p:name="王東" p:car2-ref="car2"></bean>

    

4.2.4SpEL的屬性注入(Spring3.0以後)

  • SpEL:Spring Expression Language,Spring的表示式語言。
    • 語法:
      • #{SpEL}

<!-- SpEL的屬性注入 -->

     <bean id="carInfo" class="com.albertyy.spring.demo4.CarInfo">

     </bean>

    

     <bean id="car2" class="com.albertyy.spring.demo4.Car2">

         <property name="name" value="#{carInfo.name}"></property>

         <property name="price" value="#{carInfo.calculatorPrice()}"></property>

     </bean>

    

     <bean id="employee" class="com.albertyy.spring.demo4.Employee">

         <property name="name" value="#{'趙洪'}"></property>

         <property name="car2" value="#{car2}"></property>

     </bean>

4.3集合型別屬性注入(瞭解)

   

 <!-- Spring的集合屬性的注入============================ -->

    <!-- 注入陣列型別 -->

    <bean id="collectionBean" class="com.albertyy.spring.demo5.CollectionBean">

        <!-- 陣列型別 -->

        <property name="arrs">

            <list>

                <value>王東</value>

                <value>趙洪</value>

                <value>李冠希</value>

            </list>

        </property>

       

        <!-- 注入list集合 -->

        <property name="list">

            <list>

                <value>李兵</value>

                <value>趙如何</value>

                <value>鄧鳳</value>

            </list>

        </property>

       

        <!-- 注入set集合 -->

        <property name="set">

            <set>

                <value>aaa</value>

                <value>bbb</value>

                <value>ccc</value>

            </set>

        </property>

       

        <!-- 注入Map集合 -->

        <property name="map">

       

            <map>

                <entry key="aaa" value="111"/>

                <entry key="bbb" value="222"/>

                <entry key="ccc" value="333"/>

            </map>

        </property>

    </bean>

 

 

5.Spring的分模組開發的配置

5.1在載入配置檔案的時候,載入多個


 

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");

5.2在一個配置檔案中引入多個配置檔案

 

<import resource="applicationContext2.xml"/>   

 

 

原始碼:連結: https://pan.baidu.com/s/1RKJ5Cd1XokL-rRpgIdFjkg 提取碼: 7vv2 複製這段內容後開啟百度網盤手機App,操作更方便哦