欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
spring的那些事兒
相信spring現在已經(jīng)成為j2ee開(kāi)發(fā)的首選框架,也深受廣大java開(kāi)發(fā)者的喜愛(ài),它的ioc、aop以及各種擴展應用都使開(kāi)發(fā)者受益。它不僅是一個(gè)開(kāi)發(fā)框架,同時(shí)還把很多優(yōu)秀的設計理念潛移默化的傳遞給了使用者...好了,具體spring有多優(yōu)秀不是這篇文章的重點(diǎn),以下就談一下筆者在項目中使用spring的實(shí)際經(jīng)驗吧。

1 項目的哪些地方需要用到spring
  這應該是一個(gè)相當大的話(huà)題,不過(guò)還是有必要闡述一下。就當前典型的j2ee應用或web應用上流行的mvc(如ssh)框架而言,spring應用在以下幾個(gè)方面
  核心開(kāi)發(fā)框架:spring作為核心容器,通過(guò)主要組件BeanFactory并使用ioc實(shí)現對所有bean的管理。在實(shí)際應用中,首先要秉承接口模式的編程思路,定義應用類(lèi)之前先定義接口,然后再定義實(shí)現類(lèi),而調用的時(shí)候則調用接口而不是實(shí)現類(lèi)。同時(shí)需要配置一個(gè)或多個(gè)spring的xml配置文件,把調用接口映射到實(shí)現類(lèi)。
  dao端的框架支持:在三層框架模式下(web,service,dao),通過(guò)HibernateTemplate和JdbcTemplate等支持類(lèi),在dao層對jdbc以及Hibernate等主流的ORM數據庫調用模式進(jìn)行支持。一般都有專(zhuān)門(mén)的jdbc以及hibernate的配置文件對DAO層使用的bean進(jìn)行設置。
  service端的框架支持:在serivce層通過(guò)ioc進(jìn)行bean的管理配置,同時(shí)進(jìn)行事務(wù)控制的定義。
  aop:利用攔截器配置管理特性
  jndi:利用spring的context組件對jndi進(jìn)行定義,通常用于數據庫連接池的配置和查找
  其他:spring1.2版本的mvc組件是針對web端的應用框架,盡管理念非常oop,不過(guò)實(shí)際使用的時(shí)候確實(shí)不如struts2好使,spring 2.0以后的mvc據說(shuō)有很大改進(jìn),以后有機會(huì )再用吧。另外spring的定時(shí)任務(wù)(job)也經(jīng)常用到,后邊會(huì )有提及。
 
2 spring的orm組件的使用經(jīng)驗
  ssh框架的一個(gè)典型應用,通過(guò)HibernateTemplate實(shí)現spring與hibernate的集成。一般都是通過(guò)在配置文件向繼承HibernateDaoSupport的dao實(shí)現類(lèi)注入sessionFactory,這個(gè)sessionFactory實(shí)現類(lèi)一般被定義為L(cháng)ocalSessionFactoryBean,而LocalSessionFactoryBean這個(gè)類(lèi)也屬于spring的hibernate支持包,它的一個(gè)重要屬性是dataSource,對應的是jdbc的DataSource接口,而這個(gè)dataSource又可以通過(guò)ioc的方式注入實(shí)際的實(shí)現類(lèi),這個(gè)類(lèi)既可以是各種java連接池的DataSource實(shí)現類(lèi),也可以是JndiObjectFactoryBean--spring用于進(jìn)行數據源查找的jndi實(shí)現類(lèi)。綜上所述,正式由于這一連串的聯(lián)系,實(shí)現了hibernate模式下的數據庫接入。而jdbc模式也是如此聯(lián)系,不同的是spring使用JdbcTemplate類(lèi)進(jìn)行支持。在使用中一些細節需要注意,比如
  如何實(shí)現批量更新:HibernateTemplate的bulkUpdate方法可以用hql語(yǔ)句直接進(jìn)行批量更新
  對結果列表進(jìn)行加工:不論通過(guò)jdbc還是hibernate方式,如果需要對find方法取得的列表中的對象進(jìn)行加工,顯然使用回調模式進(jìn)行效率更高。實(shí)際上如果使用HibernateTemplate并且希望查詢(xún)出的結果不是對象列表而是數組列表,那么也可以使用回調,如下:
    String hql = "select t.id,t.name from test t";
