您的位置:首页 > 编程语言 > Java开发

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

2015-10-25 15:04 295 查看
首先分为 entity(实体) dao(数据库操作) service action四个层

千万不要注解xml混用

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

(1) action一定要设为多例

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

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

(2)Dao和service考虑到效率要设为单例。

(3)Entity层不需要任何设置,不需要把它加到spring的bean工厂中:(如果把它加入到bean工厂中千万不要把bean设为单例,因为即使不主动注入到action中,当和action中的属性名字相同时,struts会自动把它注入进去。这样此属性就会变成单例,每次请求数据只要不覆盖都会保存有原来的值。如:User实体中有name和id,那么第一次请求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使用spring的xml配置是无法注入到action中的。

二。spring管理

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

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

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

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

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

Spring 管理时,当没有注入到action相应的属性时,struts会自动new一个相应的属性对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: