现在的位置: 首页 > 综合 > 正文

struts2和spring3零配置整合的思考

2013年10月10日 ⁄ 综合 ⁄ 共 1919字 ⁄ 字号 评论关闭

先说几句个人对零配置的理解

零配置不是没有xml或者properties文件,也不是说完全通过annotation来注解

我跟愿意理解成是一种 约定,在这种默认的比较合理的约定下,可以使得整个开发过程中,不需要或者很少需要再增加修改配置

下面介绍struts2和spring3的零配置整合思路

先来点最基础的

1、先用struts2基本的方式配置一个action,在struts.xml中如下配置

注意到这个class写的还是类全称

这个action很简单,就是输出hashCode,结果很显然,每次输出的hashCode是不一样的

结论:通过上面的配置,基本上的理解是,action由struts创建,每次输出的hashCode不同,说明action是有状态的

2、struts2整合spring的基本思路,我看很多教材上都是说,把action由spring来托管,这样就可以在action中使用spring的ioc和aop特性

标准的配置方式是

先把action注册成bean,如下是bean.xml的配置

考虑到action的状态性,配置了scope="prototype"

同时,struts.xml的配置需要修改class属性

这样class="HelloAction"是找不到HelloAction类的,于是就去找id为HelloAction的bean,由spring负责创建此action

但是现在问题来了,真的是spring创建的此action吗?

如果是,我这样修改bean.xml

改成单例模式后,访问hello.action,依然得到的是不同的hashCode,这是否说明action其实不是spring的bean?

3、既然怀疑action是由struts创建的,那就按这个思路配置下去。我所关心的其实不是action由谁来创建,我关心的是action中依赖的一些bean能否被注入

于是我做了如下修改,注入ApplicationContext遍历出spring注册的bean,同时注入一个message

此Message是最简单的pojo了,如下

而struts.xml采用了最初的配置,这样貌似可以说明action由struts创建

spring的配置就是一个bean扫描

然后启动,访问hello.action,得到的结果是,ApplicationContext和message被成功注入,但是遍历出来的bean中没有action

输出是这样的

message:28415827
message Prototype:false
org.springframework.context.annotation.internalConfigurationAnnotationProcessor Prototype:false
org.springframework.context.annotation.internalAutowiredAnnotationProcessor Prototype:false
org.springframework.context.annotation.internalRequiredAnnotationProcessor Prototype:false
org.springframework.context.annotation.internalCommonAnnotationProcessor Prototype:false
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor Prototype:false

这是否就说明action不是spring创建的呢?那spring又是如何注入的?这个问题没有仔细研究过

4、我前面已经说过,并不需要关系action由谁创建的,只要他是有状态的

既然struts.xml中不需要配置action的class属性为bean的id,那这样就简单了

首先,可以利用struts2-convention-plugin,具体就不解释了,action就直接零配置了

其次,对于service层(或者叫逻辑层、业务层 什么都好),一般都由spring托管,并注入持久化操作bean和切入事务管理,而bean的零配置体现在component-scan上

这样action和service都独立配置好了,若action需要调用service的bean,直接@Autowired注入即可

5、这种零配置方式的缺点

利用注解的方式做注入,多少有一点硬编码中依赖spring的bean id的味道,不利于高层次的解耦

抱歉!评论已关闭.