深入淺出 Spring


原創播客,如需轉載請注明出處。原文地址:http://www.cnblogs.com/crawl/p/7683070.html  

前言:筆記中提供了大量的代碼示例,需要說明的是,大部分代碼示例都是以圖片的形式展示的,所有的圖片都是來自本人所敲代碼的截圖,不足之處,請大家指正~

第一部分:環境搭建及 IOC 容器

一、Spring 環境在 Eclipse 中的搭建及配置

1、點擊 Help --> Install New SoftWare --> Add -->Archive

2、導入 spring-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.zip 壓縮包 選擇帶有 Spring IDE 的項,進行安裝即可

3、導入所需要的 jar 包

> spring 所依賴的日志 jar包 apache-commons\commons-logging-1.1.1.jar

> spring 自身的 jar包  spring-framework-4.0.0.RELEASE\libs 目錄下的 4 個 jar 包,見下:

> 或者導入     (此處的 log4j 意為 log for java)

注:日志的規范:spring-framework-3.0.2.RELEASE-dependencies\org.apache.log4j\com.springsource.org.apache.log4j\1.2.15

日志的實現:spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1

補:還要把 log4j.properties 文件拷貝到類路徑(src)下

二、Spring 的 IOC(Inverse of  Control   控制反轉):將對象創建的權利反轉給 Spring 框架

1、IOC 的 Helloworld

1)創建一個接口 UserService,定義一個抽象方法  public void sayHello();

2)創建接口的實現類 UserServiceImpl,實現接口的抽象方法

public void sayHello(){

  System.out.println("Hello Spring...");

}

3)創建 Spring bean 管理的配置文件:  applicationContext.xml 

測試:

注:Spring 在調用 ClassPathXmlApplicationContext() 方法加載applicationContext.xml 文件時,就創建相應的 bean 的實例了!

2、IOC 的核心配置文件  applicationContext.xml

bean 節點的:

  id 屬性:標志一個唯一的 Bean,id屬性值必須唯一;必須以字母開始,可以使用字母、數字、連字符、下划線、句話、冒號  id:不能出現特殊字符

  class屬性: Bean 的全類名

  scope屬性: 代表 Bean 的作用范圍     可取值:

    >* singleton:單例的,默認值

    >* prototype:多例的,Spring 整合 Struts2 時,Action 類交給 Spring 管理,需要配置為 prototype

    > requese:WEB項目中,Spring創建一個Bean的對象,將對象存入到request域中,和 request 周期一致

    > session:WEB項目中,Spring創建一個Bean的對象,將對象存入到session域中,和 session 周期一致

    > golbalSession:WEB項目中,應用在Porlet環境.如果沒有Porlet環境那么globalSession相當於session.

  init-method屬性:作為 Bean 初始化時執行的方法

  destroy-method屬性:作為 Bean 被銷毀時執行的方法

三、Spring 的 依賴注入(DI:Dependency Injection):在 Spring 框架負責創建 Bean對象時,動態的將依賴對象注入到 Bean 組件中

1.兩種依賴注入的方式:

注:進行依賴注入,不管是值類型的屬性,還是引用類型的屬性,在對應的 bean 中必須創建對應的屬性,並提供 setter 方法(注解注入的情況除外

測試: 常規調用即可

2.構造器方式注入屬性

1) 注入引用類型的屬性

    > 構造 Car

> 配置 bean

2)注入引用類型的屬性

> 創建 Person 類,添加 Car 引用

> 配置 bean

3.注入數組和集合類型的屬性

1)注入 數組 和 List 集合的屬性,使用 list 節點(在 property 節點中)

2)注入 Map 集合類型的屬性,使用 map 節點 entry 節點配置

注:Set 集合的配置方式與 Map 集合類似,其使用  set 節點配置

3)注入 Properties 集合類型的屬性 使用 props 和 prop 節點配置

注:需要在 類中定義以上這些集合類型的屬性,再添加  setter 方法

補: Spring 的多個配置文件開發:

            > 在一個配置文件中包含另一個配置文件(較常使用):

                      <import resource="applicationContext2.xml"></import>

> 創建工廠的時候加載多個配置文件(較少使用):

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

四、Spring 整合 Web

1.導入 所需的 jar 包:E:\jar包開源框架-新\spring-framework-4.2.4.RELEASE\libs 目錄下的 spring-web-4.2.4.RELEASE.jar

2.在 web.xml 中配置 listener 監聽器,此監聽器為 ServletContextListener 在 容器加載時就會創建,所以在 IOC 容器中的實例也在Web容器加載時就被創建,且只被創建一次

3.修改以前的工廠代碼,改為使用 WebApplicationContext 的方式

 

五、IOC 注解方式

1. 搭建使用環境:

①引入所需的aop jar 包, spring-framework-4.2.4.RELEASE\libs\spring-aop-4.2.4.RELEASE.jar

②引入 context 約束:spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html 中復制即可

開啟注解的掃描

2.使用注解:

1)這里使用的是 @Component 組件

測試與常規的工廠一樣

補:@Component 有三個衍生注解:

@Controller :使用在 WEB 層

@Service : 使用在業務層

@Repository :使用在持久層

注:這三個注解是為了讓標記類本身的用途清晰,功能目前和 @Component 一致

2)使用 @Value 注解注入基本數據類型的屬性

 

3)注入引用類型的屬性

方式一:使用 @Autowired  和 @Qualifier

 

方式二:使用 Java 提供的 @Resource 注解

4)使用注解設置 Bean 的作用范圍

在類的上方設置 @Scope(value="prototype") 可取值:singleton 、 prototype

 

5)Bean的生命周期的設置(為方法添加)  了解即可

@PostConstruct  的作用相當於 init-method

@PreDestroy 的作用相當於 destroy-method

 

六、Spring 整合 JUnit 單元測試,方便測試

1.導入所需的 spring-test-4.2.4.RELEASE.jar jar 包 spring-framework-4.2.4.RELEASE\libs\spring-test-4.2.4.RELEASE.jar

2.為單元測試類添加注解:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration("classpath:applicationContext.xml")

3.使用:

第二部分:Spring 的 AOP

一、AOP 概述

1. AOP:Aspect Oriented Programming   意為面向切面編程

2. AOP 采取橫向抽取機制,取代了傳統橫向繼承體系的重復性代碼,主要可以實現:性能監視、事務管理、安全檢查、緩存 等功能

3. 優點:可以在不修改源代碼的前提下,對程序進行增強

二、AOP 的底層實現

1.基於 JDK 的動態代理:針對實現了接口的類產生代理   實例代碼(代碼了解即可):

> 定義 UserDAO(接口) 和 UserDaoImpl(實現類) 類,創建 save() 和 update() 兩個方法

> 定義代理類:

2.Cglib 動態代理:針對沒有實現接口的類產生代理. 應用的是底層的字節碼增強的技術 生成當前類的子類對象.實例代碼(代碼了解即可):

> 定義 BookDaoImpl 類,創建 save()  和 update()  方法

> 創建代理類

 

三、AOP開發的相關術語

1. Joinpoint(連接點): 所謂連接點是指那些被攔截到的點。在spring中,這些點指的是方法,因為spring只支持方法類型的連接點.

2. Pointcut(切入點):所謂切入點是指我們要對哪些Joinpoint進行攔截的定義.

3.Advice(通知/增強):指攔截到Joinpoint之后所要做的事情就是通知.通知分為前置通知,后置通知,異常通知,最終通知,環繞通知(切面要完成的功能)

4.Introduction(引介):(知道即可)引介是一種特殊的通知在不修改類代碼的前提下, Introduction可以在運行期為類動態地添加一些方法或Field.

5.Target(目標對象):代理的目標對象 如:BookDaoImpl    UserDaoImpl

 6.Weaving(織入):是指把增強應用到目標對象來創建新的代理對象的過程.也就是:生成某個類代理對象的過程

7.Proxy(代理):一個類被AOP織入增強后,就產生一個結果代理類。也就是:生成的代理對象

8.Aspect(切面): 是切入點和通知(引介)的結合。需要我們自己來編寫和配置(通知需要自己來編寫,切入點需要配置) 切面: 切入點 + 通知

四、AspectJ 的 XML 方式的 AOP的具體開發

1.環境配置

1)導入所需的 jar 包

* spring 框架開發的基本 jar 包

* spring 的傳統AOP的開發的包

spring-aop-4.2.4.RELEASE.jar

com.springsource.org.aopalliance-1.0.0.jar

(spring-framework-3.0.2.RELEASE-dependencies\org.aopalliance\com.springsource.org.aopalliance\1.0.0)

* aspectJ 的開發包:

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

(spring-framework-3.0.2.RELEASE-dependencies\org.aspectj\com.springsource.org.aspectj.weaver\1.6.8.RELEASE)

spring-aspects-4.2.4.RELEASE.jar

2)向 applicationContext.xml 中配置約束

 2.具體使用:

准備:定義接口:CustomerDao,創建 save() 和 update() 方法

定義實現類:CustomerDaoImpl

定義測試方法:

 

1)創建切面類:

2)applicationContext.xml 文件中配置 AOP

補:關於 AOP 切入點的表達式:

補:關於 AOP 的通知類型

>前置通知(aop:before):在目標類的方法執行之前執行

