struts2的action和struts1不一样,是有多个实例的。
如果用spring整合struts2,那么spring就要构造多个action的实例。
如果有些action里的内容,我只想注入一次。
比如各种service层的东西,或者一些资源文件的路径等等。
如果spring每次创建action都注入一遍这些内容,是不是一种资源上的浪费?
问题补充:
如果action配置成为单例,那这个action就没有办法进行数据的收集了。
如果不是单例,service层的东西就要重复注入。
Struts1.x和Struts2都是MVC的框架,但实现上还是有些不同,对Action的处理上很明显.
Struts1.x刚实现的时候,因为当时Java虚拟机的垃圾回收机制并不可靠,每个请求生成一个对象会出现一些问题,所有当时实现成了单实例线程安全的对象,因此Action的行为与Servlet的行为是一致的.但是这仍然可能出现一些并发访问的问题,避免并发问题最基本的原则就是不要使用实例变量,如果使用一定要保证实例变量是只读的或是线程安全的.
Strut2中的Action是典型的Command模式,每次请求动态生成对象,这样就不用保证Action实例是线程安全的,如果配置成单实例的话,框架没有任何保证对它的访问是线程安全的.
这个问题在Struts1.x框架的作者也有说到,他说如果让他现再再次实现Struts的话,他也会实现成Struts2中的Action模型.现再的垃圾回收机制已经很完善了,每次生成的对象并不会对内存造成太大影响.
至于Struts2中的每次生成对象都要注入所产生的影响,并不大,因为它并没有再次生成Service的对象,而只是产生一个注入的动作.这要比你不用任何框架,手动实现控制器代码中new Service对象要高很多效率.
有的时候浪费一些资源但换来一些灵活性,简单性.比如处理并发问题可能导致的问题和并发问题可能一样多,如果能避开它,就不用考虑这些问题了.
建议你看看struts2的相关教程
spring整合action实例,自然是可以让它每次都new一个新的实例,当然也可以配置成单例的情况
就用spring的bean的scope
singleton
在每个Spring IoC容器中一个bean定义对应一个对象实例。
prototype
一个bean定义对应多个对象实例。
首先你得知道一点 如果一个对象是单实例的 并不意味着这个对象就只能被一个人调用 它可以被多个人调用 但是操作的是堆上的同一个对象 会存在并发安全问题。
再一个就是相对于安全性来说 我感觉还是并发安全性重要 至于性能上如果要求真的那么严的话 可以考虑集群和负载均衡了 呵呵