spring知識回顧

嗯,又要開始......了

一、前言

1.1 Spring的概述
1.1.1 什么是Spring
  • Spring:SE/EE開發(fā)的一站式框架。
    • 一站式框架:有EE開發(fā)的每一層解決方案。
    • WEB層 :SpringMVC
    • Service層 :Spring的Bean管理,Spring聲明式事務(wù)
    • DAO層 :Spring的Jdbc模板,Spring的ORM模塊
1.1.2 為什么學(xué)習(xí)Spring
1.1.3 Spring的版本

Spring3.x、Spring4.x、Spring5.x

二、入門

2.1 Spring的入門(IOC)
2.1.1 什么是IOC
  • IOC: Inversion of Control(控制反轉(zhuǎn))。
  • 控制反轉(zhuǎn):將對象的創(chuàng)建權(quán)反轉(zhuǎn)給(交給)Spring。
2.1.2 下載Spring的開發(fā)包

官網(wǎng):http://spring.io/

2.1.3 解壓Spring的開發(fā)包
  • docs :Spring的開發(fā)規(guī)范和API
  • libs :Spring的開發(fā)的jar和源碼
  • schema :Spring的配置文件的約束
2.1.4 創(chuàng)建web項目,引入jar包

2.1.5 創(chuàng)建接口和類

  • 如果底層的實現(xiàn)切換了,需要修改源代碼,能不能不修改程序源代碼對程序進行擴展?


2.1.6 將實現(xiàn)類交給Spring管理

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


2.1.7 編寫測試類
2.1.8 IOC和DI
  • IOC:控制反轉(zhuǎn),將對象的創(chuàng)建權(quán)反轉(zhuǎn)給了Spring。
    • DI:依賴注入,前提必須有IOC的環(huán)境,Spring管理這個類的時候?qū)㈩惖囊蕾嚨膶傩宰⑷耄ㄔO(shè)置)進來。
  • 面向?qū)ο蟮臅r候
    • 依賴
  Class A{
  }

  Class B{
    public void xxx(A a){
    }
  }
  • 繼承:is a
  Class A{
  }
  Class B extends A{
  }
  • 聚合:has a
3.1 Spring的工廠類
3.1.1 Spring工廠類的結(jié)構(gòu)圖
  • ApplicationContext繼承BeanFactory。
3.1.2 新老版本工廠類
  1. BeanFactory:調(diào)用getBean的時候,才會生成類的實例。(老)
  2. ApplicationContext:加載配置文件的時候,就會將Spring管理的類都實例化。
    ApplicationContext有兩個實現(xiàn)類
    ClassPathXmlApplicationContext :加載類路徑下的配置文件
    FileSystemXmlApplicationContext :加載文件系統(tǒng)下的配置文件
4.1 Spring的配置
4.1.1 Bean的相關(guān)的配置
  1. <bean>標簽的id和name的配置
  • id :使用了約束中的唯一約束。里面不能出現(xiàn)特殊字符的。
  • name :沒有使用約束中的唯一約束(理論上可以出現(xiàn)重復(fù)的,但是實際開發(fā)不能出現(xiàn)的)。里面可以出現(xiàn)特殊字符。
    • Spring和Struts1框架整合的時候
    • <bean name=”/user” class=””/>
  1. Bean的生命周期的配置(了解)
  • init-method :Bean被初始化的時候執(zhí)行的方法
  • destroy-method :Bean被銷毀的時候執(zhí)行的方法(Bean是單例創(chuàng)建,工廠關(guān)閉)
  1. Bean的作用范圍的配置(重點)
  • scope :Bean的作用范圍
    • singleton :默認的,Spring會采用單例模式創(chuàng)建這個對象。
    • prototype :多例模式。(Struts2和Spring整合一定會用到)
    • request :應(yīng)用在web項目中,Spring創(chuàng)建這個類以后,將這個類存入到request范圍中。
    • session :應(yīng)用在web項目中,Spring創(chuàng)建這個類以后,將這個類存入到session范圍中。
    • globalsession :應(yīng)用在web項目中,必須在porlet環(huán)境下使用。但是如果沒有這種環(huán)境,相對于session。
