先说几句个人对零配置的理解
零配置不是没有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的味道,不利于高层次的解耦