List list = (List) this.getHibernateTemplate().execute(
     new HibernateCallback() {
      public Object doInHibernate(Session session)
        throws SQLException, HibernateException {
       SQLQuery query = session.createSQLQuery(sql);
       List children = query.list();
       return children;
      }
     });  
Iterator it = list.iterator();
while(it.hasNext()){
Object[] obj = (Object[])it.next();
System.out.println("id:" + obj[0]);
//do some business here
}
如上述代碼所示,某些時(shí)候我們希望直接使用字段來(lái)進(jìn)行邏輯處理,那么HibernateTemplate的find方法顯然是不合適的,而回調模式返回的list中的內容是對象數組
調用存儲過(guò)程:HibernateTemplate可以通過(guò)回調調用存儲過(guò)程
hibernateTemplate.execute(new HibernateCallback(){
   public Object doInHibernate(Session session) throws SQLException{
    CallableStatement cs = session.connection().prepareCall("{call usr.someProc}"); 
    cs.executeUpdate();
    return null;
   }
}
);  
      
3 spring的事務(wù)控制
在項目中,一般使用spring的聲明式方法控制數據庫事務(wù),定義數據庫事務(wù)只需要通過(guò)配置文件中配置即可,這種模式的技術(shù)基礎是基于A(yíng)OP的。
事務(wù)配置定義:在三層構架中,通常都在service層進(jìn)行業(yè)務(wù)邏輯處理,以及事務(wù)控制。因此spring在service層可以單獨定義一個(gè)配置文件,映射service層中使用的bean,并且在定義這個(gè)bean的配置同時(shí)進(jìn)行事務(wù)聲明,有多種方式。最直接的方式是定義這個(gè)bean的實(shí)現類(lèi)為T(mén)ransactionProxyFactoryBean--spring的事務(wù)控制代理,這種事務(wù)配置可以參見(jiàn)下面的代碼例子:
<bean id="someBusinessBean"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager"><ref bean="transactionManager"/></property>
    <property name="target"><ref bean="someBusinessBeanImpl"/></property>
    <property name="transactionAttributes">
        <props>
            <prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
            <prop key="update*">PROPAGATION_REQUIRED</prop>
            <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
        </props>
    </property>
</bean>
在上面的代碼中定義了someBusinessBean這個(gè)bean,其中target屬性中定義實(shí)際的業(yè)務(wù)接口實(shí)現類(lèi)。并且在transactionAttributes屬性中針對method進(jìn)行事務(wù)聲明,最常用的聲明是PROPAGATION_REQUIRED--支持當前事務(wù),如果當前沒(méi)有事務(wù),就新建一個(gè)事務(wù)。另外可以定義只讀事務(wù)readOnly,用于只讀的數據庫操作。同時(shí)我們還注意到事務(wù)定義中包含了異常情況的配置:如果出現MyCheckedException這個(gè)自定義異常,則數據庫進(jìn)行回滾。
還有一種方式是繼承式事務(wù)定義,例子如下:
    <bean id="txProxyTemplate" abstract="true"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            <props>
                <prop key="insert*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
                <prop key="update*">PROPAGATION_REQUIRED,-MyCheckedException</prop>
                <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>
    </bean>
    <bean id="someBusinessBean" parent="txProxyTemplate">
        <property name="target">
            <bean class="com.myBusi.someBusinessBeanImpl">
                <property name="dao" ref="dao"/>
            </bean>
        </property>
    </bean>   
  可以看出,這種方式先使用一個(gè)父類(lèi)作為事務(wù)控制的統一定義,然后具體的業(yè)務(wù)bean通過(guò)繼承來(lái)實(shí)現事務(wù)的配置。其實(shí)這2中配置方式并沒(méi)有本質(zhì)的區別,只是第二種定義起來(lái)會(huì )省事一點(diǎn)。
  另外在實(shí)際項目中有一個(gè)發(fā)現,在websphere6.0的容器下部署的web應用,使用websphere自帶的數據庫連接池,當spring事務(wù)配置為readOnly,在數據量比較大,并且有一定并發(fā)量時(shí)會(huì )導致websphere連接池拋出異常,并導致性能?chē)乐叵陆?。去掉readOnly選項就恢復正常了,這種情況不容易在測試環(huán)境重現,因此只能去掉readOnly選項,發(fā)現去掉以后性能也沒(méi)有太多的下降。
  另外如果一些特殊的場(chǎng)景直接在代碼中進(jìn)行事務(wù)提交(比如大批量插入數據),則需要用到spring的編程事務(wù),PlatformTransactionManager這個(gè)類(lèi)是spring針對編程式事務(wù)的支持類(lèi)。

  4 spring與數據庫連接池
    在spring中可以很方便的配置數據庫連接池,一種是直接配置連接池,以proxool連接池為例,配置代碼如下:
    <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
    <property name="alias"><value>mydb</value></property>
        <property name="user"><value>test</value></property>
        <property name="password"><value>test</value></property>
        <property name="driver"><value>com.mysql.jdbc.Driver</value></property>
        <property name="driverUrl"><value>jdbcUrl</value></property>
        <property name="minimumConnectionCount"><value>10</value></property>
        <property name="maximumConnectionCount"><value>20</value></property>
        <property name="prototypeCount"><value>1</value></property>
        <property name="houseKeepingSleepTime"><value>90000</value></property>                       
    </bean>   
    如上,在配置文件中定義了dataSource這個(gè)bean,映射到ProxoolDataSource這個(gè)proxool的數據庫數據源的實(shí)現類(lèi),在屬性里的配置就是連接池的一些基本參數
    我想更常用的還是使用jndi作為數據源,配置代碼如下:
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName"><value>jdbc/mydblink</value></property>
    </bean>   
    在上面的代碼中使用JndiObjectFactoryBean作為數據源,而這個(gè)數據源實(shí)際負責實(shí)現jndi的查找,在容器中查找到j(luò )ndiName屬性定義的名稱(chēng)所對應的實(shí)際的數據源,來(lái)提供給應用進(jìn)行調用。實(shí)際的數據源則是在tomcat、weblogic、websphere等中間件容器中定義的。

   5 其他的spring心得
   直接獲得bean:有很多時(shí)候,我們不希望頻繁的修改配置文件以及增加set方法來(lái)得到spring容器定義的bean,那么可以使用ApplicationContext的getBean方法來(lái)直接獲取bean的實(shí)例。
   job定義:spring支持定時(shí)計劃任務(wù),一種是一次性觸發(fā),更有用的一種的定時(shí)輪詢(xún),寫(xiě)法例子如下:
            "0 0/5 14-18 * * ?" 在每天下午2點(diǎn)下午6點(diǎn)期間的每5分鐘觸發(fā)
   OpenSessionInView:spring為了支持在頁(yè)面中延遲加載事務(wù)的一個(gè)filter,建議謹慎使用,容易對數據庫連接性能造成瓶頸
  
   總結:以上列舉了一些項目中使用spring的地方,相信還有更多的沒(méi)有列舉出來(lái),在以后的文章里再補充吧
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
spring 聲明試事務(wù)代理
當 Hibernate 遇上 Spring
Spring事務(wù)管理
Spring + Atomikos 分布式事務(wù)實(shí)現方式
spring Transaction Manager和hibernate session 吐血經(jīng)驗談
深入spring事務(wù)管理
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久