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容器方式除外)。