Spring筆記

課程內容

1. 面向接口(抽象)編程的概念與好處

2. IOC/DI的概念與好處

a) inversion of control

b) dependency injection

3. AOP的概念與好處

4. Spring簡介

5. Spring應用IOC/DI(重要)

a) xml

b) annotation

6. Spring應用AOP(重要)

a) xml

b) annotation

7. Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2整合(重要)

a) opensessionInviewfilter(記住,解決什麼問題,怎麼解決)

8. Spring JDBC

面向接口編程(面向抽象編程)

1. 場景:用戶添加

2. Spring_0100_AbstractOrientedProgramming

a) 不是AOP:Aspect Oriented Programming

3. 好處:靈活

什麼是IOC(控制翻轉)DI),有什麼好處Dependency Injection(依賴注入)

1. 把自己new的東西改爲由容器提供

a) 初始化具體值

b) 裝配

2. 好處:靈活裝配

Spring簡介

1. 項目名稱:Spring_0200_IOC_Introduction

2. 環境搭建

a) 只用IOC

i. spring.jar , jarkata-commons/commons-loggin.jar

3. IOC容器

a) 實例化具體bean

b) 動態把其它的bean裝到其中一個bean

4. AOP支持

a) 安全檢查

b) 管理transaction

Spring IOC配置與應用

1. FAQ:不給提示:

a) window – preferences – myeclipse – xml – xml catalog

b) User Specified Entries – add

i. Location: D:\share\0900_Spring\soft\spring-framework-2.5.6\dist\resources\spring-beans-2.5.xsd

ii. URI:    file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd

iii. Key Type: Schema Location

iv. Key: http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

2. 注入類型

a) Spring_0300_IOC_Injection_Type

b) setter(重要)

c) 構造方法(可以忘記)

d) 接口注入(可以忘記)

3. id vs. name

a) Spring_0400_IOC_Id_Name

b) name可以用特殊字符

4. 簡單屬性的注入

a) Spring_0500_IOC_SimpleProperty

b) <property name=… value=….>

5. <bean 中的scope屬性 

a) Spring_0600_IOC_Bean_Scope

b) singleton 單例

c) proptotype 每次創建新的對象

6. 集合注入

a) Spring_0700_IOC_Collections

b) 很少用,不重要!參考程序

7. 自動裝配

a) Spring_0800_IOC_AutoWire

b) byName

c) byType

d) 如果所有的bean都用同一種,可以使用beans的屬性:default-autowire

8. 生命週期

a) Spring_0900_IOC_Life_Cycle

b) lazy-init (不重要)

c) init-method destroy-methd 不要和prototype一起用(瞭解)

9. Annotation第一步:

a) 修改xml文件,參考文檔<context:annotation-config />

10. @Autowired

a) 默認按類型by type

b) 如果想用byName配合使用@Qulifier

c) 寫在private field(第三種注入形式)(不建議,破壞封裝)

d) 如果寫在set上,@qualifier需要寫在參數上

11. @Resource(重要)

a) 加入:j2ee/common-annotations.jar

b) 默認按名稱,首先找對應名稱,名稱找不到,按類型

c) 可以指定特定名稱

d) 推薦使用

e) 不足:如果沒有源碼,就無法運用annotation,只能使用xml

12. @Component @Service @Controller @Repository  目前沒區別

a) 初始化的名字默認爲類名首字母小寫

b) 可以指定初始化bean的名字

13. @Scope

14. @PostConstruct = init-method; @PreDestroy = destroy-method;

什麼是AOP

1. 面向切面編程Aspect-Oriented-Programming

a) 是對面向對象的思維方式的有力補充

2. Spring_1400_AOP_Introduction

3. 好處:可以動態的添加和刪除在切面上的邏輯而不影響原來的執行代碼

a) Filter

b) Struts2interceptor

4. 概念:

a) JoinPoint  連接點

