欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Struts2中Action由Struts2自己管理与由Spring管理的区别(转自别人)

程序员文章站 2022-03-06 19:09:10
...

struts2单独使用时,Action实例由struts2自己负责创建;struts2与spring集成时,Action实例由spring负责创建。这会导致在这两种情况下在对struts.xml配置文件进行配置时会有略微的差异。Struts2默认的实现是Prototype模式(23种设计模式中的原型模式),也就是说每个请求都会新生成一个Action实例,因此不存在线程是否安全的问题。特别需要注意的是:spring在默认情况下,scope是单例模式,即scope="singleton",这样只会创建一个Action实例,这样造成的后果是每次访问都是同一个Action实例,数据不安全。因此如果由spring管理Action的生命周期, scope要配成prototype作用域,即scope="prototype"。在spring的applicationContext.xml配置文件中配置如:

<!-- action配置 -->   
<bean id="testAction" class="com.study.action.TestXxxAction"  scope="prototype">    
    <!-- action注入 -->   
    <property name="xxx" ref="xxx" />  
</bean>

scope作用域除了prototype和singleton外,还有一个作用域:session。如果作用域设置为scope="session",对避免web中action的并发问题有一定的帮助,因为只为当前用户创建一次bean实例,直至session消失。在这种情况下,对当前用户而言,bean是有状态的,好处就是少创建了bean的实例,有那么一点点性能的提升。

应用场景:
    1. 多数情况下应使用prototype;
    2. 若用户不多,且频繁操作(频繁使用action),硬件一般,可以考虑session,兴许还能提升一点点性能(未真正的测试过)。

1. struts2单独使用时,struts.xml配置文件中action的class属性为XxxAction的全路径名,struts.xml配置文件中配置如:

<action name="xxx"class="com.study.action.TestXxxAction">
	<result>/test/showXxxTest.jsp</result>
</action>

 2.struts2与spring集成时,struts.xml中action的class属性是spring配置文件applicationContext.xml中配置的bean的id属性值,如下:

<!-- action配置 -->   
<bean id="testAction" class="com.study.action.TestXxxAction"  scope="prototype">    
    <!-- action注入 -->   
    <property name="xxx" ref="xxx" />  
</bean>

 

<action name="xxx"class="testAction">
	<result>/test/showXxxTest.jsp</result>
</action>

 struts2-spring-plugin-2.x.x.jar这个插件在产生action实例时,会自动地按照名字把action的属性注入进去,即使不在spring配置文件(applicationContext.xml)中为相关的action(bean)注入属性或者在action类中用注解注入,它也会按照action类中属性的名字从当前容器(Spring)中找有没有这个名字对应的bean并注入进来,或者显示的给定一个名字来注入。所以action的id(spring配置文件applicationContext.xml中的)不要与该类中的变量名相同。如果在struts.xml文件中配置action的class是指向action的实际类,那么action的产生由struts控制,此时action类中的相关变量会按照名称从容器中注入一个相应的bean,如果找不到对应名称的bean,一旦调用这个action就会出错。但是如果此时为变量加上一个@Resource注解,struts容器产生过action后就会从Spring容器中找相应的bean注入。如果class指向的是一个伪控制器(对应spring配置文件applicationContext中action的bean),那么action的产生由spring控制。此时action类中的相关变量必须用注解@Resource或者xml的方式自定义注入相应的bean,不像之前会按照名字从spring容器中自动查找注入bean,否则程序运行出错。

简单点说应该是由struts-spring-plugin插件来控制还是由spring容器控制,由插件来控制,则Action实例由插件来产生,而启动spring容器的自动装配功能,将所需要的业务组件自动装配到Action实例中。该策略中,spring只负责管理依赖关系。优点:配置简单。 缺点:1、Action与业务组件耦合度降到了代码层次,要求Action中的属性名要和配置文件中业务组件的id保持一致,耦合度高。2、由spring自动装配,依赖关系不明了,可读性差。 第二种,由spring容器控制,Action实例看做一个普通的bean实例,需改变scope的默认值。struts.xml中Action的class属性对应spring容器中一个Action实例的id。优点:实现了高度的解耦。缺点:1、配置文件冗余、臃肿。不仅需要在struts.xml中配置Action的信息还需要在spring的配置文件中配置个Action的信息。

相关标签: struts spring