4.2 Spring的Bean的管理(XML方式)
4.2.1 Spring的Bean的實例化方式

Bean已經(jīng)都交給Spring管理,Spring創(chuàng)建這些類的時候,有幾種方式

  1. 無參構(gòu)造方法的方式(默認)



  2. 靜態(tài)工廠實例化的方式



  3. 實例工廠實例化的方式



4.2.2 Spring的屬性注入
  1. 構(gòu)造方法的方式的屬性注入


  2. Set方法的方式的屬性注入



  3. P名稱空間的屬性的注入(Spring2.5以后)
  • 通過引入p名稱空間完成屬性的注入
    寫法:
    普通屬性 p:屬性名=”值”
    對象屬性 p:屬性名-ref=”值”
  • p名稱空間的引入


  • 使用p名稱空間


  1. SpEL的屬性注入(Spring3.0以后)
    SpEL:Spring Expression Language,Spring的表達式語言。
    語法:#{SpEL}


4.2.3 集合類型屬性注入(了解)
<!-- Spring的集合屬性的注入============================ -->
    <!-- 注入數(shù)組類型 -->
    <bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
        <!-- 數(shù)組類型 -->
        <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>

4.3 Spring的分模塊開發(fā)的配置
4.3.1 在加載配置文件的時候,加載多個
4.3.2 在一個配置文件中引入多個配置文件

三、Spring IOC及AOP

3.1 Spring的IOC的注解開發(fā)
3.1.1 入門
  1. 創(chuàng)建web項目,引入jar包
  • 在Spring4的版本中,除了引入基本的開發(fā)包以外,還需要引入aop的包


  1. 引入Spring的配置文件
  • 在src下創(chuàng)建applicationContext.xml
    • 引入約束:使用注解開發(fā)引入context約束
    • 約束:spring-framework-4.2.4.RELEASE/docs/spring-framework-reference/html/xsd-configuration.html


  1. 創(chuàng)建接口及實現(xiàn)類
  2. 開啟Spring的組件掃描


  3. 在類上添加注解


  4. 編寫測試類


  5. 注解方式設(shè)置屬性的值
  • 注解方式
    :使用注解方式,可以沒有set方法的。
    • 屬性如果有set方法,需要將屬性注入的注解添加到set方法
    • 屬性如果沒有set方法,需要將屬性注入的注解添加屬性上。


3.1.2 Spring的IOC的注解的詳解
  1. @Component:組件
  • 修飾一個類,將這個類交給Spring管理
  • 這個注解有三個衍生注解(功能類似)
    • @Controller:web層
    • @Service:service層
    • @Repository:dao層
  1. 屬性注入的注解
  • 普通屬性:
    • @Value:設(shè)置普通屬性的值。
  • 對象類型屬性:
    • @Autowired:設(shè)置對象類型的屬性的值。默認是按照類型完成屬性注入(名稱是誰無所謂)
      • 我們習(xí)慣是按照名稱完成屬性注入:必須讓@Autowired注解和@Qualifier注解同時使用



  • @Resource:完成對象類型的屬性的注入,按照名稱完成屬性注入。(默認是按照類型)


  1. Bean的其它的注解
  • 生命周期相關(guān)的注解(了解)
    • @PostConstruct:init-method
    • @PreDestroy:destroy-method
  • Bean作用范圍的注解
    • @Scope:作用范圍
      • singleton:默認單例
      • prototype:多例
      • request
      • session
      • globalsession
  1. XML和注解的比較
  • 適用場景
    • XML:可以使用任何場景
      • 結(jié)構(gòu)清晰,維護方便
    • 注解:有些地方用不了,這個類不是自己提供的。
      • 開發(fā)方便。
  1. XML和注解整合開發(fā)
  • XML管理Bean,注解完成屬性注入。
