samtiger


QQ:418148757
Name:yangchuan
数据加载中……
关于spring2与struts1整合 的DelegatingActionProxy 委托方式及一些问题思考
     spring与struts结合,很多人都说必须要在struts-config.xml配置文件里加上org.springframework.web.struts.ContextLoaderPlugIn插件,其实这个说法不一定,spring是先查找的struts-config.xml里的配置,如果没有,再去查找web.xml里边的配置的。所以我们只需要配置web.xml就可以了。看看代码,从DelegatingActionProxy 类中查看有如下代码:
protected Action getDelegateAction(ActionMapping mapping) throws BeansException {
        WebApplicationContext wac 
= getWebApplicationContext(getServlet(), mapping.getModuleConfig());
        String beanName 
= determineActionBeanName(mapping);
        
return (Action) wac.getBean(beanName, Action.class);
    }
上边的代码是需要一个spring的应用环境对象,继续察看getApplicationContext的代码,如下:
protected WebApplicationContext getWebApplicationContext(
            ActionServlet actionServlet, ModuleConfig moduleConfig) 
throws IllegalStateException {

        
return DelegatingActionUtils.findRequiredWebApplicationContext(actionServlet, moduleConfig);
    }
好,跟踪到DelegatingActionUtils.findRequiredWebApplicationContext方法,如下:
public static WebApplicationContext findRequiredWebApplicationContext(
            ActionServlet actionServlet, ModuleConfig moduleConfig) 
throws IllegalStateException {

        WebApplicationContext wac 
= getWebApplicationContext(actionServlet, moduleConfig);
        
// If no Struts-specific context found, fall back to root context.
        if (wac == null{
            wac 
= WebApplicationContextUtils.getRequiredWebApplicationContext(actionServlet.getServletContext());
        }

        
return wac;
    }

上边的代码(if(wac==null))说明当struts配置中没有配置spring插件就回到web.xml配置中去找,你可以继续跟踪代码就可以找到他是怎么创建applicationContext对象的。


问题2 :我们知道struts1里面的action是非线程安全的,(关于这一点,你可以查看struts的源代码,可发现struts的在RequestProcessor里利用了享元模式来管理每一个action的,而RequestProcessor对象是存储在servletContext里面的),我们用spring的DelegatingActionProxy 类作代理,所以是由 spring去创建具体的action类,这样创建的action应该也是非线程安全的
因此,如果我们向用ioc的方式往action里注入一些属性的话,想必会带来并发访问冲突问题,故,我们是不是需要在spring里配置action的bean的时候应该配置成非单例模式 (即singleton="false")呢;
问题3:在spring中bean的默认配制都是singleton="true"的,尽管我们把action配置成非一个实例,但是在我们的业务逻辑bean里我们还是没有逃脱多线程并发访问时带来的安全隐患,因此,在我们编写的业务逻辑层bean的时候,是不是也需要注意使用两种方式来解决这个问题呢,我们要不就不要在该bean内写类属性(字段),要不就是在spring配置里将其配置成singleton="false"。

总结上述,其实我们在实现ssh1框架的时候,只要注意在action 里和业务逻辑bean里等地方都尽量取消类字段,就可以避免多线程并发访问的问题

posted on 2008-01-25 17:42 sam.chuan.yang 阅读(3221) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: