Struts2 和spring整合的 Action层托管问题


首先分为 entity(实体) dao(数据库操作) service   action四个层

千万不要注解xml混用

 

通常我么对于四个层的单多例设置为:

(1)    action一定要设为多例

注意:Struts管理时;当使用注解@Scope("singleton")设置action为单例时,可以通过属性注入设置属性的为多例。(很奇怪,和sprig管理不同)

spring管理时,当action设置为单例时,不管你怎么设置里面的属性为多例,并且注入到action,都是没用的

 

 

2Daoservice考虑到效率要设为单例。

3Entity层不需要任何设置,不需要把它加到springbean工厂中:(如果把它加入到bean工厂中千万不要把bean设为单例,因为即使不主动注入到action中,当和action中的属性名字相同时,struts会自动把它注入进去。这样此属性就会变成单例,每次请求数据只要不覆盖都会保存有原来的值。如:User实体中有nameid,那么第一次请求action设置了user.name=”aaa” user.id=1。当本人第二次请求此action时,只带有一个参数 user.id=2,此时 user属性的值为user.name=”aaa”user.id=2

一.  Struts管理action,此时的action默认为多例,,

struts.Xml中使用action类的全路径时如:<action name="u" class="com.bjsxt.registration.action.UserAction">。时默认为struts管理action

 

 

如果action的属性没有使用spring注入时(假设:此时没有使用spring注解注入(注:本人实验结果是===此时spring注解方式可以注入进去,xml方式无法注入),而且没有和属性名同名的bean(struts会首先在spring bean容器中查找和属性名同名的bean,如果有自动注入,没有的话会在set方法最前面new一个新的对象))

 

此时,完全相当于只有struts而没有其他框架

此时action会在每次请求时new一个新的对象 (new UserAction()),当然,里面的所有属性对象都是新new的,每次都不一样。

Struts会在set方法刚执行时,new一个新的对象,但不是所有的属性都会new,只有在jsp页面中的请求参数带有此对象时才会new。如 只有userManager1.age这个参数时,只会new UserManagerImpl();

 

但是在get set方法中并不能获得 请求或者 返回的属性值(这个是通过实验得到)。

但是我们可以给 相应的 dao层 和 service层设置为单例(可以用spring注解,也可以使用xml配置)。但是注入到action层的方式只有两种,

(1)通过spring注解(2)在acion中的属性名必须和spring的bean 中的名字一样。注:通过实验证明,struts管理下的action使用springxml配置是无法注入到action中的。

。spring管理

(第一种)<constant name="struts.objectFactory" value="spring" /> 

(第二种)当 strus配置文件中的值,使用spring bean工厂中的名字时,默认此actonspring管理

此时action为单例(spring 默认为单例),注意此时,一定要把此action设置为多例,因为只要不覆盖数据都会保留上一次的数据。

当把action设置为多例(可以使用xml,注解)时,可以通过两种方式设置里面的属性为多例。

1)使用xml,(2)使用注解。但是当在xml中不设置自动匹配时,此action时不会像struts管理时主动的匹配bean工厂的。

Spring 管理时,当没有注入到action相应的属性时,struts会自动new一个相应的属性对象。

上一篇:让window命令行支持自动补全[类似Linux的Tab键]


下一篇:C# DataGridView点击Enter键切换单元格