>最終通知(aop:after):在目標類的方法執行之后執行,若程序出現異常,通知也會執行

> 后置執行(aop:after-returning):在目標類的方法正常執行后再執行

> 異常拋出通知(aop:after-throwing):在目標類拋出異常后通知

>環繞通知(aop:around):目標類方法執行前后都通知

注:特別注意 環繞通知 :

五、Spring 框架的 AOP 技術------注解的方式

1.環境准備

1)引入相關的 jar 包,見模塊四

2)引入相關的約束 spring-3 的 applicationContext.xml 文件的約束已全面

 3)① 定義接口:CustomerDao,創建 save() 和 update() 方法 ② 定義實現類:CustomerDaoImpl ③創建測試方法

4)編寫切面類 MyAspectAnno,並在 applicationContext.xml文件中配置切面類

 

 5)AOP 注解的入門操作:

> 在 applicationContext.xml 里配置開啟 AOP 注解的自動代理

> 在切面類中設置注解

2. AOP注解的通知類型和通用切入點

1)通知類型:

    * @Before :前置通知

    * @AfterReturing :后置通知

    * @Around :環繞通知(默認目標對象的方法不執行)

    * @After :最終通知

    * @AfterThrowing :異常拋出通知.

2)演示:

補:配置通用的切入點

六、Spring 的 JDBC 模板技術

1.環境的配置 -- 導入所需的 jar 包和 配置文件

還需要:

2.使用 Spring-JDBC 的模板類  JdbcTemplate

> 不使用 IOC 容器管理,手動 new 出 JdbcTemplate 對象的方式,使用的是 Spring 框架內置的數據庫連接池 DriverManagerDataSource

 

> 使用 IOC 容器管理管理數據源

① 在 applicationContext.xml 文件中配置數據庫連接池(Spring 內置)和 JdbcTemplate

②使用:

3.使用 Spring 框架管理開源的數據庫連接池

1)管理 DBCP 數據庫連接池

> 導入所需的 2個 jar 包,在 Spring 的依賴包中找

spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.dbcp\1.2.2.osgi\com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar

spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.pool\1.5.3\com.springsource.org.apache.commons.pool-1.5.3.jar

 

> 在 applicationContext.xml 中配置 DBCP 數據庫連接池

 2)管理 C3P0 數據庫連接池

> 導入所需的 jar 包  在 Spring 的依賴包中找

spring-framework-3.0.2.RELEASE-dependencies\com.mchange.c3p0\com.springsource.com.mchange.v2.c3p0\0.9.1.2\com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

> 在 applicationContext.xml 中配置  C3P0 數據庫連接池

4、 JDBC模板類的使用--- 增 刪 改 查

1) 增 刪 改 操作

 

2)查詢一條記錄 使用  queryForObject() 方法

 

自定義實現類,先定義一個 JavaBean:Account,然后:

 

3)查詢一組記錄的 List,使用 query() 方法

 

七、Spring 的事務管理

1. Spring 事務管理的相關 API

1)PlatformTransactionManager 接口-----平台事務管理器(真正管理事務的類,該接口有具體的實現類(DataSourceTransactionManagerHibernateTransactionManager),根據不同的持久層框架,需要選擇不同的實現類)

2)TransactionDefinition  接口----事務定義信息,如:事務的隔離級別、傳播行為、超時信息、是否只讀

補:事務的傳播行為常量(常用):

 * 保證同一個事務中

PROPAGATION_REQUIRED   支持當前事務,如果不存在 就新建一個(默認,較常使用)

* 保證沒有在同一個事務中

PROPAGATION_REQUIRES_NEW    如果有事務存在,掛起當前事務,創建一個新的事務 

*PROPAGATION_NESTED  如果當前事務存在,則嵌套事務執行

3)TransactionStatus 接口 ------ 事務的狀態

2.案例:轉賬環境的搭建

1)導入所需的 jar 包

IOC:6個包  AOP:4個 整合JUnit:1個 c3p0:1個 jdbc:2個 Mysql驅動:1個    導入配置文件(2個)

2)編寫 AccountService、AccountDao 接口,及其實現類 AccountServiceImpl、AccountDaoImpl 詳見 spring-3-tx 項目

3)JdbcDaoSupport 類:若繼承該類便可通過 getJdbcTemplate() 方法獲取 JdbcTemplate 對象,具體獲取方法:

① 因為 JdbcDaoSupport中存在屬性 JdbcTemplate,所以直接在 applicationContext.xml 文件中配置 JdbcTemplate 類,並當做屬性注入到使用該類的其他類中,即可使用

②根據 JdbcDaoSupport 的源碼分析,所以可以不用在 applicationContext.xml 文件中配置並注入模板類,而直接配置並注入數據庫連接池即可

示例:

