您的位置:首页 > 编程语言 > Java开发

web应用中spring提供了几种加载方式

2010-03-28 13:43 295 查看
web应用中spring提供了几种加载方式:
 1.在web.xml中配置:
 < context-param> 
     < param-name> contextconfiglocation< /param-name> 
     < param-value> /web-inf/applicationcontext.xml< /param-value> 
 < /context-param> 
 < servlet> 
     < servlet-name> context< /servlet-name> 
     < servlet-class> org.springframework.web.context.contextloaderservlet< /servlet-class> 
     < load-on-startup> 1< /load-on-startup> 
 < /servlet> 
 2.在web.xml中配置:
 < context-param> 
     < param-name> contextconfiglocation< /param-name> 
     < param-value> /web-inf/applicationcontext.xml< /param-value> 
 < /context-param> 

 

 < listener> 
     < listener-class> org.springframework.web.context.contextloaderlistener< /listener-class> 
 < /listener> 

 1和2两种方式,实质是一样的,因为在他们各自的初始化方法中,调用的是一样的创建spring容器的方法
 这是1中的:
 public void init() throws servletexception {
        contextloader = createcontextloader() 
        contextloader.initwebapplicationcontext(getservletcontext()) 
       }
 这是2中的:
 public void contextinitialized(servletcontextevent event) {
        contextloader = createcontextloader() 
        contextloader.initwebapplicationcontext(event.getservletcontext()) 
       }
 所以这两种加载spring容器的方法本质上一样,spring容器初始化完后,就放到servletcontext中。
 其key值为:webapplicationcontext.root_web_application_context_attribute
 我们如果要使用webapplicationcontext则需要从servletcontext取出,spring提供了一个webapplicationcontextutils类,可以方便的取出

 webapplicationcontext,只要把servletcontext传入就可以了。
 获得applicationcontext 方法:
 servletcontext context = getservletcontext() 

 webapplicationcontext applicationcontext  = webapplicationcontextutils
      .getwebapplicationcontext(context) 
    
  datasource datasource=(datasource)applicationcontext.getbean(" datasource" ) 
 这个方便的类是针对以上面的方式创建的spring容器而用的。

 
 3.在struts.xml中配置加载spring的插件:
 < plug-in classname=" org.springframework.web.struts.contextloaderplugin" > 
   < set-property property=" contextconfiglocation"  value=" /web-inf/applicationcontext.xml /web-inf/action-servlet.xml"  /> 
 < /plug-in> 
 这种方法初始化的spring容器,也放在servletcontext中,
 其key值为:
 contextloaderplugin.servlet_context_prefix+moduleconfig.getprefix()(具体请查看源代码)。

 
 4.在web.xml中配置(这种很少见):
 < servlet> 
         < servlet-name> dispatcherservlet< /servlet-name> 
         < servlet-class> org.springframework.web.servlet.dispatcherservlet< /servlet-class> 
         < init-param> 
             < param-name> contextconfiglocation< /param-name> 
             < param-value> /web-inf/applicationcontext< /param-value> 
         < /init-param> 
     < /servlet> 

 获得applicationcontext 方法:
 servletcontext context = getservletcontext() 
   
   xmlwebapplicationcontext applicationcontext = (xmlwebapplicationcontext) context.getattribute

 (" org.springframework.web.servlet.frameworkservlet.context.dispatcherservlet" ) 

 
   datasource datasource=(datasource)applicationcontext.getbean(" datasource" ) 

 
 spring和struts的结合方式。
 两者的结合可以有以下三种方式:
 1.使用 spring 的 actionsupport 类整合 structs 
 2.使用 spring 的 delegatingrequestprocessor 覆盖 struts 的 requestprocessor 
 3.将 struts action 管理委托给 spring 框架 

 
 第1种方式用我们自己的action继承actionsupport。这种方式只是方便了我们在action中获得spring容器对象,在actionsupport中提供了getwebapplicationcontext()方法。获得了spring容器后,就可以享用spring容器中的bean了。

 
 第2种方式和第3种方式,都是把struts action 管理委托给 spring 框架 ,只是委托方式不一样。
 第2种方式使用 spring 的 delegatingrequestprocessor 覆盖 struts 的 requestprocessor。而delegatingrequestprocessor 所做的工作,也就是,获得spring容器,获得被spring容器管理的真正action。

 第3种方式在struts.xml中的action配置中配置:
  < action    path=" /searchsubmit"   type=" org.springframework.web.struts.delegatingactionproxy" >  ...
 而这个代理action:delegatingactionproxy所做的工作也是,获得spring容器,获得被spring容器管理的真正action。

 这3种结合方式,都需要获得spring容器,而上面也说到,spring容器的创建也有三种方式(本质上是三种,目前为止我知道的)。
 三种创建spring容器的方式,都在他们创建完spring容器后,将spring容器,放到servletcontext对象中,但key值不一样。这也就决定了获得spring容器的方法是不同的。

 在这三种spring和struts的结合方式中都通过以下方式获得spring容器:
 delegatingactionutils.findrequiredwebapplicationcontext(actionservlet actionservlet  moduleconfig moduleconfig)
 而这种方法会先去寻找以struts插件形式,创建的spring容器。也就是以上面spring加载方式3中的key值到servletcontext中找。
 如果找不到,再调用webapplicationcontextutils.getwebapplicationcontext(servletcontext context)方法获得spring容器。

 由webapplicationcontextutils类获得的spring容器和由delegatingactionutils类获得的spring容器是不同的。这两种获得方法是针对不同的spring容器创建方法的。前者对应的创建方法是上面spring创建方法的第1,2两种。后者对应的创建方法是上面spring创建方法的第3种。

 
 结论:spring和struts的三种结合方式中,会先去寻找以struts插件形式,创建的spring容器。所以我们在struts中配置spring的加载插件,可以满足这三种结合方式。在找不到以struts插件形式,创建的spring容器后,会去找以contextloaderlistener或contextloaderservlet创建的spring容器,所以,不管以那种方式创建的spring容器都能满足spring和struts的三种结合方式。(第4种创建spring容器方式除外)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息