Spring知識點總結大全
chapter01 Spring簡介
一、Spring是什麼?
在瞭解Spring之前,我們來了解在Java EE框架下企業級開發採用EJB框架的一些不足:
(1) EJB太笨重,而且Entity EJB不能脫離容器
(2) 企業級服務使用困難
(3) 開發的複雜度太高
(4) 侵入式方案,EJB要使用特定的介面
因此,Spring應運而生。
Spring是一個開源的用於簡化採用Java語言開發企業級程式的一個分層的框架。
關於程式的分層結構:
1、Presentation layer(表示層)
(1) 表示邏輯(生成介面程式碼)
(2) 接收請求
(3) 處理業務層丟擲的異常
(4) 負責規則驗證(資料格式,資料非空等)
(5) 流程控制
2、Service layer(服務層/業務層)
(1) 封裝業務邏輯處理,並且對外暴露介面
(2) 負責事務,安全等服務
3、Persistence layer(持久層)
(1) 封裝資料訪問的邏輯,暴露介面
(2) 提供方便的資料訪問的方案(查詢語言,API,對映機制等)
Domain layer(域層)
(1) 業務物件以及業務關係的表示
(2) 處理簡單的業務邏輯
(3) 域層的物件可以穿越表示層,業務層,持久層
二、Spring的作用
為什麼要使用Spring?
(1) 簡化企業級開發
① 封裝了大部分的企業級服務,提供了更好的訪問這些服務的方式
② 提供了IOC,AOP功能的容器,方便程式設計
(2) 遵循Spring框架的應用程式,一定是設計良好的,針對介面程式設計,這樣就簡化了企業級程式的設計。
(3) Spring的組成
① Spring Core:核心容器,BeanFactory提供了元件生命週期的管理,元件的建立,裝配,銷燬等功能
SpringContext:ApplicationContext,擴充套件核心容器,提供事件處理、國際化等功能。它提供了一些企業級服務的功能,提供了JNDI,EJB,RMI的支援。
② Spring AOP:提供切面支援
③ Spring DAO:提供事務支援,JDBC,DAO支援
④ Spring ORM:對流行的O/R Mapping封裝或支援
⑤ Spring Web:提供Web應用上下文,對Web開發提供功能上的支援,如請求,表單,異常等。
⑥ Spring Web MVC:全功能MVC框架,作用等同於Struts。
chapter02 Spring的IoC
一、IoC的概念
IoC,Inversion of Control,控制反轉。
物件的協作關係由物件自己負責。
依賴注入:物件的協作關係有容器來建立。
二、IoC的型別
(1) 基於特定介面(侵入式方案)
(2) 基於set方法
(3) 基於構造器
三、Spring容器
Spring容器負責生成、組裝、銷燬元件,並負責事件處理、國際化等功能。
(1) BeanFactory<interface>
① 核心容器,負責元件生成和裝配
② 實現主要包括Xml BeanFactory
(2) ApplicationContext
(3) WebApplicationContext
(4) ……
四、IoC的使用
Resource:interface,用來包裝資源
xmlBeanFactory:BeanFactory的一個實現,使用Resource物件來查詢配置檔案
BeanFactory.gerBean(“BeanId”):取得以引數命名,或者Id等於引數值的一個Bean例項。
BeanFactory(容器)在預設情況下,會採用單例方式返回物件。容器只到呼叫getBean方法時,才會例項化某個物件。
(1) Spring可以採用XML或者.properties檔案作配置
(2) 配置檔案(XML)
根元素<beans>可以有多個<bean>子元素,每個<bean>代表一個需要裝配的物件。
1、setter注入
(1) 注入簡單屬性(String和8中基本型別)
<beans>
<bean id=”BeanId” class=”classpath” autowire=” ” dependency-check=” ”>
<property name=”parameterName”>
<value>parameterValue</value>
</property>
</bean>
</beans>
對於基本型別,Spring容器會自動作型別轉換,以便賦值。
(2) 注入物件
<bean>
<ref local=”BeanId”>
</bean>
A、讓Spring容器在當前配置檔案中找到相應的Bean,並呼叫set方法,注入該Bean。
B、將一個Bean的定義巢狀在另一個Bean中(可讀性差),被巢狀的Bean不能採用getBean()返回
C、採用<ref bean=” ”>搜尋多個配置檔案來注入
(3) 注入集合型別
① Set
Set中存放字串,物件,集合,不允許重複
② List
List中可以放入字串,物件,List
③ Map
Map 有<entry>子元素來存取key,value,key只能為String
④ Properties
Properties有<props>子元素
2、consctructor注入
<bean>
<constructor-arg>
<value></value>
</constructor-arg>
<constructor-arg>
<ref bean= “ ” />
</constructor-arg>
</bean>
如果Bean屬性不多,並且屬性值必須要注入才能使用,則應該採用constructor注入,其他情況就要set方法注入。
裝配關係檢查(Dependency checking)
simple:檢查簡單型別
ojects:檢查物件型別
all:檢查所有
<bean dependency-check=“all”></bean>
自動裝配(Autowring Properties)
裝配方式:byName,byType,autodetect,constructor
autowire=“byName”:按照名稱匹配
按照Bean的Id與屬性的名稱進行匹配
自動裝配與手動裝配可以結合使用,手動裝配會覆蓋自動裝配。
autowire=“byType”:按照型別匹配
要注入的屬性型別與配置檔案中的Bean型別匹配的個數超過一個,會出錯。
autowire=“antodetect”:
先按照construct,後按照byType。
autowire=“constructor”:
先去匹配構造器中引數型別,後與配置檔案中的Bean型別匹配。
3、比較兩種注入方式
關於自動匹配:
優點:快速開發
缺點:依賴關係不清楚,易出錯,不易維護。
自動匹配的應用場合:
(1) 構建系統原型
(2) 與依賴關係檢查(Dependency-check)結合使用
(3) 自動裝配與手動裝配結合
4、特殊的IoC
① 後處理Bean
介面:org.springframework.beans.factory.config.BeanPostProcessor
Spring已經實現該介面的BeanPostProcessor(不用再註冊)
ApplicationContextAwareProcessor:
把應用上下文傳遞給所用實現了 ApplicationContextAware介面的Bean
ApplicationContextAware介面使用舉例,可參照事件監聽機制
DefaultAdvisorAutoProxyCreator自動對Bean應用切面
② Bean工廠後處理(只能在應用上下文中使用)
介面:org.springframework.beans.factory.config.BeanFactoryPostProcessor
Spring內部介面實現:
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
屬性編輯
org.springframework.beans.factory.config.CustomEditorConfigurer
CustomerInfo("fname-lname-address")
例項工廠配置
程式碼:
--------------------------------------------------------------------------------
<beans>
<bean id="car" class="ioc3.Car" factory-bean="carFactory" factory-method="getCar" dependency-check="all">
<property name="name">
<value>奧迪A8</value>
</property>
<property name="price">
<value>800000.0</value>
</property>
</bean>
<bean id="carFactory" class="ioc3.CarFactory"/>
</beans>
--------------------------------------------------------------------------------
靜態工廠配置
--------------------------------------------------------------------------------
<beans>
<bean id="car" class="ioc3.CarFactory" factory-method="getCar">
<property name="name">
<value>奧迪A8</value>
</property>
<property name="price">
<value>800000.0</value>
</property>
</bean>
</beans>
--------------------------------------------------------------------------------
5、事件處理
事件監聽
1)自定義事件,通過繼承org.springframework.context.ApplicationEvent
2)自定義監聽器,實現 org.springframework.context.ApplicationListener,並註冊
3)釋出事件,為得到應用上下文,
必須實現org.springframework.context.ApplicationContextAware介面
chapter03 Spring的AOP
一、AOP(Aspect-oriented programming,面向切面程式設計):
什麼是AOP?
定義:將程式中的交叉業務邏輯提取出來,稱之為切面。將這些切面動態織入到目標物件,然後生成一個代理物件的過程。
二、AOP核心概念
1、Aspect(切面)
切面,是對交叉業務邏輯的統稱。
2、Joinpoint(連線點)
連線點,指切面可以織入到目標物件的位置(方法,屬性等)。
3、Advice(通知)
通知,指切面的具體實現。
4、Pointcut(切入點)
切入點,指通知應用到哪些類的哪些方法或屬性之上的規則。
5、Introduction(引入)
引入,指動態地給一個物件增加方法或屬性的一種特殊的通知。
6、Weaving(織入)
織入,指將通知插入到目標物件。
7、Target(目標物件)
目標物件,指需要織入切面的物件。
8、Proxy(代理物件)
代理物件,指切面織入目標物件之後形成的物件。
三、Spring AOP原理
採用動態代理模式。
Spring AOP採用動態代理的過程:
(1) 將切面使用動態代理的方式動態織入到目標物件(被代理類),形成一個代理物件;
(2) 目標物件如果沒有實現代理介面,那麼Spring會採用CGLib來生成代理物件,該代理物件是目標物件的子類;
(3) 目標物件如果是final類,並且也沒實現代理介面,就不能運用AOP。
四、Spring的通知
1、Spring的通知型別
(1) MethodBeforeAdvice
類全名:org.springframework.aop.MethodBeforeAdvice
在方法呼叫之前,做處理。
不能夠改變返回值
不能夠改變目標方法的流程,也不能中斷流程的處理過程(除非丟擲異常)
(2) AfterReturningAdvice
類全名:org.springframework.aop.AfterReturningAdvice
在方法呼叫之後,做處理。
不能夠改變返回值
不能夠改變目標方法的流程,也不能中斷流程的處理過程(除非丟擲異常)
(3) MethodInterceptor
類全名:org.aopalliance.intercept.MethodInterceptor
在方法呼叫之前以及之後,做處理。
可以改變返回值,也可以改變流程。
(4) ThrowsAdvice
類全名:org.springframework.aop.ThrowsAdvice
在方法丟擲異常後,做處理。
當該通知處理完異常後,會簡單地將異常再次丟擲給目標呼叫方法。
2、配置過程:
(1)配置目標物件
(2)配置通知
(3)利用ProxyFactoryBean將通知織入到目標物件,形成一個動態代理物件
(4)客戶端使用動態代理來訪問目標物件的方法。
在預設情況下,通知會應用到所有的方法之上。
Pointcut:
根據方法和類決定在什麼地方織入通知
Advisor:
將Pointcut與Advice結合到一起。
自定義切入點:
步驟:
1)實現org.springframework.aop.ClassFilter
2)實現org.springframework.aop.MethodMatcher
3)實現org.springframework.aop.Pointcut
4)實現org.springframework.aop.PointcutAdvisor
注意:
在此可定義
private Advice advice;
private Pointcut pointcut;
在配置檔案中,將自定義的切入點與通知綁訂到一起
5)利用ProxyFactoryBean將advisor織入到目標物件
ProxyFactoryBean的作用:
依照配置資訊,將切面應用到目標物件,生成動態代理物件。
(1) Spring只支援方法連線點,不支援屬性連線點。
(原因是Spring AOP採用的是動態代理模式,而動態代理本身就是在方法呼叫前加入程式碼。)
(2) Spring只在執行時,將切面織入到目標物件。
(有些AOP實現,可以在編譯是織入切面到目標物件。)
Injecting Advice(con’t d)
<bean id=”registerService’ class=”org.springframework.aop.framework.ProxyFactoryBean”>
<property name=”proxyInterfaces”> ←目標物件實現的介面
(如果沒有定義介面,則所有方法使用CGLib
<value>aop.RegisterService</value>
</proxy>
<property name=”target”> ←目標物件
<ref local=”registerServiceTarget”/>
</property>
<property name=”interceptorNames”> ←需要織入到目標物件的切面
<list>
<value>logAdvice</value>
<value>throwsAdvice</value>
</list>
</property>
</bean>
五、切入點(Pointcut)
1、Pointcut<interface>
切入點是指通知/切面可以應用到哪些類,哪些方法之上。
Pointcut API
Pointcut:org.springframework.aop.Pointcut
對某些類某些方法應用切面。
Classfilter:org.springframework.aop.ClassFilter
用來過濾類(哪些類可以應用切面)
MethodMather:org.springframework.aop.MethodMatcher
用來過濾方法(類中哪些方法應用切面)
Advisor:org.springframework.aop.PointcutAdvisor
將Pointcut與Advice結合到一起
配置檔案樣例:
<beans>
<bean id="registerServiceTarget" class="aop5.RegisterService"/>
<bean id="logAdvice" class="aop5.LogAdvice"/>
<bean id="myPointcut" class="aop5.MyPointcut"/>
<bean id="myPointcutAdvisor" class="aop5.MyPointcutAdvisor">
<property name="advice">
<ref local="logAdvice"/>
</property>
<property name="pointcut">
<ref local="myPointcut"/>
</property>
</bean>
<bean id="registerService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="registerServiceTarget"/>
</property>
<property name="interceptorNames">
<list>
<value>myPointcutAdvisor</value>
</list>
</property>
</bean>
</beans>
2、預定義切入點
① 靜態切入點:
a、NameMatchMethodPointAdviosr
org.springframework.aop.support.NameMatchMethodPointcutAdvisor
根據方法名稱的特點進行匹配
核心XML:mappedName→advice(ref)
配置檔案樣例:
<beans>
<bean id="registerServiceTarget" class="aop6.RegisterService" />
<bean id="logAdvice" class="aop6.LogAdvice" />
<bean id="namedPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="mappedName">
<value>methodOne</value>
</property>
<property name="advice">
<ref local="logAdvice"/>
</property>
</bean>
<bean id="registerService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="registerServiceTarget" />
</property>
<property name="interceptorNames">
<list>
<value>namedPointcutAdvisor</value>
</list>
</property>
</bean>
</beans>
b、RegexpMethodPointcutAdvisor
根據正則表示式匹配方法名
org.springframework.aop.support.RegexpMethodPointcutAdvisor
核心XML:pattern→advice(ref)
配置檔案樣例:
<beans >
<bean id="registerServiceTarget" class="aop6.RegisterService" />
<bean id="logAdvice" class="aop6.LogAdvice" />
<bean id="regexpAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="pattern">
<value>.*method.*</value>
</property>
<property name="advice">
<ref local="logAdvice"/>
</property>
</bean>
<bean id="registerService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="registerServiceTarget" />
</property>
<property name="interceptorNames">
<list>
<value>regexpAdvisor</value>
</list>
</property>
</bean>
</beans>
② 動態切入點:
org.springframework.aop.support.ControlFlowPointcut
③ 切入點的交叉與合併:
Pointcuts.union
配置檔案樣例:
<bean id="unionPointcut" class="aop7.UnionPointcut">
<property name="pointcuts">
<list>
<ref local="myPointcut"/>
<ref local="otherPointcut"/>
</list>
</property>
</bean>
<bean id="myPointcutAdvisor" class="aop7.MyPointcutAdvisor">
<property name="advice">
<ref local="logAdvice"/>
</property>
<property name="pointcut">
<ref local="unionPointcut"/>
</property>
</bean>
④ Introduction
一種特殊型別的Advice,為類動態增加方法和屬性。
程式設計步驟:
1)實現org.springframework.aop.IntroductionInterceptor或
繼承org.springframework.aop.support.DelegatingIntroductionInterceptor
2)使用org.springframework.aop.support.DefaultIntroductionAdvisor
配置檔案樣例:
<bean id="myIntroInterceptor" class="aop8.MyIntroductionInterceptor"/>
<bean id="myIntroInterceptorAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor">
<constructor-arg>
<ref local="myIntroInterceptor"/>
</constructor-arg>
<constructor-arg>
<value>aop8.OtherBean</value>
</constructor-arg>
</bean>
六、自動代理
Spring在生成代理物件的時候,預設情況下,會使用被代理物件的介面來生成代理物件。
如果被代理物件沒有實現介面,此時,Spring會使用CGLIB生成代理物件,此時該代理物件是被代理物件的子類。
a、BeanNameAutoProxyCreator
org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator
根據類的名稱來為符合相應名稱的類生成相應代理物件。
beanNames(list),interceptorNames
配置檔案樣例:
<bean id="namedProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>someService</value>
<value>otherService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>logAdvice</value>
</list>
</property>
</bean>
b、DefaultAdvisorAutoProxyCreator
org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
自動將Advisor與匹配的Bean進行繫結
只能與Advisor配合使用
配置檔案樣例:
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
chapter04 Spring對持久層的支援
Spring對持久層的支援:① JDBC,② O/R Mapping(Hibernate,TopLink等)
一、Spring對持久層支援採用的策略:
1、Spring對持久層“不發明重複的輪子”,即沒有重新實現新的持久層方案,對現有持久層方案做封裝,更利於使用。
2、採用DAO模式
3、提供了大量的模板類來簡化程式設計(HibernateDaoSupport,JdbcTemplate等)
4、重新設計了一套完善的異常體系結構
① 型別豐富,細化異常型別
② 全都是執行時異常(RuntimeException)
二、Spring對JDBC的支援
1、配置資料來源
方式一:採用Spring內建的資料來源,Spring內建實現 DriverManagerDataSource
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/hibdb</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>windows</value>
</property>
</bean>
方式二:採用開源資料庫產品如DBCP
DBCP提供的BasicDataSource
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/hibdb</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>windows</value>
</property>
</bean>
方式三: 直接使用容器提供的資料來源(如Tomcat,Weblogic,Sun Application Server)
JNDI資料來源:(mysql5,tomcat5.5)
step1:
在server.xml中:
<Resource name="jdbc/mydatasource" auth="Container" description="DB Connection"
type="javax.sql.DataSource" username="root" password="windows"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/tarena" maxActive="5" />
step2:
在context.xml中(conf\context.xml):
<ResourceLink name="jdbc/mydatasource" global="jdbc/mydatasource" type="javax.sql.DataSourcer"/>
step3:
在beans-config.xml:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/mydatasource</value>
</property>
</bean>
2、配置JdbcTemplate模板類(封裝了絕大多數資料庫操作)
3、配置DAO
4、配置Service
程式設計步驟:
step1: 配置資料來源
step2: 配置JdbcTemplate
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
step3:配置DAO
<bean id="orderDao" class="lab5.OrderDAOImpl">
<property name="jt"><ref bean="jdbcTemplate"/></property>
</bean>
注意: 查詢時,使用RowMapper
三、Spring對Hibernate的支援
Step1: 配置資料來源
Step2: 配置sessionfactory
<bean id="mySessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>lab6/Order.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
Step3: 配置DAO
<bean id="orderDao" class="lab6.OrderDAOHibernateImpl">
<property name="sessionFactory">
<ref bean="mySessionFactory" />
</property>
</bean>
注意:以上配置是要求dao 繼承HibernateDaoSupport
chapter05 Spring對事務的支援
一、AOP事務的含義:
事務當作一個切面,動態地織入到目標物件,形成一個代理物件。
二、Spring的事務機制
Spring支援宣告式事務。
Spring使用事務服務代理和事務管理器(如HibernateTransactionManager)來支援事務服務。
Spring對事務的邊界多了一種巢狀事務(PROPAGATION_NESTED)。
PROPAGATION_NESTED:
如果客戶端啟動了事務T1,那麼Bean啟動一個巢狀在T1中的子事務T2;
如果客戶端沒有啟動事務,那麼Bean會啟動一個新的事務,類似於REQUIRED_NEW
三、Spring中事務的使用
1、Spring中使用Hibernate事務
Step1:配置資料來源
Step2:配置sessionfactory (同上)
Step3:配置事務管理器
<bean id="myTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mySessionFactory" />
</property>
</bean>
Step4:建立事務服務代理
<bean id="saleService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<value>lab7.SaleService</value>
</property>
<property name="transactionManager">
<ref bean="myTransactionManager" />
</property>
<property name="target">
<ref bean="saleServiceTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
事務屬性描述格式:
傳播行為,隔離級別,只讀事務(read-only),回滾規則
在預設情況下,Spring的容器對於非受查異常(服務模組中丟擲的非受查異常),會回滾事務。對於受查異常,會提交事務。
如果即使發生了某種受查異常,也要回滾事務,可以用 “- 異常型別“來宣告。同樣,對於非受查異常,如果不要求回滾事務,可以用"+異常型別"來宣告。
如何簡化事務配置?
使用繼承(抽象的Service類)、自動代理。
四、Spring事務與EJB事務
1、EJB事務:
EJB的CMT管理事務方式,只能設定事務邊界(傳播行為),對於隔離性是不能設定的,並且EJB不支援巢狀事務。
2、Spring事務:
對於Spring來說, Spring的宣告式事務可以設定事務邊界(傳播行為),設定隔離級別,設定只讀事務,回滾規則(+:對於任何異常都提交,-:對於任何異常都回滾)
<property name=”transactionAttributes”>
<props>
<prop key=”*”>+異常型別1,-異常型別2</prop>
</property>
PS:Spring對巢狀事務的支援依賴與資料庫底層對巢狀式事務的支援。
chapter06 SSH整合
一、SSH:
Struts(表示層)+Spring(業務層)+Hibernate(持久層)
Struts:
Struts是一個表示層框架,主要作用是介面展示,接收請求,分發請求。
在MVC框架中,Struts屬於VC層次,負責介面表現,負責MVC關係的分發。(View:沿用JSP,HTTP,Form,Tag,Resourse ;Controller:ActionServlet,struts-config.xml,Action)
Hibernate:
Hibernate是一個持久層框架,它只負責與關係資料庫的操作。
Spring:
Spring是一個業務層框架,是一個整合的框架,能夠很好地黏合表示層與持久層。
① Web分層架構中業務層為什麼都選擇Spring?
Service層需要處理業務邏輯和交叉業務邏輯,處理事務,日誌,安全等,而這些與Spring的IoC,AOP等不謀而合。
② Web分層架構中,對於各層技術的採用應該遵循一個怎樣的標準?
1、選擇發展成熟的技術:
A、經過了專案實踐證實可行性良好
B、文件完善
C、技術一直處於可持續發展更新
2、Web應用中對於技術的選擇有賴於開發人員的技術掌握情況
二、Spring與Struts整合
前提:
必須在Web應用啟動時,建立Spring的ApplicationContext例項
方式:
1、採用ContextLoaderListener來建立ApplicationContext:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-config/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2、採用ContextLoaderPlugIn來建立ApplicationContext
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/config/sale.xml" />
</plug-in>
或者:
通過listener裝載spring應用上下文
方式一:通過Spring的ActionSupport類
ActionSupport類:
知道ApplicationContext的獲得方式。
步驟:
1、Action直接繼承ActionSupport
2、使用ApplicationContext ctx = getWebApplicationContext();取得Spring上下文
3、取得相應Bean
注意:有可能需要替換commons-attributes-compiler.jar包。
優點:
簡單
缺點:
耦合高
違反IOC
無法使用多方法的Action
方式二:通過Spring的DelegatingActionProxy類
步驟:
1、Action中,使用IOC獲得服務
2、配置struts-config.xml
<action path="/somepath" type="org.springframework.web.struts.DelegatingActionProxy"/>
3、在Spring配置檔案中
<bean name="/somepath" class="SomeAction">
<property name="service"><ref bean=""/>
</bean>
注意,要用bean name命名。
/somepath:Action的path
優點:
不使用Spring api編寫 Action
利用了IOC裝配。
可以利用容器的scope="prototype"來保證每一個請求有一個單獨的Action來處理,
避免struts中Action的執行緒安全問題。
缺點:
struts配置檔案中,所有path都對映到同一個代理類
方式三:通過Spring的DelegatingRequestProcessor類
步驟:
1、Action中,使用IOC獲得服務
2、配置struts-config.xml
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
3、在Spring配置檔案中
<bean name="/somepath" class="SomeAction">
<property name="service"><ref bean=""/>
</bean>
小結:
Spring與Struts整合方式只有兩種:
(1)由Spring容器來管理Action(方式二,方式三)
(2)Action處於容器之外(方式一)
注意:
中文問題:
設定過濾器,設定頁面編碼,資料庫編碼
三、關於Spring與EJB
1、Spring與EJB3.0的對比
Spring與EJB3.0之間的關係是競爭關係。
① Spring是一個開源的框架,而EJB3.0是一個標準(標準意味著將得到廣泛的支援以及良好的相容性),並且,採用EJB3.0,專案的後期維護得到了保證。
② Spring是一個輕量級框架,EJB3.0是一個重量級框架(完整的容器,包含所有的服務)。
③ Spring的IoC,AOP集成了大量的開源框架,可擴充套件性良好。EJB3.0的可擴充套件性則完全依賴於新的容器。
④ Spring對事務支援不如EJB3.0成熟,Spring對叢集的相容也不夠。
⑤ Spring與EJB3.0都是一個企業級開發框架,都支援宣告式事務。
2、Spring的優勢與劣勢
Spring的優勢:
① 簡化了企業級開發(對企業級服務進行了進一步的封裝)
② 採用Spring框架的程式意味著良好的分層結構設計,並保證是面向介面程式設計的
③ 用IoC,AOP容器,模組是可配置的,鬆耦合的,方便了後期維護
Spring的劣勢:
① 配置複雜,不方便維護
② 容器大量使用反射等機制裝配物件,影響效能,對於高併發的大型應用無能為力。