課程內容
- 面向接口(抽象)編程的概念與好處
- IOC/DI的概念與好處
- inversion of control
- dependency injection
- AOP的概念與好處
- Spring簡介
- Spring應用IOC/DI(重要)
- xml
- annotation
- Spring應用AOP(重要)
- xml
- annotation
- Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2整合(重要)
- opensessionInviewfilter(記住,解決什麼問題,怎麼解決)
- Spring JDBC
面向接口編程(面向抽象編程)
- 場景:用戶添加
- Spring_0100_AbstractOrientedProgramming
- 不是AOP:Aspect Oriented Programming
- 好處:靈活
什麼是IOC(DI),有什麼好處
- 把自己new的東西改爲由容器提供
- 初始化具體值
- 裝配
- 好處:靈活裝配
Spring簡介
- 項目名稱:Spring_0200_IOC_Introduction
- 環境搭建
- 只用IOC
- spring.jar , jarkata-commons/commons-loggin.jar
- 只用IOC
- IOC容器
- 實例化具體bean
- 動態裝配
- AOP支持
- 安全檢查
- 管理transaction
Spring IOC配置與應用
- FAQ:不給提示:
- window – preferences – myeclipse – xml – xml catalog
- User Specified Entries – add
- Location: D:\share\0900_Spring\soft\spring-framework-2.5.6\dist\resources\spring-beans-2.5.xsd
- URI: file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resources/spring-beans-2.5.xsd
- Key Type: Schema Location
- Key: http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- 注入類型
- Spring_0300_IOC_Injection_Type
- setter(重要)
- 構造方法(可以忘記)
- 接口注入(可以忘記)
- id vs. name
- Spring_0400_IOC_Id_Name
- name可以用特殊字符
- 簡單屬性的注入
- Spring_0500_IOC_SimpleProperty
- <property name=… value=….>
- <bean 中的scope屬性
- Spring_0600_IOC_Bean_Scope
- singleton 單例
- proptotype 每次創建新的對象
- 集合注入
- Spring_0700_IOC_Collections
- 很少用,不重要!參考程序
- 自動裝配
- Spring_0800_IOC_AutoWire
- byName
- byType
- 如果所有的bean都用同一種,可以使用beans的屬性:default-autowire
- 生命週期
- Spring_0900_IOC_Life_Cycle
- lazy-init (不重要)
- init-method destroy-methd 不要和prototype一起用(瞭解)
- Annotation第一步:
- 修改xml文件,參考文檔<context:annotation-config />
- @Autowired
- 默認按類型by type
- 如果想用byName,使用@Qulifier
- 寫在private field(第三種注入形式)(不建議,破壞封裝)
- 如果寫在set上,@qualifier需要寫在參數上
- @Resource(重要)
- 加入:j2ee/common-annotations.jar
- 默認按名稱,名稱找不到,按類型
- 可以指定特定名稱
- 推薦使用
- 不足:如果沒有源碼,就無法運用annotation,只能使用xml
- @Component @Service @Controller @Repository
- 初始化的名字默認爲類名首字母小寫
- 可以指定初始化bean的名字
- @Scope
- @PostConstruct = init-method; @PreDestroy = destroy-method;
什麼是AOP
- 面向切面編程Aspect-Oriented-Programming
- 是對面向對象的思維方式的有力補充
- Spring_1400_AOP_Introduction
- 好處:可以動態的添加和刪除在切面上的邏輯而不影響原來的執行代碼
- Filter
- Struts2的interceptor
- 概念:
- JoinPoint
- PointCut
- Aspect(切面)
- Advice
- Target
- Weave
Spring AOP配置與應用
- 兩種方式:
- 使用Annotation
- 使用xml
- Annotation
- 加上對應的xsd文件spring-aop.xsd
- beans.xml <aop:aspectj-autoproxy />
- 此時就可以解析對應的Annotation了
- 建立我們的攔截類
- 用@Aspect註解這個類
- 建立處理方法
- 用@Before來註解方法
- 寫明白切入點(execution …….)
- 讓spring對我們的攔截器類進行管理@Component
- 常見的Annotation:
- @Pointcut
- @Before
- @AfterReturning
- @AfterThrowing
- @After
- @Around
- 織入點語法
- void !void
- 參考文檔(* ..)
- xml配置AOP
- 把interceptor對象初始化
- <aop:config
- <aop:aspect …..
- <aop:pointcut
- <aop:before
- <aop:aspect …..
Spring整合Hibernate
Spring 指定datasource
- 參考文檔,找dbcp.BasicDataSource
- c3p0
- dbcp
- proxool
- 在DAO或者Service中注入dataSource
- 在Spring中可以使用PropertyPlaceHolderConfigure來讀取Properties文件的內容
Spring整合Hibernate
- <bean .. AnnotationSessionFactoryBean>
- <property dataSource
- <annotatedClasses
- 引入hibernate 系列jar包
- User上加Annotation
- UserDAO或者UserServie 注入SessionFactory
- jar包問題一個一個解決
聲明式的事務管理
- 事務加在DAO層還是Service層?
- annotation
- 加入annotation.xsd
- 加入txManager bean
- <tx:annotation-driven
- 在需要事務的方法上加:@Transactional
- 需要注意,使用SessionFactory.getCurrentSession 不要使用OpenSession
- @Transactional詳解
- 什麼時候rollback
- 運行期異常,非運行期異常不會觸發rollback
- 必須uncheck (沒有catch)
- 不管什麼異常,只要你catch了,spring就會放棄管理
- 事務傳播特性:propagation_required
- read_only
- 什麼時候rollback
- xml(推薦,可以同時配置好多方法)
- <bean txmanager
- <aop:config
- <aop:pointcut
- <aop:advisor pointcut-ref advice-ref
- <tx:advice: id transaction-manager =
- HibernateTemplate、HibernateCallback、HibernateDaoSupport(不重要)介紹
- 設計模式:Template Method
- Callback:回調/鉤子函數
- 第一種:(建議)
- 在spring中初始化HibernateTemplate,注入sessionFactory
- DAO裏注入HibernateTemplate
- save寫getHibernateTemplate.save();
- 第二種:
- 從HibernateDaoSupport繼承
- 必須寫在xml文件中,無法使用Annotation,因爲set方法在父類中,而且是final的
- spring整合hibernate的時候使用packagesToScan屬性,可以讓spring自動掃描對應包下面的實體類
Struts2.1.6+ Spring2.5.6 + Hibernate3.3.2
- 需要的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 |
|
- BestPractice:
- 將這些所有的jar包保存到一個位置,使用的時候直接copy
- 步驟
- 加入jar包
- 首先整合Spring + Hibernate
- 建立對應的package
- dao / dao.impl / model / service / service.impl/ test
- 建立對應的接口與類框架
- S2SH_01
- 建立spring的配置文件(建議自己保留一份經常使用的配置文件,以後用到的時候直接copy改)
- 建立數據庫
- 加入Hibernate註解
- 在實體類上加相應註解@Entity @Id等
- 在beans配置文件配置對應的實體類,使之受管
- 寫dao service的實現
- 加入Spring註解
- 在對應Service及DAO實現中加入@Component,讓spring對其初始化
- 在Service上加入@Transactional或者使用xml方式(此處建議後者,因爲更簡單)
- 在DAO中注入sessionFactory
- 在Service中注入DAO
- 寫DAO與Service的實現
- 寫測試
- 建立對應的package
- 整合Struts2
- 結合點:Struts2的Action由Spring產生
- 步驟:
- 修改web.xml加入 struts的filter
- 再加入spring的listener,這樣的話,webapp一旦啓動,spring容器就初始化了
- 規劃struts的action和jsp展現
- 加入struts.xml
- 修改配置,由spring替代struts產生Action對象
- 修改action配置
- 把類名改爲bean對象的名稱,這個時候就可以使用首字母小寫了
- @Scope(“prototype”)不要忘記
- struts的讀常量:
- struts-default.xml
- struts-plugin.xml
- struts.xml
- struts.properties
- web.xml
- 中文問題:
- Struts2.1.8已經修正,只需要改i18n.encoding = gbk
- 使用spring的characterencoding
- 需要嚴格注意filter的順序
- 需要加到Struts2的filter前面
- LazyInitializationException
- OpenSessionInViewFilter
- 需要嚴格順序問題
- 需要加到struts2的filter前面
- Spring 的TestContext 測試框架