谈到构架,总是会想起前面看到banq写的一篇文章,叫做重与轻的永恒话题。是讨论使用EJB等重量级框架和Spring,Jdon之类的轻量级框架采用POJO实现业务。俺是小人物,没学过EJB,而对Spring倒是有一点了解。所以这次就用Spring了。
这次实现的系统是一个数据采集网站,最后根据管理员所填的数据最一些判断,给出一个评价结果。系统的ER图如下:
http://forum.lingdot.com/UploadFile/2006-5/20065718265790780.jpg
业务不是很复杂,本来也不是很需要使用这些框架的。但作为看了好久Marsting Spring的一个实践,于是就使用了Spring.
不用不知道,一用吓一跳。呵呵。我只是用到了Spring的IoC容器,和Spring对Hibernate的支持部分。感觉,,,好简单。呵呵。如果只是用到这两个部分的话,我觉得Spring药比Hibernate简单的多了。至少我在第一次使用Hibernate的时候写了好久程序自认为没问题了,开始运行却出了一大堆莫名其妙的错误。但Spring,那天写了一些东西,配好了环境,在Hibernate之上使用Spring,竟然一个错都没出。
然后说用这个东西的一点感想。一句话,要不要用Spring这个问题是非常值得考虑的。我想这一次我使用它可能一方面是学习,另外一方面也有“用了Spring,程序含金量会高一些吧,至少可以和人家炫耀我用了Spring了”这样的想法在。
于是当这个项目接近尾声的时候,回过头来想Spring在这个系统中所起到的作用,于是一阵郁闷。
Spring支持对接口编程。例如我在Spring配置文件中写了一个Bean,
1
<
bean
id
="userDAO"
class
="com.lingdot.es.dao.UserDAO"
>
2
<
property
name
="sessionFactory"
>
3
<
ref
local
="sessionFactory"
/>
4
</
property
>
5
</
bean
>
那么我在程序中想要获得这样的一个实例的时候,会这样写:
UserDAO userDAO
=
(UserDAO)getBeanFromIoC(
"
userDAO
"
);
其中getBeanFromIoC是我自己写的方法。
这里存在一个问题,就是我没有对接口编程,这样导致整个应用依然是依赖于UserDAO这样一个具体类。显然这不是我们想要得。
如果我不依赖于具体类,那么势必创建一个接口,
public
class
UserDAO
implements
UserDAOI
这样我就可以把获得userDAO的实例的代码写成这样:
UserDAOI userDAO
=
(UserDAOI)getBeanFromIoC(
"
userDAO
"
);
由此,我做到了程序与具体类无关。可以说做到了开闭原则。
但如此出现了一个问题。只要我想从IoC容器中获取一个bean,那么这个bean类一定对应一个接口,这样才能保证我的应用不依赖于这个具体类。于是,我的每一个业务类,DAO类,都将有一个接口。于是我就想起了一个词——接口污染。
究竟怎样才算把握好了接口和针对接口编程,而不会成为一种接口污染,这个度,我想需要很好地把握才行。大型的项目,后期发展的可能性比较大,要求可扩展性能比较好的时候,可能需要Spring,IoC去做到与具体类无关的编程,但是一些小的东西,只怕不用反而更简洁。
我到现在也没能很好的评价出这个项目中使用Spring是不是适合。
学习的路,还很长。