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一个相应的属性对象。
千万不要注解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一个相应的属性对象。
相关文章推荐
- 【知识点整理(Java)】Java Thread简单使用注意点汇总(二)
- jxl创Excel档java示例代码说明
- 【Java基础之容器】Iterator
- java结合WebSphere MQ实现接收队列文件功能
- Java 笔试:常见题目总结
- Java算法题:求素数
- spring mvc的分层思想
- Java内部类为什么可以访问外部类的成员
- Java的四中引用类型
- Java抽象类和接口的区别
- Java设计模式10:观察者模式
- Java Concurrency — 原子变量类
- jdk从1.6升级到1.7可能会遇到的Version问题
- jdk环境配置
- spring的annotation-driven配置事务管理器详解
- Scripting Java #3:Groovy与invokedynamic
- Java笔记集合之Vector
- struts2—OGNL总结
- java值传递问题
- wget jdk 却是网页的解决办法