<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    每日一得

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

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

     

    key word : spring,service

    在基于struts+spring+hibernate的開發框架下,一般service都是直接通過在Struts的action中getBean("yourServiceName")來獲取,那么如果在serviceA中想調用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(
    "系統無法初始化,異常退出");
                System.out.println(e);
            }

        }

       
        
    public void contextDestroyed(ServletContextEvent contextEvent) {
        }

    }


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

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

    引用:

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


     

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

    評論

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

    如有不對請指教  回復  更多評論
      

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

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

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

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

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

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

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

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

    主站蜘蛛池模板: 免费可以在线看A∨网站| 久久久久久国产a免费观看不卡 | 免费A级毛片av无码| a级成人免费毛片完整版| 中文字幕不卡高清免费| 13小箩利洗澡无码视频网站免费| 大地资源在线资源免费观看| 国产免费拔擦拔擦8X高清在线人| 免费国产在线视频| 最近2019中文字幕免费直播| 4455永久在线观免费看| 免费观看黄网站在线播放| 天天看免费高清影视| 国产成人免费ā片在线观看| 亚洲精品99久久久久中文字幕| 中文字幕中韩乱码亚洲大片| 亚洲国产成人精品无码区在线观看| 亚洲AV本道一区二区三区四区| 亚洲综合免费视频| 伊人久久亚洲综合影院首页| 精品一区二区三区免费毛片| 91av免费在线视频| 久久午夜伦鲁片免费无码| 两性刺激生活片免费视频| 精品剧情v国产在免费线观看| 亚洲成a人无码av波多野按摩| 在线日韩日本国产亚洲| 亚洲综合精品一二三区在线| 亚洲另类自拍丝袜第1页| 亚洲AV无码资源在线观看| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 中文字幕日本人妻久久久免费| 蜜桃AV无码免费看永久| 午夜神器成在线人成在线人免费| 亚洲精品综合久久| 色拍自拍亚洲综合图区| 亚洲AV无码男人的天堂| 永久免费av无码网站yy| 成人无码区免费视频观看| 亚洲真人日本在线| 亚洲国产成人久久77|