iteye_12285 2009-11-30 17:29
浏览 223
已采纳

struts与spring整合,action创建的困惑

struts2的action和struts1不一样,是有多个实例的。
如果用spring整合struts2,那么spring就要构造多个action的实例。

如果有些action里的内容,我只想注入一次。
比如各种service层的东西,或者一些资源文件的路径等等。

如果spring每次创建action都注入一遍这些内容,是不是一种资源上的浪费?
问题补充:
如果action配置成为单例,那这个action就没有办法进行数据的收集了。
如果不是单例,service层的东西就要重复注入。

  • 写回答

4条回答 默认 最新

  • lijiepeng 2009-12-01 07:54
    关注

    Struts1.x和Struts2都是MVC的框架,但实现上还是有些不同,对Action的处理上很明显.
    Struts1.x刚实现的时候,因为当时Java虚拟机的垃圾回收机制并不可靠,每个请求生成一个对象会出现一些问题,所有当时实现成了单实例线程安全的对象,因此Action的行为与Servlet的行为是一致的.但是这仍然可能出现一些并发访问的问题,避免并发问题最基本的原则就是不要使用实例变量,如果使用一定要保证实例变量是只读的或是线程安全的.
    Strut2中的Action是典型的Command模式,每次请求动态生成对象,这样就不用保证Action实例是线程安全的,如果配置成单实例的话,框架没有任何保证对它的访问是线程安全的.
    这个问题在Struts1.x框架的作者也有说到,他说如果让他现再再次实现Struts的话,他也会实现成Struts2中的Action模型.现再的垃圾回收机制已经很完善了,每次生成的对象并不会对内存造成太大影响.

    至于Struts2中的每次生成对象都要注入所产生的影响,并不大,因为它并没有再次生成Service的对象,而只是产生一个注入的动作.这要比你不用任何框架,手动实现控制器代码中new Service对象要高很多效率.
    有的时候浪费一些资源但换来一些灵活性,简单性.比如处理并发问题可能导致的问题和并发问题可能一样多,如果能避开它,就不用考虑这些问题了.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突