3.2 Spring的AOP的XML開發(fā)
3.2.1 AOP的概述
  1. 什么是AOP



    AOP:面向切面編程。AOP是OOP的擴展和延伸,解決OOP開發(fā)遇到的問題。

  2. Spring底層的AOP實現(xiàn)原理

  • 動態(tài)代理
    • JDK動態(tài)代理:只能對實現(xiàn)了接口的類產(chǎn)生代理。
    • Cglib動態(tài)代理(類似于Javascript第三方代理技術(shù)):對沒有實現(xiàn)接口的類產(chǎn)生代理對象。生成子類對象。
3.2.2 Spring的AOP底層實現(xiàn)(了解)
  1. JDK動態(tài)代理



  2. Cglib動態(tài)代理



3.2.3 Spring的AOP的開發(fā)(AspectJ的XML的方式)
  1. Spring的AOP的簡介
  • AOP思想最早是由AOP聯(lián)盟組織提出的。Spring使用這種思想最好的框架
    • Spring的AOP有自己實現(xiàn)的方式(非常繁瑣)。AspectJ是一個AOP的框架,Spring引入AspectJ作為自身AOP的開發(fā)。
    • Spring兩套AOP開發(fā)方式
      • Spring傳統(tǒng)方式(棄用)
      • Spring基于AspectJ的AOP開發(fā)(使用)
  1. AOP開發(fā)中相關(guān)術(shù)語:


3.2.4 Spring的AOP的入門(AspectJ的XML的方式)
  1. 創(chuàng)建web項目,引入jar包
  • 引入基本開發(fā)包
  • 引入aop開發(fā)相關(guān)jar包


  1. 引入Spring的配置文件
  • 引入aop的約束


  1. 編寫目標類并完成配置


  2. 編寫測試類:
  • Spring整合Junit單元測試


  1. 編寫一個切面


  2. 將切面類交給Spring


  3. 通過AOP的配置實現(xiàn)


3.2.5 Spring中通知類型
  1. 前置通知:在目標方法執(zhí)行之前進行操作
  • 前置通知:獲得切入點信息



  1. 后置通知:在目標方法執(zhí)行之后進行操作
  • 后置通知:獲得方法的返回值。




  1. 環(huán)繞通知:在目標方法執(zhí)行之前和之后進行操作



  • 環(huán)繞通知可以阻止目標方法的執(zhí)行


  1. 異常拋出通知:在程序出現(xiàn)異常的時候,進行的操作



  2. 最終通知:無論代碼是否有異常,總是會執(zhí)行



  3. 引介通知(不用會)

3.2.6 Spring的切入點表達式寫法:
  1. 切入點表達式語法:
  • 基于execution的函數(shù)完成的
  • 語法(public可省略)
    • [訪問修飾符] 方法返回值 包名.類名.方法名(參數(shù))
public void com.tong.spring.CustomerDao.save(..)
* *.*.*.*Dao.save(..)
* com.tong.spring.CustomerDao+.save(..) 當前類及其子類都可以
* com.tong.spring..*.*(..) 這個包及其子包下的所有類所有方法
3.3 Spring的AOP的基于AspectJ注解開發(fā)
3.3.1 Spring的基于ApsectJ的注解的AOP開發(fā)
  1. 創(chuàng)建項目,創(chuàng)建jar包


  2. 引入配置文件
  3. 編寫目標類并配置


  4. 編寫切面類并配置



  5. 使用注解的AOP對象目標類進行增強
  • 在配置文件中打開注解的AOP開發(fā)


  • 在切面類上使用注解


  1. 編寫測試類


3.3.2 Spring的注解的AOP的通知類型
  1. @Before :前置通知


  2. @AfterReturning :后置通知


  3. @Around :環(huán)繞通知


  4. @AfterThrowing :異常拋出通知


  5. @After :最終通知


3.3.3 Spring的注解的AOP的切入點的配置


四、Spring JDBC模板及事務(wù)管理

4.1 Spring的JDBC的模板的使用
4.1.1 Spring的JDBC的模板

Spring是EE開發(fā)的一站式的框架,有EE開發(fā)的每層的解決方案。Spring對持久層也提供了解決方案:ORM模塊和JDBC的模板。
Spring提供了很多的模板用于簡化開發(fā):


  1. JDBC模板使用的入門
  • 創(chuàng)建項目,引入jar包
  • 引入基本開發(fā)包:
  • 數(shù)據(jù)庫驅(qū)動
  • Spring的JDBC模板的jar包


  1. 創(chuàng)建數(shù)據(jù)庫和表
