1. 程式人生 > >Spring知識點總結大全

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的劣勢:

① 配置複雜,不方便維護

② 容器大量使用反射等機制裝配物件,影響效能,對於高併發的大型應用無能為力。