b) PointCut  連接點的集合  

c) Aspect(切面)

d) Advice  切面的邏輯

e) Target  被代理對象

f) Weave 織入

Spring AOP配置與應用

1. 兩種方式:

a) 使用Annotation

b) 使用xml

2. Annotation

a) 加上對應的xsd文件spring-aop.xsd

b) beans.xml <aop:aspectj-autoproxy />

c) 此時就可以解析對應的Annotation

d) 建立我們的攔截類

e) 用@Aspect註解這個類

f) 建立處理方法

g) 用@Before來註解方法

h) 寫明白切入點(execution …….

i) 讓spring對我們的攔截器類進行管理@Component

3. 常見的Annotation:

a) @Pointcut

b) @Before

c) @AfterReturning

d) @AfterThrowing

e) @After

f) @Around

4. 織入點語法

a) void !void

b) 參考文檔(* ..

5. xml配置AOP 用別人的切面類邏輯的時候只能用xml

a) 把interceptor對象初始化

b) <aop:config

i. <aop:aspect …..

1. <aop:pointcut

2. <aop:before

Spring整合Hibernate

1. Spring 指定datasource

a) 參考文檔,找dbcp.BasicDataSource  database connection pool

i. c3p0

ii. dbcp

iii. proxool

b) 在DAO或者Service中注入dataSource

c) 在Spring中可以使用PropertyPlaceHolderConfigure來讀取Properties文件的內容

2. Spring整合Hibernate 

a) <bean .. AnnotationSessionFactoryBean>

i. <property dataSource

ii. <annotatedClasses

iii. <property namehibernateproperties> <props> <prop key=hibernate.dialect></prop> </props> </property>

b) 引入hibernate 系列jar

c) User上加Annotation

d) UserDAO或者UserServie 注入SessionFactory

e) jar包問題一個一個解決

3. 聲明式的事務管理

a) 事務加在DAO層還是Service層?

b) annotation

i. 加入annotation.xsd

ii. 加入txManager bean 把sessionfactory注入給它

iii. <tx:annotation-driven

iv. 在需要事務的方法上加:@Transactional

v. 需要注意,使用SessionFactory.getCurrentSession 不要使用OpenSession

c) @Transactional詳解

i. 什麼時候rollback 

1. 運行期異常,非運行期異常不會觸發rollback

2. 必須uncheck (沒有catch)

3. 不管什麼異常,只要你catch了,spring就會放棄管理

4. 事務傳播特性:propagation_required  默認值required別人調我的方法,如果說已經有了一個transaction了,就用原來那個,把自己作爲這個transaction的一部分加進去,如果沒有,就創建一個新的。

5. read_only readonlytransaction比其它的效率高,提高性能的

d) xml推薦,可以同時配置好多方法

i. <bean txmanager

ii. <aop:config 

1. <aop:pointcut

2. <aop:advisor pointcut-ref advice-ref

iii. <tx:advice: id transaction-manager = 

e) HibernateTemplateHibernateCallbackHibernateDaoSupport(不重要)介紹

i. 設計模式:Template Method

ii. Callback:回調/鉤子函數

iii. 第一種:(建議)

1. 在spring中初始化HibernateTemplate,注入sessionFactory

2. DAO裏注入HibernateTemplate

3. savegetHibernateTemplate.save(); 自己寫個surperdao 在它

裏面把hibernateTemplate注入進來,hibernatesupport不需要了

iv. 第二種:

1. 從HibernateDaoSupport繼承

2. 必須寫在xml文件中,無法使用Annotation,因爲set方法在父類中,而且是final

f) spring整合hibernate的時候使用packagesToScan屬性,可以讓spring自動掃描對應包下面的實體類

Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2

1. 需要的jar包列表

jar包名稱

所在位置

說明

antlr-2.7.6.jar

hibernate/lib/required

解析HQL

aspectjrt

spring/lib/aspectj

AOP