create database spring4_day03;
use spring4_day03;
create table account(
    id int primary key auto_increment,
    name varchar(20),
    money double
);

  1. 使用JDBC的模板:保存數(shù)據(jù)


4.1.2 將連接池和模板交給Spring管理
  1. 引入Spring的配置文件


  2. 使用Jdbc的模板

  • 引入spring_aop的jar包


4.1.3 使用開源的數(shù)據(jù)庫連接池:
  1. DBCP的使用
  • 引入jar包


  • 配置DBCP連接池


  1. C3P0的使用
  • 引入c3p0連接池jar包


  • 配置c3p0連接池


4.1.4 抽取配置到屬性文件
  1. 定義一個屬性文件


  2. 在Spring的配置文件中引入屬性文件
  • 第一種


  • 第二種(推薦,無需找類)


  1. 引入屬性文件的值


  2. 測試


4.1.5 使用JDBC的模板完成CRUD的操作
  1. 保存操作


  2. 修改操作


  3. 刪除操作


  4. 查詢操作

  • 查詢某個屬性


  • 查詢返回對象或集合


  • 數(shù)據(jù)封裝


4.2 Spring的事務(wù)管理
4.2.1 事務(wù)的回顧
  1. 什么是事務(wù)
    事務(wù):邏輯上的一組操作,組成這組操作的各個單元,要么全都成功,要么全都失敗。
  2. 事務(wù)的特性
  • 原子性:事務(wù)不可分割
  • 一致性:事務(wù)執(zhí)行前后數(shù)據(jù)完整性保持一致
  • 隔離性:一個事務(wù)的執(zhí)行不應(yīng)該受到其他事務(wù)的干擾
  • 持久性:一旦事務(wù)結(jié)束,數(shù)據(jù)就持久化到數(shù)據(jù)庫
  1. 如果不考慮隔離性引發(fā)安全性問題
  • 讀問題
    • 臟讀 :一個事務(wù)讀到另一個事務(wù)未提交的數(shù)據(jù)
    • 不可重復(fù)讀 :一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的update的數(shù)據(jù),導(dǎo)致一個事務(wù)中多次查詢結(jié)果不一致
    • 虛讀、幻讀 :一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的insert的數(shù)據(jù),導(dǎo)致一個事務(wù)中多次查詢結(jié)果不一致。
  • 寫問題
    • 丟失更新
  1. 解決讀問題
    設(shè)置事務(wù)的隔離級別
  • Read uncommitted :未提交讀,任何讀問題解決不了。
  • Read committed :已提交讀,解決臟讀,但是不可重復(fù)讀和虛讀有可能發(fā)生。*
  • Repeatable read :重復(fù)讀,解決臟讀和不可重復(fù)讀,但是虛讀有可能發(fā)生。*
  • Serializable :解決所有讀問題。
4.2.2 Spring的事務(wù)管理的API
  1. PlatformTransactionManager:平臺事務(wù)管理器
    平臺事務(wù)管理器:接口,是Spring用于管理事務(wù)的真正的對象。
  • DataSourceTransactionManager :底層使用JDBC管理事務(wù)
  • HibernateTransactionManager :底層使用Hibernate管理事務(wù)
  1. TransactionDefinition :事務(wù)定義信息
    事務(wù)定義:用于定義事務(wù)的相關(guān)的信息,隔離級別、超時信息、傳播行為、是否只讀
  2. TransactionStatus:事務(wù)的狀態(tài)
    事務(wù)狀態(tài):用于記錄在事務(wù)管理過程中,事務(wù)的狀態(tài)的對象。
  3. 事務(wù)管理的API的關(guān)系:
    Spring進行事務(wù)管理的時候,首先平臺事務(wù)管理器根據(jù)事務(wù)定義信息進行事務(wù)的管理,在事務(wù)管理過程中,產(chǎn)生各種狀態(tài),將這些狀態(tài)的信息記錄到事務(wù)狀態(tài)的對象中。
