struts2+spring问题

有个baseAction 标示为spring scope:prototype,这里基类里边有其他service的注入(autowire貌似默认是单例吧),那么在struts2中每次默认访问都会生成一个action 这个action又继承了baseaction 那么这个类是归struts2管啊,还是spring管啊,如果是归spring管 ,那么每次都是从新产生一个action,在action中的那些service注入的又是单例,会不会有什么影响呢?

[quote]我只是想说作用在抽象类上边有没有什么意义 [/quote]
很明确地讲:“没有”

所有的Bean都是Spring管理的

Service和Dao等,都是单例,其他的Action新建都是引用这个单例对象,并没有新建

但是Action就是多例的,因为不同的请求,对应的属性都不一样

你说要继承一个BaseAction,这个我也建议是多例

因为如果你只是增加一些固定属性的话,没有问题

但是如果增加一些动态的,比如

private int pageNumber;
private int pageSize;

之类的,最好用多例

看你在spring中这样配置action bean了。

注意:struts2的哲学是action不使用单例,是多例的,而spring的哲学是bean默认都是单例的。

如果要调和他们之间的问题,应当在spring的bean配置[b][color=red]设置scope属性=prototype[/color][/b],切忌切忌,否则action就变成了单例的了。

所有的Bean都是Spring管理的 ,struts的action都是prototype类型的,所以在spring配置的action的时候,设置scope属性为prototype。

应该这样讲,struts2默认的objectFactory是spring,记得struts.xml里有时会看到这样一句[code="xml"][/code]
这句可以不写,但struts2默认就是这样设置的,所有action都通过spring来管理。
所以楼主这句[quote]默认情况下struts2是自己管理scope[/quote]的讲法有所偏差,只有当没有spring的时候,struts2才会使用自建的ioc容器。
其实spring里action是可以设为singleton的,但可能会有线程问题,当你的action类本身是线程安全的时候,scop是不是prototype都无所谓,只不过大家平时按照struts2的习惯会写成prototype而已。

首先来分析下以下代码(对于xml配置的一样):
[code="java"]
@Controller
@Scope("prototype")
public abstract class BaseAction extends ActionSupport implements ServletRequestAware, ServletResponseAware{
@Autowired
protected IUserManageService userManageService;
....
}
}
[/code]
1. @Controller 这句表明spring将负责生产BaseAction的子类对象(工厂模式)
2. @Scope("prototype") 表示每次从spring工厂获取BaseAction(其子类)对象时将重新new(不是单例模式)
3. @Autowired IUserManageService表示spring会把容器内的IUserManageService对象自动注入BaseAction.userManageService,注意:这里的IUserManageService对象的生成依赖于你怎样配置的IUserManageService,即依赖IUserManageService的@scope配置。

楼上分析的不对,@Controller和@Scope这两个annotation加在BaseAction上其实是没有效果的,因为spring的annotation是不会继承的,也就是说必须在具体的Action实现类上面配置@Controller和@Scope才会起作用,spring容器才会把这个Action管理起来,不然这个Action在ApplicationContext里是找不到的,只能是struts2自己管理,这也是我之前提到的,当spring里没有的时候会由struts2管理action。

[quote]fmjsjx[/quote] 说得对(我失言了~ ~),加在类上的注解Controller和Scope,在BaseAction上,[code="java"][color=red]并不能影响到子类[/color][/code]。

你必须自己在子类上写上@Controller和@Scope

[quote]@Scope("prototype")意思是说继承这个类的都是多例 可以这么说吗?[/quote]

注意这些注解起作用的环境都是必须[b][color=darkred]运行在Spring容器[/color][/b]中,负责无作用。

你的问题@Scope("prototype")可以理解为多例。
prototype的意思是,每次从Spring中获取bean时都根据配置自动,重新构造这个bean(就是new)然后给你使用。

[quote]
@Controller 这个东西配置到了抽象类上是不起作用的,是不是因为不能New?那么抽象类配置@Controller 没有意义,是吗?由于不能new出来所以也就没有多例和单例一说吗? [/quote]
从结果上差不多,但原因不是因为不能new,而是因为[color=red]spring的注解是不会被子类继承的[/color],也就是说对于子类来讲她并没有@Controller或@Scope等等的类注解,spring容器在初始化时也就不会将子类加载。
所以说不是“没有多例和单例一说”,[color=red]而是spring容器里根本没有这个实例[/color]。