aspectjweaver

..

AOP

cglib-nodep-2.1_3.jar

spring/lib/cglib

代理,二進制增強

common-annotations.jar

spring/lib/j2ee

@Resource

commons-collections-3.1.jar

hibernate/lib/required

集合框架

commons-fileupload-1.2.1.jar

struts/lib

struts

commons-io-1.3.2

struts/lib

struts

commons-logging-1.1.1

單獨下載,刪除1.0.4(struts/lib)

struts

spring

dom4j-1.6.1.jar

hibernate/required

解析xml

ejb3-persistence

hibernate-annotation/lib

@Entity

freemarker-2.3.13

struts/lib

struts

hibernate3.jar

hibernate

hibernate-annotations

hibernate-annotation/

hibernate-common-annotations

hibernate-annotation/lib

javassist-3.9.0.GA.jar

hiberante/lib/required

hibernate

jta-1.1.jar

..

hibernate transaction

junit4.5

mysql-

ognl-2.6.11.jar

struts/lib

slf4j-api-1.5.8.jar

hibernate/lib/required

hibernate-log

slf4j-nop-1.5.8.jar

hibernate/lib/required

spring.jar

spring/dist

struts2-core-2.1.6.jar

struts/lib

xwork-2.1.2.jar

struts/lib

struts2

commons-dbcp

spring/lib/jarkata-commons

commons-pool.jar

..

struts2-spring-plugin-2.1.6.jar

struts/lib

2. BestPractice

a) 將這些所有的jar包保存到一個位置,使用的時候直接copy

3. 步驟

a) 加入jar

b) 首先整合Spring + Hibernate

i. 建立對應的package

1. dao / dao.impl / model / service / service.impl/ test

ii. 建立對應的接口與類框架

1. S2SH_01

iii. 建立spring的配置文件(建議自己保留一份經常使用的配置文件,以後用到的時候直接copy改)

iv. 建立數據庫

v. 加入Hibernate註解

1. 在實體類上加相應註解@Entity @Id

2. 在beans配置文件配置對應的實體類,使之受管

vi. 寫dao service的實現

vii. 加入Spring註解

1. 在對應ServiceDAO實現中加入@Component,讓spring對其初始化

2. 在Service上加入@Transactional或者使用xml方式(此處建議後者,因爲更簡單)

3. 在DAO中注入sessionFactory

4. 在Service中注入DAO

5. 寫DAOService的實現

viii. 寫測試

c) 整合Struts2

結合點:Struts2ActionSpring產生需要在struts.xml class=“名字” 否則action完全由struts spring plugin插件完成 產生以後它會去到spring那邊容器找需要注入的內容。注意用spring產生的話千萬不要忘了@prototype

i. 

ii. 步驟:

1. 修改web.xml加入 strutsfilter

2. 再加入springlistener,這樣的話,webapp一旦啓動,spring容器就初始化了

3. 規劃strutsactionjsp展現

4. 加入struts.xml

a) 修改配置,由spring替代struts產生Action對象

5. 修改action配置

a) 把類名改爲bean對象的名稱,這個時候就可以使用首字母小寫了

b) @Scope(prototype)不要忘記

iii. struts的讀常量:

1. struts-default.xml 

2. struts-plugin.xml

3. struts.xml

4. struts.properties

5. web.xml

iv. 中文問題:

1. Struts2.1.8已經修正,只需要改i18n.encoding = gbk

2. 使用springcharacterencoding

3. 需要嚴格注意filter的順序

4. 需要加到Struts2filter前面

v. LazyInitializationException

1. OpenSessionInViewFilter

2. 需要嚴格順序問題

3. 需要加到struts2filter前面

Action的產生完全由struts spring plugin插件完成 產生以後它會去到spring那邊容器找需要注入的內容。

Struts default properties

學會spring下面的自動化測試框架 springtestcontext 

opensessioninviewinterceptor

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章