4.2.3 Spring的事務(wù)的傳播行為

Spring中提供了七種事務(wù)的傳播行為:

  1. 保證多個操作在同一個事務(wù)中
  • PROPAGATION_REQUIRED :默認值,如果A中有事務(wù),使用A中的事務(wù),如果A沒有,創(chuàng)建一個新的事務(wù),將操作包含進來
  • PROPAGATION_SUPPORTS :支持事務(wù),如果A中有事務(wù),使用A中的事務(wù)。如果A沒有事務(wù),不使用事務(wù)。
  • PROPAGATION_MANDATORY :如果A中有事務(wù),使用A中的事務(wù)。如果A沒有事務(wù),拋出異常。
  1. 保證多個操作不在同一個事務(wù)中
  • PROPAGATION_REQUIRES_NEW :如果A中有事務(wù),將A的事務(wù)掛起(暫停),創(chuàng)建新事務(wù),只包含自身操作。如果A中沒有事務(wù),創(chuàng)建一個新事務(wù),包含自身操作。
  • PROPAGATION_NOT_SUPPORTED :如果A中有事務(wù),將A的事務(wù)掛起。不使用事務(wù)管理。
  • PROPAGATION_NEVER :如果A中有事務(wù),報異常。
  1. 嵌套式事務(wù)
  • PROPAGATION_NESTED :嵌套事務(wù),如果A中有事務(wù),按照A的事務(wù)執(zhí)行,執(zhí)行完成后,設(shè)置一個保存點,執(zhí)行B中的操作,如果沒有異常,執(zhí)行通過,如果有異常,可以選擇回滾到最初始位置,也可以回滾到保存點。
4.2.4 Spring的事務(wù)管理
  1. 搭建Spring的事務(wù)管理的環(huán)境
  • 創(chuàng)建Service的接口和實現(xiàn)類


  • 創(chuàng)建Dao的接口和是實現(xiàn)類


  • 配置Service和DAO:交給Spring管理


  • 在DAO中編寫扣錢和加錢方法:

    • 配置連接池和JDBC的模板


    • 在DAO注入JDBC的模板


  • 測試

4.2.5 Spring的事務(wù)管理:一類:編程式事務(wù)(需要手動編寫代碼)--了解
  1. 第一步:配置平臺事務(wù)管理器


  2. 第二步:Spring提供了事務(wù)管理的模板類


  3. 第三步:在業(yè)務(wù)層注入事務(wù)管理的模板


  4. 編寫事務(wù)管理的代碼


  5. 測試

4.2.6 Spring的事務(wù)管理:二類:聲明式事務(wù)管理(通過配置實現(xiàn))---AOP
  1. XML方式的聲明式事務(wù)管理
  • 第一步:引入aop的開發(fā)包

  • 第二步:恢復(fù)轉(zhuǎn)賬環(huán)境

  • 第三步:配置事務(wù)管理器


  • 第四步:配置增強


  • 第五步:AOP的配置


  • 測試

  1. 注解方式的聲明式事務(wù)管理
  • 第一步:引入aop的開發(fā)包

  • 第二步:恢復(fù)轉(zhuǎn)賬環(huán)境

  • 第三步:配置事務(wù)管理器


  • 第四步:開啟注解事務(wù)


  • 第五步:在業(yè)務(wù)層添加注解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,265評論 6 342
  • 1.1 spring IoC容器和beans的簡介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,846評論 2 22
  • 關(guān)于手機 我在煮飯,哥哥進來找我談話,問我為什么不能玩手機了,我說我曾經(jīng)那么信任你們,制定了規(guī)則并把手機交給你們...
    我們伍閱讀 366評論 0 0
  • 今天在餐廳包餃子,谷老師讓包一元的鋼镚到餃子里,我嫌太大,換成了兩個一毛的硬幣,結(jié)果谷老師說,太小了,再給咽下去!...
    IamCircle閱讀 84評論 0 0

友情鏈接更多精彩內(nèi)容