3.事務的管理

1)Spring的編程式事務管理(了解即可)

①配置平台事務管理器

 

②配置 TransactionTemplate 模板類

 

③在業務層注入事務的模板類 即 TransactionTemplate

 

 ④使用 TransactionTemplate 管理事務

 

2)Spring 的基於 AOP 的聲明式事務管理

① XML 配置文件的方式(業務層的方法不需要任何修改)

> 配置平台事務管理器

> 先配置通知 注: tx:method 可以給方法設置一些數據庫的屬性,如:隔離級別、傳播行為等 tx:method 的 name屬性值可以帶 * ,如 pay* 表示以 pay開頭的方法

 

> 再配置 AOP 切面

 

② 使用注解的方式管理事務

> 配置平台事務管理器

> 開啟事務的注解

 

> 在相應的 類上(表示此類中的所有方法都添加事務) 或 方法(只有此方法會添加事務)上添加 @Transactionl 注解

 

八、Spring 整合 SSH 三大框架

知識總結回顧:

1. Spring 整合 Struts2

1)方式一: Action 由 Struts2 創建並管理,需要依賴 struts2-spring-plugin-2.3.24.jar 這個 jar 包(不推薦使用)

① 在 struts.xml 文件中配置 Action

② 在 Action 中調用業務層的類,只要在 Spring 的配置文件中對業務層的類進行了配置,在 Action 中直接創建業務層的實例並提供 setter 方法,便可以直接調用業務層的方法。

2)方式二:Action 交由 Spring 創建並管理 (推薦使用)

① 在 Spring 的配置文件中配置 Action,必須配置成 多例的

② 重新配置 Struts.xml 配置文件中 Action 的配置,若 Action 交由 Spring 管理,其 action 節點的 class 屬性為 Spring 配置文件中配置 Action 的 bean 節點的 id 屬性值

③ 在 Spring 的配置文件中為 Action 注入業務層的引用屬性

④ 使用:在 Action 類中定義相關業務層的引用屬性,定義 setter 方法,使用即可

2.Spring 整合 Hibernate

1)方式一:帶有 hibernate.cfg.xml 配置文件 (不推薦使用

① 持久層的類需要繼承 HibernateDaoSupport,此類中具有 hibernateTemplate 引用屬性,分析源碼可知,此類還可以通過配置 SessionFactory獲取 hibernateTemplate 對象。因為持久層的類繼承了 HibernateDaoSupport,即獲取了其 hibernateTemplate 引用屬性和 SessionFactory引用屬性,所以可以直接在 Spring 配置文件中為持久化類注入 SessionFactory

 

② 按 Hibernate 的步驟生成 hibernate.cfg.xml類名.hbm.xml 文件,並進行相應的配置,注:hibernate.cfg.xml 中不能配置綁定當前線程的操作,否則會報錯!

③ 在 Spring 的配置文件中配置 LocalSessionFactoryBean,用來加載 hibernate.cfg.xml 文件和創建 SessionFactory 對象

 

④ 在 Spring 配置文件中配置平台事務管理器開啟事務的注解,並在相應的業務層的類或方法上添加 @Transactionl 注解

 

2)方式二:不帶有 hibernate.cfg.xml 配置文件 (推薦使用)

思考:沒有 hibernate.cfg.xml 配置文件,即把 hibernate.cfg.xml 配置文件中的內容在 Spring 的配置文件中配置,所以,在方式一的基礎上

① 在 Spring的配置文件中配置 c3p0 數據源

 

② 在 LocalSessionFactoryBean配置 數據庫連接池,方言,可選值(是否打印 SQL,是否格式化 SQL,數據表的生成策略),引入映射的配置文件

 

3.Hibernate 模板類--- HibernateDAOSupport 的使用

1)HibernateDAOSupport 的 getHibernateTemplate() 方法同 Hibernate 的 Session 類似,可以對數據庫進行增、刪、改

 

2)查詢一條記錄,HQL查詢所有記錄,QBC 查詢所有記錄,分頁查詢

 

4. SSH 框架整合延遲加載問題的解決

1)使用 HIbernateTemplate.load() 方法,默認為延遲加載

2)異常:java.lang.ClassCastException: qi.spring.ssh1.domain.Customer_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy  是由包沖突造成的,刪除低版本的即可

 

3)懶加載異常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session 是由於延遲加載時 Session 已經關閉造成的

解決:

方案一:在 Customer.hbm.xml 中的 class 節點添加 lazy="false" 屬性,關閉延遲加載,不推薦使用,此方案使程序性能降低

方案二:Spring解決延遲加載的問題在 web.xml 文件中配置一個過濾器,注:此過濾器一定要配置在 struts2 的核心過濾器之前推薦使用此方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM