Spring如何给Struts生成新action对象?

Spring3.2.12
Struts2.3.20

看struts代码:

@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
@ParentPackage("struts-default")
@Namespace("/test")
public class TestAction {

    private String flag;

    @Action(value = "testAction", results = { @Result(name = "success", location = "/index.jsp") })
    public String test() {
        System.out.println("request struts.");
        try {
            WebApplicationContext context = WebApplicationContextUtils
                    .getWebApplicationContext(ServletActionContext.getServletContext());
            TestAction test = context.getBean("testAction", TestAction.class);
            System.out.println("this:" + this.flag+"\t" + this);
            System.out.println("spring:" + test.flag+"\t" + test);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }

    @PostConstruct
    public void setFlag() {
        this.flag = "From Spring";
    }

运行结果:

 request struts.
this:From Spring    toString:com.me.permission.action.TestAction@732efcfe
spring:From Spring  toString:com.me.permission.action.TestAction@2140243b
request struts.
this:From Spring    toString:com.me.permission.action.TestAction@11e3c2c6
spring:From Spring  toString:com.me.permission.action.TestAction@2140243b
request struts.
this:From Spring    toString:com.me.permission.action.TestAction@521d590d
spring:From Spring  toString:com.me.permission.action.TestAction@2140243b

运行结果 说明,spring中持有一个TestAction的对象,而且是单例;
请求action的时候,是spring给struts生成的action,但是每一次都是新的,并不是spring所持有的那个单例,这是为什么哪?
怎么才能让spring所持有的那个单例,给struts哪?让struts每次请求都使用spring中所持有的那个单例。

3个回答

谢谢各位了,查看了下源码,发现此处配置有错误。
action不需要配置
@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON),
_而struts在通过插件向spring索要action对象的时候,给spring传递的是此action的全类名,所以不需要再spring中配置action的bean,spring也可以根据struts提供的全类型找到该bean,并将其实例化,交给struts。

将TestAction对象生成方式采用静态方式生成,在TestAction声明静态代码块来获取该对象

有一个包叫做 struts2-spring-plugin-2.1.6.jar,再去web.xml里面配置 一下就OK了

contextConfigLocation
<!-- /WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml -->
classpath:beans.xml

 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    <!-- default: /WEB-INF/applicationContext.xml -->
</listener>
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