javascript
深入浅出 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 接口-----平臺事務管理器(真正管理事務的類,該接口有具體的實現類(DataSourceTransactionManager 和 HibernateTransactionManager),根據不同的持久層框架,需要選擇不同的實現類)
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 的核心過濾器之前,推薦使用此方式!!
?
轉載于:https://www.cnblogs.com/crawl/p/7683070.html
總結
以上是生活随笔為你收集整理的深入浅出 Spring的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pringMVC“Ambiguous m
- 下一篇: 同意条款按钮可用