每日一得

          不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發(fā)
          最近關(guān)心的內(nèi)容:SSH,seam,flex,敏捷,TDD
          本站的官方站點是:顛覆軟件

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks

           

          key word : spring,service

          在基于struts+spring+hibernate的開發(fā)框架下,一般service都是直接通過在Struts的action中g(shù)etBean("yourServiceName")來獲取,那么如果在serviceA中想調(diào)用serviceB中的方法該如何呢?

          直接new 一個serviceB是不行的,因為里面可能還有依賴注入的dao等其他本來需要容器管理的資源,可以象在action中一樣getBean()么?

          獲得applicationContext就可以了:

          AppContext :

          public class AppContext {
              
          private static ApplicationContext applicationContext;
              
              
          public static ApplicationContext getApplicationContext() {
                  
          return applicationContext;
              }

              
          public static void setApplicationContext(
                      ApplicationContext applicationContext) 
          {
                  AppContext.applicationContext 
          = applicationContext;
              }

          }


          SpringService:

          public class SpringBeanService {
              
          private static SpringBeanService instance;

              
          private ApplicationContext applicationContext;

              
          public static synchronized SpringBeanService getInstance() {
                  
          if (instance == null{
                      instance 
          = new SpringBeanService();
                  }

                  
          return instance;
              }


              
          public ApplicationContext getApplicationContext() {
                  
          return this.applicationContext;
              }


              
          public void setApplicationContext(ApplicationContext applicationContext) {
                  
          this.applicationContext = applicationContext;
              }


              
          public UserService getUserService(){
                  
          return (UserService)AppContext.getApplicationContext().getBean("userService");
              }

              
              }



          ApplicationContext的初始化:

          public class ConfigLoadListener implements ServletContextListener {

              
          public void contextInitialized(ServletContextEvent contextEvent) {  
                  
          try {
                      WebApplicationContext context =WebApplicationContextUtils.getRequiredWebApplicationContext(contextEvent.getServletContext());
                      AppContext.setApplicationContext(context);

                      
          //讀配置
                      try {
                          ServletContext context2
          =contextEvent.getServletContext();
                          String path
          =context2.getInitParameter("setting.properties");
                          InputStream in 
          =context2.getResourceAsStream(path);
                          Properties properties 
          = new Properties();
                          properties.load(in);
                          GlobalConstant.setCmdbProperties(properties);
                          in.close();
                      }
           catch (IOException e) {
                          e.printStackTrace();
                      }

                  }
           catch (HibernateException e) {
                      System.out.println(
          "系統(tǒng)無法初始化,異常退出");
                      System.out.println(e);
                  }

              }

             
              
          public void contextDestroyed(ServletContextEvent contextEvent) {
              }

          }


           感覺有點麻煩,有更簡便的辦法了么?

          update(2007-5-15):
          這篇文章大家可以參考一下,和本文有類似之處:
           Struts調(diào)用Spring服務(wù)類的三種方法

          引用:

          3.朋友幫忙型  朋友多了好辦事,凡事都自己動手總有一天會活活累死,所有Action為自己需要的Service提供setter,并且在Spring中注入,好累啊。小學(xué)生都在減負了,我們也來為Action減減負吧--提供一個專門  
          查找Serivice的ServiceLocator,負責(zé)獲取所有的Service,該類為每個Service提供專門的獲得方法,如:  


           

          posted on 2007-05-14 09:05 Alex 閱讀(13393) 評論(8)  編輯  收藏 所屬分類: javaSpring

          評論

          # re: Spring中的service之間如何調(diào)用 2007-05-14 09:23 劉甘泉
          有啊,在spring里配置上b注入a即可,不過可能失去spring的事務(wù)性控制。
          另,感覺你的設(shè)計可能有問題,所以才會有serviceA掉用serviceB的問題。
          相關(guān)的業(yè)務(wù)都是放到一個service里面的,如serviceA.executeA()里面調(diào)用了daoA.insert和daoB.update 而serviceB.executeB()調(diào)用了daoB.update,看起來可以換成是serviceA調(diào)用了serviceB,其實不對的,一個事務(wù)應(yīng)該保持事務(wù)的一致性,即一個事務(wù)只應(yīng)該做一個事務(wù)的事。
          而你的那種配置方法是在serviceA中調(diào)用serviceB,serviceB本身就是由spring 控制的事務(wù),當(dāng)你在serviceA中調(diào)用過serviceB.后,spring會自動提交serviceB的事務(wù),并不是在serviceA完成的時候提交。

          如有不對請指教  回復(fù)  更多評論
            

          # re: Spring中的service之間如何調(diào)用 2007-05-14 09:29 dennis
          用了spring,還在action中使用getBean?奇怪了  回復(fù)  更多評論
            

          # re: Spring中的service之間如何調(diào)用 2007-05-14 09:46 dennis
          struts和spring的整合不應(yīng)該在action中使用getBean的方式,這完全背離了使用spring的初衷,造成了對spring的依賴,更好的方式請看江南大俠http://www.aygfsteel.com/calvin/archive/2006/11/17/81711.html

          service的互相調(diào)用,原來怎么配,現(xiàn)在也怎么配,只要在spring配置文件中設(shè)置下依賴關(guān)系,使用的service有個setter方法就可以了。看看這篇文章http://www.javaeye.com/topic/35907  回復(fù)  更多評論
            

          # re: Spring中的service之間如何調(diào)用 2007-05-14 10:05 劉甘泉
          不錯 ,嵌套事務(wù),PROPAGATION_NESTED,transactiondefinition就可以了  回復(fù)  更多評論
            

          # re: Spring中的service之間如何調(diào)用 2007-05-15 11:17 Alex
          to dennis
          我個人不太喜歡在action中注入service,感覺羅嗦了
          service中注入dao就可以了,到處在注入感覺很不爽,個人感覺.  回復(fù)  更多評論
            

          # re: Spring中的service之間如何調(diào)用 2007-05-15 14:41 劉甘泉
          @Alex
          證明你的分層思想還不到位~~,dao只是對于數(shù)據(jù)庫的操作,并不涉及業(yè)務(wù)流程,而一個業(yè)務(wù)流程可能經(jīng)過了n個dao的操作,如果注入到action中的話,那維護起來不是很麻煩,而且事務(wù)管理的好處也不在了~~~  回復(fù)  更多評論
            

          # re: Spring中的service之間如何調(diào)用 2014-03-09 20:53 xxli
          對Spring事務(wù)傳播行為最常見的一個誤解是:當(dāng)服務(wù)接口方法發(fā)生嵌套調(diào)用時,被調(diào)用的服務(wù)方法只能聲明為 PROPAGATION_NESTED。這種觀點犯了望文生義的錯誤,誤認為PROPAGATION_NESTED是專為方法嵌套準(zhǔn)備的。這種誤解遺害不 淺,執(zhí)有這種誤解的開發(fā)者錯誤地認為:應(yīng)盡量不讓Service類的業(yè)務(wù)方法發(fā)生相互的調(diào)用,Service類只能調(diào)用DAO層的DAO類,以避免產(chǎn)生嵌 套事務(wù)。  回復(fù)  更多評論
            

          # re: Spring中的service之間如何調(diào)用 2014-03-09 20:54 xxli
          具體查看文章http://www.cnblogs.com/aurawing/articles/1887030.html  回復(fù)  更多評論
            

          主站蜘蛛池模板: 黄山市| 公安县| 阿坝| 阿合奇县| 扶余县| 伊宁县| 嵊州市| 贵定县| 神木县| 屯昌县| 根河市| 东至县| 阿拉善左旗| 普安县| 利津县| 徐水县| 中西区| 错那县| 临湘市| 灵璧县| 柞水县| 滁州市| 古浪县| 额尔古纳市| 龙井市| 定襄县| 枞阳县| 神木县| 岱山县| 清苑县| 巴林右旗| 佛冈县| 漾濞| 石城县| 永靖县| 赫章县| 丁青县| 大姚县| 桐梓县| 应城市| 防城港市|