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

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

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

    隨筆 - 1  文章 - 37  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿(16)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    test

    搜索

    •  

    最新評論

    一、Spring Framework
    通常Spring的web應用結構層次:
    1,ContextLoaderServlet,創建一個ContextLoader做為整個web應用的Loader,它會為自己創建一個web應用級別的WebApplicationContext,接著默認加載applicationContext.xml里面的bean
    2,DispatcherServlet,同樣創建一個WebApplicationContext,加載dispatch-bean,它會將ContextLoader的WebApplicationContext做為自己的父ApplicationContext

    二、Spring-OSGI
    通過Spring-osgi規范可以了解到spring-osgi會為每一個有spring-bean配置文件的bundle創建一個ApplicationContext,spring-bean配置文件里面的bean則被它加載,所以Dispatch-bean-loader無法找到spring-osgi-bean

    三、RESOLVER
    首先要先得到bundle的ApplicationContext,然后創建一個自定義的ContextLoader-BundleContextLoader,不加載配置文件,重寫loadParentContext方法,將父ApplicationContext設置成bundle的ApplicationContext,然后生成一個自定義的WebApplicationContext-BundleWebApplicationContext,里面的bean信息直接從parentApplicationContext里面獲取。本來spring規范里面寫著org.springframework.osgi.context.support.WebApplicationContext ,但是找個底朝天,也沒找到,可能還沒出呢吧,于是只能自己寫了。
    bundle的ApplicationContext可通過org.springframework.context.ApplicationContextAware.setApplicationContext(ApplicationContext applicationContext)得到

    四、BundleContextLoaderServlet
    在org.phrancol.osgi.jpetstore.springmvc里新建類BundleContextLoaderServlet
    public class BundleContextLoaderServlet extends ContextLoaderServlet {
        
    private final ApplicationContext applicationContext;
        
    private BundleContext ctx;

        
    public BundleContextLoaderServlet(BundleContext ctx,
                ApplicationContext appContext) 
    {
            
    this.ctx = ctx;
            
    this.applicationContext = appContext;
        }

        
        
    /**
         * 重寫該方法,用于構造一個自定義的BundleContextLoader
         
    */

        
    protected ContextLoader createContextLoader() {
            
    return new BundleContextLoader(applicationContext, ctx);
        }

    }
    五、BundleContextLoader
    在org.phrancol.osgi.jpetstore.springmvc里新建類BundleContextLoader
    public class BundleContextLoader extends ContextLoader {
        
    private final ApplicationContext applicationContext;
        
    private BundleContext bundleContext;

        
    public BundleContextLoader(ApplicationContext appContext, BundleContext ctx) {
            
    this.applicationContext = appContext;
            
    this.bundleContext = ctx;
        }

        
        
    /**
         * 重寫該方法,讓其返回的ParentContext是Bundle里的那個ApplicationContext
         
    */

        
    protected ApplicationContext loadParentContext(ServletContext servletContext)
                
    throws BeansException {
            
    return applicationContext;
        }


        
    /**
         * 生成一個自定義的BundleWebApplicationContext,返回的bean信息直接從Parent獲取
         * 這里的代碼請參考org.springframework.osgi.extender.support.ApplicationContextCreator.run()方法里的代碼
         
    */

        
    protected WebApplicationContext createWebApplicationContext(
                ServletContext servletContext, ApplicationContext parent)
                
    throws BeansException {
            ClassLoader contextClassLoader 
    = Thread.currentThread()
                    .getContextClassLoader();
            
    try {
                ClassLoader cl 
    = BundleDelegatingClassLoader
                        .createBundleClassLoaderFor(bundleContext.getBundle(), getClass()
                                .getClassLoader());
                Thread.currentThread().setContextClassLoader(cl);
                LocalBundleContext.setContext(bundleContext);
                
    return new BundleWebApplicationContext(parent, servletContext);
            }
     finally {
                Thread.currentThread().setContextClassLoader(contextClassLoader);
            }

        }

    }

    六、BundleWebApplicationContext
    在org.phrancol.osgi.jpetstore.springmvc里面新建類BundleWebApplicationContext,所有的方法都返回parent的方法返回值
    public class BundleWebApplicationContext implements WebApplicationContext {
        
        
    private final ApplicationContext parentApplicationContext;
        
    private ServletContext servletContext;
        
        
    public BundleWebApplicationContext(ApplicationContext parentApplicationContext,
                ServletContext servletContext)
    {
            
    this.parentApplicationContext = parentApplicationContext;
            
    this.servletContext = servletContext;
        }


        
    public ServletContext getServletContext() {
            
    // TODO Auto-generated method stub
            return servletContext;
        }


        
    public AutowireCapableBeanFactory getAutowireCapableBeanFactory()
                
    throws IllegalStateException {
            
    // TODO Auto-generated method stub
            return parentApplicationContext.getAutowireCapableBeanFactory();
        }


        
    public String getDisplayName() {
            
    // TODO Auto-generated method stub
            return parentApplicationContext.getDisplayName();
        }

            .
    }

    七、修改
    1,修改接口HttpServiceRegister.serviceRegister(BundleContext context),改成
    serviceRegister(BundleContext context, ApplicationContext bundleApplicationContext);
    2,修改SpringmvcHttpServiceRegister.serviceRegister(BundleContext context),改成
    serviceRegister(BundleContext context, ApplicationContext bundleApplicationContext)
    3,SpringmvcHttpServiceRegister.serviceRegister方法修改一下
    public void serviceRegister(BundleContext context, ApplicationContext bundleApplicationContext) {
            
    try {
                ServiceReference sr 
    = context.getServiceReference(HttpService.class
                        .getName());
                HttpService httpService 
    = (HttpService) context.getService(sr);
                httpService.registerResources(
    "/""/web"null);
                httpService.registerServlet(
    "/*.jsp"new JspServlet(context
                        .getBundle(), 
    "/web"), nullnull);
                Dictionary
    <String, String> initparams = new Hashtable<String, String>();
                initparams.put(
    "load-on-startup""1");
               
    /*  編輯器的問題,這4行代碼不是注釋。。。 */
                ContextLoaderServlet contextloaderListener = new BundleContextLoaderServlet(
                        context, bundleApplicationContext);
                httpService.registerServlet("/ContextLoader",
                        contextloaderListener, initparams, null);
                /*   
    */

                DispatcherServlet dispatcherServlet 
    = new DispatcherServlet();
                dispatcherServlet
                        .setContextConfigLocation(
    "META-INF/dispatcher/petstore-servlet.xml");
                initparams 
    = new Hashtable<String, String>();
                initparams.put(
    "servlet-name""petstore");
                initparams.put(
    "load-on-startup""2");
                httpService.registerServlet(
    "/*.do", dispatcherServlet, initparams,
                        
    null);
            }
     catch (Exception e) {
                e.printStackTrace(System.out);
            }

        }

    OK,這下應該沒問題了,啟動看看效果
    倒,還是報錯。。。。。。

    八、HttpContext
    來看看org.osgi.service.http.HttpService.registerServlet的代碼
      * Servlets registered with the same <code>HttpContext</code> object will
      * share the same <code>ServletContext</code>.
    原來是這樣,注冊了2個servlet,于是生成了2個不同的HttpContext,那就只生成一個試試
    HttpContext defaultContext = new DefaultHttpContext(context.getBundle());

    httpService.registerServlet(
    "/init-context-loader-petsore-web",
                        contextloaderListener, initparams, defaultContext);

    httpService.registerServlet(
    "/*.do", dispatcherServlet, initparams,
                        defaultContext);
    再啟動,一切順利,訪問頁面也正常。

    九、打完收工
    將org.phrancol.osgi.jpetstore.springmvc/METS-INF/dispatcher/petstore-servlet.xml里面的bean補全(注意還有2個bean需要注冊和引用),再運行,就OK了。
    posted on 2007-09-07 18:15 Phrancol Yang 閱讀(2341) 評論(1)  編輯  收藏 所屬分類: OSGI

    FeedBack:
    # re: Developing Equinox/Spring-osgi/Spring Framework Web Application Part 3 - 找到我的Bean 2007-09-08 13:05 Friszart
    OSGI的確是有它的優越性,但還是個復雜的東東,
    猜還是得等到OSGI on Rails之類的框架發明后,才可能真正流行起來。  回復  更多評論
      
    主站蜘蛛池模板: 91情国产l精品国产亚洲区| 一级特级aaaa毛片免费观看| 亚洲伊人久久大香线蕉啊| 99久久婷婷国产综合亚洲| 亚洲中文字幕一区精品自拍| 男女污污污超污视频免费在线看| 亚洲M码 欧洲S码SSS222| 亚洲第一福利网站在线观看| 亚洲国产另类久久久精品| va天堂va亚洲va影视中文字幕| 亚洲国产高清在线一区二区三区| 18禁止看的免费污网站| 又硬又粗又长又爽免费看 | 亚洲人成网国产最新在线| 成人午夜影视全部免费看| 99在线观看视频免费| 国产午夜无码片免费| 97在线观免费视频观看| 亚洲AV无码乱码在线观看裸奔| 亚洲真人日本在线| 美女视频黄免费亚洲| 免费91最新地址永久入口| 亚洲不卡AV影片在线播放| 久久综合久久综合亚洲| 亚洲三级视频在线观看| 嫩草在线视频www免费观看| 免费h成人黄漫画嘿咻破解版| 真实乱视频国产免费观看| 中文字幕亚洲综合久久2| 免费观看在线禁片| 国产亚洲色婷婷久久99精品| 国产乱子伦精品免费视频| 免费在线看污视频| 久久精品国产精品亚洲精品| 亚洲va久久久噜噜噜久久天堂| 亚洲国产精品无码专区| 免费无码一区二区三区蜜桃| 亚洲国产日韩在线视频| 亚洲国产成人精品久久| 四虎在线最新永久免费| 国产jizzjizz视频免费看|