问题描述
- 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中所持有的那个单例。
解决方案
谢谢各位了,查看了下源码,发现此处配置有错误。
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>
解决方案四:
有一个包叫做 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>
时间: 2024-10-21 03:40:11