日期:2014-05-20  浏览次数:20583 次

【Without Spring】【Expert One-on-One J2EE Development without Spring】
原文地址http://www.riabbs.com/as.jsp?asmc=showtopic&bid=230&topicid=6

Expert One-on-One J2EE Development without Spring
  作者:henry作者网站: http://www.riabbs.com  

首先对spring的某些优点我是表示认同的
spring的优点有很多,比如spring有很多有用的类库,就算你不打算引入spring框架(我是指那堆配置文件),也同样可以使用用它的类库。比如spring的思想是很好的,控制反转,依赖注入。

然而在spring的框架下,很多东西被顶礼膜拜式的使用了,由于使用者对spring已经顶礼膜拜,
所以难以发现其中的不足,反而对其不足津津乐道 

我下面例举spring的几个缺点

1 世界本没有依赖,spring自己制造依赖,然后再费心思解决依赖

spring是怎么做到没有依赖,制造依赖的呢?
答:spring引入了字符串依赖

做为一个java开发者,各种 ide(jbuilder,eclipse)本来已经提供了足够好的功能,让你解决编写代码时会产生的各种语法错误,比如在你写错要调用的类名的时候,IDE是不会让你编译通过的,而会即时提醒你类名写错了,比如当你觉得这个类名,方法名,包名最初起的不够好,而你想要重构的时候,ide可以做到整个项目范围内的类名或方法名等全部改变。

然而当你引入spring配置文件之后,这些功能完失效了,改完之后,项目启动不起来了。

因为ide不了解spring的配置文件也需要重构,也需要重命名,
但是spring崇拜者说了,spring有eclispe插件,装上这个插件之后就可以重构了。
可是我本不需要插件啊,可是我用的是jbuilder2006呢,可是装插件了解插件的过程还需要时间啊。
这就是spring制造的字符串依赖,产生的重构困难,spring发现后,竟然自己又造插件去解决问题,而不是告诉大家别依赖配置文件了,配置文件本就是代码嘛....(自己制造问题,再解决问题,这就是典型的没事找事)


2 spring让开发者不关心模块的初始化顺序和关闭顺序,而spring对此也一知半解
  spring下的bean是被spring容器初始化的,初始化顺序不能明确定义,你不知道什么是先new的,什么是先set过的
  你不知道那个模块先启动那个模块后启动.当然,你可以用spring的deponed-on属性去限定,但是在配置文件越来越多的时候,你还有什么更好的方法去全局的掌握deponed-on呢。
  程序的关闭也是一个比较大的问题 ,即使你有本事决定那个模块先启动,你也没能力控制那个模块先关闭,
  但是程序的关闭也是需要顺序的,你不能说数据访问模块都关闭了,另外一个线程还在给数据库添加数据吧。


3 spring让运行代码如此之长,别以为配置文件不是代码,没了它,程序跑得了吗?
<beans>
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>net.sourceforge.jtds.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:jtds:sqlserver://127.0.0.1:1433/Sample</value>
</property>
<property name="username">
<value>test</value>
</property>
<property name="password">
<value>changeit</value>
</property>
</bean>

多难看的配置文件啊?难道它可以运行中还可以配置吗?难道因为它和编译器无关,就不是代码的一部分了吗?
代码原本可以如此简单,却搞了那么一大堆。
BasicDataSource datasource=new BasicDataSource();
datasource.setDriverClassName("net.sourceforge.jtds.jdbc.Driver");
datasource.setUrl("jdbc:jtds:sqlserver://127.0.0.1:1433/Sample");
datasource.setUsername("test");
datasource.setPassword("changeit");

4 AOP 调试之累
  当错误发生的时候,我相信大家更愿意看到的是,异常从哪儿抛出的,程序调用是从哪儿开始的,从哪儿结束的,事务是从哪儿提交的,从哪儿回滚的,到底是哪儿出了问题,然而AOP把这一切打乱了,我们强烈的依赖到这个上面,找不到开始,找不到结束。开发时的时间和调试测试的时间一样重要


什么是没有配置文件的spring思想
由于spring文件有这么多问题,所以根本就不要用它。
自己写一些启动类,这个类里面初始化原本在你想spring配置文件里的东西,如果原有配置文件多,那么也可以分成多个类来写初始化,在自己的初始化类里设置类与类的关系,其实就是写个自己的容器类,你的位置就是要站的和ApplicationContext站的一样高,只要你觉得ApplicationContext的存在合理
程序中的其他地方对ApplicationContext的依赖合理,那么你自己的容器类就是同样合理的

将Spring 配置文件扔掉,在程序中尽量减少字符串依赖!
SURE!!! Why not?

------解决方案--------------------

------解决方案--------------------
你在宣传你的网站吗? 不错,支持一个!

多多发好的帖子。原创,转载的都欢迎。

只要帖子质量好
------解决方案--------------------
没经你说从来没有意识到这些问题,看来还得多思考
------解决方案--------------------
支持一个
------解决方案--------------------
更本还没看太懂spring
------解决方案--------------------
楼主很有经验啊,有空的话多交流交流, 我的MSN: caseman@live.cn
------解决方案--------------------