form到bean,反向注入还是主动提取
一、反向注入
很多Web框架中将form中的fields自动转换成bean或相应类型,然后设置到action的setter方法中。这样就可以很方便的在action中获取fields,webwork是直接注入到action中,Struts则有一个formbean做中转,和实际的bean还不一样,有点类似DTO的概念,其实觉得Struts的formbean有点鸡肋的感觉。我想很多人对这种反向注入觉得很方便吧,但是这个自动注入的操作还会涉及到其他一些东西。
1、注入的话,那就需要有一个被注入的对象。这句话看起来很像是废话,但是在某些框架或是场景中,想要找到这个对象就比较麻烦。像WebWork是以action为中心的,注入到action中是很自然的事情,所有的interceptor都是围绕着action的。但是如果框架中不存在中心的概念,那么应该把form注入到哪一个对象中去呢。注入进去不复杂,但是框架注入进去了,又没有使用,不是白费力气了。解决这个办法的话,要么就有配置文件,要么使用Annotation。
2、一旦注入,action就是有状态了,action就不能公用了,每个action都必须被一个Request独享。这个就看应用的需求了,如果对创建和销毁对象的数目有要求的话,这也就需要考虑了。
3、form注入的话,对于动态数目的from注入就很麻烦了。一般注入的话,会有确定的数目进行注入,但是不确定数目,就很难注入了。
4、验证form的逻辑也进入到了action中了,至于是不是要把form的验证和action耦合在一起,那也是需要去权衡的。我还是倾向于在action中不需要出现对form的验证。
二、主动提取
主动提取的话,就是在action的外围提供formService,来对form的fields进行类型、校验等处理。
action在需要fields数据的时候,主动去获取,虽然在fields数目比较多的时候,会觉得不如反向注入来得方便,但是action只需要获取它所需要的数据,而在获取之前已经对数据做好了验证和类型的处理。这么做的好处,就是不像Struts那样,对于form,需要有一个formbean来支持,虽然Struts也可以通过配置文件来获取动态的formbean,但是事实上我们也不一定都要把formbean转化成bean。
很难直接下定论说反向注入好还是主动提取好,在背后其实都是一种思想,在某个特定框架中,或者在某个具体的应用中,哪种方案更加契合才是选择的依据。毕竟form的fields提取本身也不是一件非常复杂的事情。