论坛首页 Java企业应用论坛

Spring--也许正成为一个EJB

浏览 73060 次
该帖已经被评为良好帖
作者 正文
   发表时间:2011-04-15  
任何事物都有两面性,相信有人比我更熟悉吧!好的一面我们使用,缺点我们规避,我们自己写适合我们的那一部分,Spring完全没有强制你如何写代码。Spring不但代码可以解耦合,配置文件也可以解耦合,关键是你如何看待Spring!如果你能集成各个框架的优点才是高手,只盯着缺点的人永远是新手!
0 请登录后投票
   发表时间:2011-04-15  
gtssgtss 写道
http://www.iteye.com/problems/62911

觉得spring那么NB的话,帮忙回答下这个问题


不是Spring粉,不过这个问题似乎不太友好。
泛型是编译期就会被擦除的,你让一个运行时的容器去解决编译期的问题,似乎路子本身就不对。
0 请登录后投票
   发表时间:2011-04-15  
mercyblitz 写道
osprey 写道
mercyblitz 写道
superhanliu 写道
ricoyu 写道
引用
但是我看到的情况都是在滥用。为一个功能写一个接口和一个实现类,然后就认为是面向接口编程。这种思路怎么来的,真正用的好吗?我是比较怀疑的。

LZ这段话我超级赞同的, 很多项目都是为了面向接口编程而面向接口编程, 庸人自扰之.
比如很多项目喜欢弄一个service接口, 然后对应一个serviceImpl实现类, 在action里持有这个service接口, 然后通过spring注入唯一的一个实现类serviceImpl, 这就是他们所谓的面向接口编程了.
在这种场景下完全不需要抽象出一个接口, 直接一个service具体类就ok了


同意!!!现在很多项目为了接口而接口,每个具体类都一定要整一个接口,为了接口而接口。实际上很多项目仔细一检查就会发现:接口和实现类的数量是1:1,而不是1:n(n是>1的浮点数)。如果都是1:1,就让人很怀疑这个接口的必要性了:1增加了代码量和复杂度;2增加了配置影响了性能。



这个不能这么说,如果是项目之间有远程调用的话,接口还是必要的,即使是1:1。如果是自娱自乐,那就算了!


上面的各位大仙,难道你们写程序不写单元测试的吗?,你对action的单元测试,如果不写基于service接口的mock,你的单元测试能过吗?测试覆盖率有多少?或者你是连aciton和service一起单元测试的,那dao的mock哪?如果说你是 action,service,dao,数据库表一起测的,那么那就不是单元测试了,是集成测试了!还谈什么弱藕合,或者你们能提供一个不是基于接口的单元测试方案出来,看看需要的hardcode代价是多少.
写代码不只是敲个可以执行的代码出来,还要可维护,可测试,还要有注释,文档.如果没有单元测试,什么重构都是浮云,造出来的是你们自己曾经接收的他人代码(多么看不懂,不可维护),然后自己如法炮制,继续恶心后面的人,如果你们只是认为写代码就是写个可以执行的代码,那不是就自我认知为代码工人,那朝所谓的技术小牛也越来越远了


小兄弟呀,接口的实现类是不是你自己写的?对于业务实现,你是要测试接口还是实现类呢?


OK,我来细细说一下,自己定义的接口难道还搞一个Mock去测试,为什么要Mock,你看看Spring Test里面,它是针对JEE标准接口而言,比如ServletRequest这类的接口,因为标准技术提供一个规约,这个具体实现不用关心,JEE容器提供实现。容器方面的话,你不用太过于测试。但是在你的单元测试代码中依赖了这些接口,通过Mock的方法来模拟输入,断言输出。

你说的Action一起测试的问题,是单元测试粒度的问题。

对于业务实现,你都自己知道怎么实现的啦,还要去Mock一个对象吗?

比如:

A 类依赖于 B接口,那么你很清楚B接口只有一个实现B1,那么你在做A的单元测试的时候,有必要去做B的Mock吗?

在其他地方传入B接口实例是就是B1,为什么不直接传入B1实例呢?前提是B1的单元测试必须保证,即使没有保证的话,可以通过A的单元测试回归。

所以,你所说的“那朝所谓的技术小牛也越来越远了”,过于理论化,学习技术建议抱有怀疑的态度,什么能做比较重要,不能做更重要!

最后,送你一句话吧!纸上得来终觉浅,绝知此事要躬行


就是因为现在我们用的是maven+jenkins+sonar 所以有jenkins做持续构建并跑单元测试覆盖率,正因为我们现在的团队人数多,所以开发时不是由一个人从action写到dao,而是横切并行开发的,由专门的人写servcie和公用service.所以自己写的action自己要写mokc单元测试,而不是串行的等待其他人的servcie写完再测,至少是自扫门前雪,action行覆盖率要到85%,service的覆盖率要到90%.这也许与开发模式相关.但相比以前自己写个网页点点,算是从action测到dao层,至少从项目上线后一个月看,不像以前狂改bug了,整个项目的bug都集中在页面的体验上了,而不是诡异的throw null啊,业务逻辑异常.这个就是我的体验,不知道算不算绝知此事已躬行
0 请登录后投票
   发表时间:2011-04-15  
这个哥很是DT啊,你没事儿吧?先写上一小段儿,让别人评论;然后再次修改,把别人的评论引用,很是DT啊!

不过你的观点我还是有点儿朦胧的理解,maybe你是一个高手呢。
0 请登录后投票
   发表时间:2011-04-15  
翻了9页还没看到特别有水准的评论,也不翻了。按照惯例,这应该是JavaEye每半年就会出现的吵架帖。以后肉饼应该感谢你们的话题带来的流量了。
Spring一个比较特别的地方就是让新手写出的代码看起来没那么差。
0 请登录后投票
   发表时间:2011-04-15   最后修改:2011-04-15
http4j 写道
翻了9页还没看到特别有水准的评论,也不翻了。按照惯例,这应该是JavaEye每半年就会出现的吵架帖。以后肉饼应该感谢你们的话题带来的流量了。
Spring一个比较特别的地方就是让新手写出的代码看起来没那么差。

我其实也没有想改变什么,更没有建议别人不用,只不过希望大家在使用Spring,以及任何一种工具的时候,能够多多考虑一下,而不是说教条化,真理化。

引用我朋友的一句话:
两个基础尚可的学生,一个用Spring,一个不用Spring。
1-2年后,你再看他们的能力。
我宁愿他们代码差一年,而不是一直差下去。

也正如前面的朋友所说:
现在招人,特别是1-2年工作经验的人,经常是满嘴DI,AOP。根本不知道深入的内容。

我更觉得这种趋势才是最可怕,也是最可悲的。
0 请登录后投票
   发表时间:2011-04-15   最后修改:2011-04-15
zdmcjm 写道
osprey 写道
mercyblitz 写道
superhanliu 写道
ricoyu 写道
引用
但是我看到的情况都是在滥用。为一个功能写一个接口和一个实现类,然后就认为是面向接口编程。这种思路怎么来的,真正用的好吗?我是比较怀疑的。

LZ这段话我超级赞同的, 很多项目都是为了面向接口编程而面向接口编程, 庸人自扰之.
比如很多项目喜欢弄一个service接口, 然后对应一个serviceImpl实现类, 在action里持有这个service接口, 然后通过spring注入唯一的一个实现类serviceImpl, 这就是他们所谓的面向接口编程了.
在这种场景下完全不需要抽象出一个接口, 直接一个service具体类就ok了


同意!!!现在很多项目为了接口而接口,每个具体类都一定要整一个接口,为了接口而接口。实际上很多项目仔细一检查就会发现:接口和实现类的数量是1:1,而不是1:n(n是>1的浮点数)。如果都是1:1,就让人很怀疑这个接口的必要性了:1增加了代码量和复杂度;2增加了配置影响了性能。



这个不能这么说,如果是项目之间有远程调用的话,接口还是必要的,即使是1:1。如果是自娱自乐,那就算了!


上面的各位大仙,难道你们写程序不写单元测试的吗?,你对action的单元测试,如果不写基于service接口的mock,你的单元测试能过吗?测试覆盖率有多少?或者你是连aciton和service一起单元测试的,那dao的mock哪?如果说你是 action,service,dao,数据库表一起测的,那么那就不是单元测试了,是集成测试了!还谈什么弱藕合,或者你们能提供一个不是基于接口的单元测试方案出来,看看需要的hardcode代价是多少.
写代码不只是敲个可以执行的代码出来,还要可维护,可测试,还要有注释,文档.如果没有单元测试,什么重构都是浮云,造出来的是你们自己曾经接收的他人代码(多么看不懂,不可维护),然后自己如法炮制,继续恶心后面的人,如果你们只是认为写代码就是写个可以执行的代码,那不是就自我认知为代码工人,那朝所谓的技术小牛也越来越远了


要对action做单元测试,说明你的代码中,action充刺着大量本不属于action的职责,action本身是简单的,对action做测试,就是蛋疼行为,1+1=2需要测试吗?相应的包括什么service测试,dao测试,都需要个mock对象,我不否定mock。但也不是什么都用个mock。如果一个类可以自测试,我还要这些xxx注入干什么。就是因为需要xxx注入,所以项目代码一大坨,测试代也一大坨。

这个我只能说,在系统中1+1=2是需要测试的。你自己没有实现junit,不代表没有项目没有实现,如果举大点,现在稍微著名的开源框架或工具都有junit的代码的,这才能保证该框架或工具至少不是满地bug的。我建议你可以看看单元测试的内容,不管是传统的瀑布开发模型还是最新的敏捷模型,都要求单元模块测试,这是基础。“action本身是简单的,对action做测试,就是蛋疼行为”这是想当然的行为,“用眼睛看看猪肉质量就可以了,是简单的,所以不用仪器检测,所以瘦肉精猪肉就进来了,双汇就蛋疼了"
0 请登录后投票
   发表时间:2011-04-15  
osprey 写道
mercyblitz 写道
osprey 写道
mercyblitz 写道
superhanliu 写道
ricoyu 写道
引用
但是我看到的情况都是在滥用。为一个功能写一个接口和一个实现类,然后就认为是面向接口编程。这种思路怎么来的,真正用的好吗?我是比较怀疑的。

LZ这段话我超级赞同的, 很多项目都是为了面向接口编程而面向接口编程, 庸人自扰之.
比如很多项目喜欢弄一个service接口, 然后对应一个serviceImpl实现类, 在action里持有这个service接口, 然后通过spring注入唯一的一个实现类serviceImpl, 这就是他们所谓的面向接口编程了.
在这种场景下完全不需要抽象出一个接口, 直接一个service具体类就ok了


同意!!!现在很多项目为了接口而接口,每个具体类都一定要整一个接口,为了接口而接口。实际上很多项目仔细一检查就会发现:接口和实现类的数量是1:1,而不是1:n(n是>1的浮点数)。如果都是1:1,就让人很怀疑这个接口的必要性了:1增加了代码量和复杂度;2增加了配置影响了性能。



这个不能这么说,如果是项目之间有远程调用的话,接口还是必要的,即使是1:1。如果是自娱自乐,那就算了!


上面的各位大仙,难道你们写程序不写单元测试的吗?,你对action的单元测试,如果不写基于service接口的mock,你的单元测试能过吗?测试覆盖率有多少?或者你是连aciton和service一起单元测试的,那dao的mock哪?如果说你是 action,service,dao,数据库表一起测的,那么那就不是单元测试了,是集成测试了!还谈什么弱藕合,或者你们能提供一个不是基于接口的单元测试方案出来,看看需要的hardcode代价是多少.
写代码不只是敲个可以执行的代码出来,还要可维护,可测试,还要有注释,文档.如果没有单元测试,什么重构都是浮云,造出来的是你们自己曾经接收的他人代码(多么看不懂,不可维护),然后自己如法炮制,继续恶心后面的人,如果你们只是认为写代码就是写个可以执行的代码,那不是就自我认知为代码工人,那朝所谓的技术小牛也越来越远了


小兄弟呀,接口的实现类是不是你自己写的?对于业务实现,你是要测试接口还是实现类呢?


OK,我来细细说一下,自己定义的接口难道还搞一个Mock去测试,为什么要Mock,你看看Spring Test里面,它是针对JEE标准接口而言,比如ServletRequest这类的接口,因为标准技术提供一个规约,这个具体实现不用关心,JEE容器提供实现。容器方面的话,你不用太过于测试。但是在你的单元测试代码中依赖了这些接口,通过Mock的方法来模拟输入,断言输出。

你说的Action一起测试的问题,是单元测试粒度的问题。

对于业务实现,你都自己知道怎么实现的啦,还要去Mock一个对象吗?

比如:

A 类依赖于 B接口,那么你很清楚B接口只有一个实现B1,那么你在做A的单元测试的时候,有必要去做B的Mock吗?

在其他地方传入B接口实例是就是B1,为什么不直接传入B1实例呢?前提是B1的单元测试必须保证,即使没有保证的话,可以通过A的单元测试回归。

所以,你所说的“那朝所谓的技术小牛也越来越远了”,过于理论化,学习技术建议抱有怀疑的态度,什么能做比较重要,不能做更重要!

最后,送你一句话吧!纸上得来终觉浅,绝知此事要躬行


就是因为现在我们用的是maven+jenkins+sonar 所以有jenkins做持续构建并跑单元测试覆盖率,正因为我们现在的团队人数多,所以开发时不是由一个人从action写到dao,而是横切并行开发的,由专门的人写servcie和公用service.所以自己写的action自己要写mokc单元测试,而不是串行的等待其他人的servcie写完再测,至少是自扫门前雪,action行覆盖率要到85%,service的覆盖率要到90%.这也许与开发模式相关.但相比以前自己写个网页点点,算是从action测到dao层,至少从项目上线后一个月看,不像以前狂改bug了,整个项目的bug都集中在页面的体验上了,而不是诡异的throw null啊,业务逻辑异常.这个就是我的体验,不知道算不算绝知此事已躬行


看看我前面的帖子,如果是远程调用或者API级别,是要做Mock确实没有错。这是单元测试的策略问题,呵呵。如果多部门的协作就复杂了,建议还是不要设计复杂的接口类型,采用简单类型过度,等需要的时候在添加上去,这样你没有办法保证接口实现是不是100%可靠,到时候他那边做了任何修改,如果没有通知到你的话,这样事故责任不好定位。因此,这些是开发流程的问题。但不是每个实现都需要接口,上面的意思是说过度设计接口带来了负责,其实没有必要。一个简单的功能没有必要用多层封装,保持简单就OK了。
0 请登录后投票
   发表时间:2011-04-15   最后修改:2011-04-15
osprey 写道
zdmcjm 写道
osprey 写道
mercyblitz 写道
superhanliu 写道
ricoyu 写道
引用
但是我看到的情况都是在滥用。为一个功能写一个接口和一个实现类,然后就认为是面向接口编程。这种思路怎么来的,真正用的好吗?我是比较怀疑的。

LZ这段话我超级赞同的, 很多项目都是为了面向接口编程而面向接口编程, 庸人自扰之.
比如很多项目喜欢弄一个service接口, 然后对应一个serviceImpl实现类, 在action里持有这个service接口, 然后通过spring注入唯一的一个实现类serviceImpl, 这就是他们所谓的面向接口编程了.
在这种场景下完全不需要抽象出一个接口, 直接一个service具体类就ok了


同意!!!现在很多项目为了接口而接口,每个具体类都一定要整一个接口,为了接口而接口。实际上很多项目仔细一检查就会发现:接口和实现类的数量是1:1,而不是1:n(n是>1的浮点数)。如果都是1:1,就让人很怀疑这个接口的必要性了:1增加了代码量和复杂度;2增加了配置影响了性能。



这个不能这么说,如果是项目之间有远程调用的话,接口还是必要的,即使是1:1。如果是自娱自乐,那就算了!


上面的各位大仙,难道你们写程序不写单元测试的吗?,你对action的单元测试,如果不写基于service接口的mock,你的单元测试能过吗?测试覆盖率有多少?或者你是连aciton和service一起单元测试的,那dao的mock哪?如果说你是 action,service,dao,数据库表一起测的,那么那就不是单元测试了,是集成测试了!还谈什么弱藕合,或者你们能提供一个不是基于接口的单元测试方案出来,看看需要的hardcode代价是多少.
写代码不只是敲个可以执行的代码出来,还要可维护,可测试,还要有注释,文档.如果没有单元测试,什么重构都是浮云,造出来的是你们自己曾经接收的他人代码(多么看不懂,不可维护),然后自己如法炮制,继续恶心后面的人,如果你们只是认为写代码就是写个可以执行的代码,那不是就自我认知为代码工人,那朝所谓的技术小牛也越来越远了


要对action做单元测试,说明你的代码中,action充刺着大量本不属于action的职责,action本身是简单的,对action做测试,就是蛋疼行为,1+1=2需要测试吗?相应的包括什么service测试,dao测试,都需要个mock对象,我不否定mock。但也不是什么都用个mock。如果一个类可以自测试,我还要这些xxx注入干什么。就是因为需要xxx注入,所以项目代码一大坨,测试代也一大坨。

这个我只能说,在系统中1+1=2是需要测试的。你自己没有实现junit,不代表没有项目没有实现,如果举大点,现在稍微著名的开源框架或工具都有junit的代码的,这才能保证该框架或工具至少不是满地bug的。我建议你可以看看单元测试的内容,不管是传统的瀑布开发模型还是最新的敏捷模型,都要求单元模块测试,这是基础。“action本身是简单的,对action做测试,就是蛋疼行为”这是想当然的行为,“用眼睛看看猪肉质量就可以了,是简单的,所以不用仪器检测,所以瘦肉精猪肉就进来了,双汇就蛋疼了"


算了,关于测试的问题,爱测就测吧,那是不是最好连sun的编译器,你用的tomcat,你用的spring,把他的ApplicationContext之类的方法全部测试过,一个方法也不要漏,就算"spring".equals("spring")也要测,总之,是代码就要测试,不然系统上不了线哟。
0 请登录后投票
   发表时间:2011-04-15  
mercyblitz 写道
osprey 写道
mercyblitz 写道
osprey 写道
mercyblitz 写道
superhanliu 写道
ricoyu 写道
引用
但是我看到的情况都是在滥用。为一个功能写一个接口和一个实现类,然后就认为是面向接口编程。这种思路怎么来的,真正用的好吗?我是比较怀疑的。

LZ这段话我超级赞同的, 很多项目都是为了面向接口编程而面向接口编程, 庸人自扰之.
比如很多项目喜欢弄一个service接口, 然后对应一个serviceImpl实现类, 在action里持有这个service接口, 然后通过spring注入唯一的一个实现类serviceImpl, 这就是他们所谓的面向接口编程了.
在这种场景下完全不需要抽象出一个接口, 直接一个service具体类就ok了


同意!!!现在很多项目为了接口而接口,每个具体类都一定要整一个接口,为了接口而接口。实际上很多项目仔细一检查就会发现:接口和实现类的数量是1:1,而不是1:n(n是>1的浮点数)。如果都是1:1,就让人很怀疑这个接口的必要性了:1增加了代码量和复杂度;2增加了配置影响了性能。



这个不能这么说,如果是项目之间有远程调用的话,接口还是必要的,即使是1:1。如果是自娱自乐,那就算了!


上面的各位大仙,难道你们写程序不写单元测试的吗?,你对action的单元测试,如果不写基于service接口的mock,你的单元测试能过吗?测试覆盖率有多少?或者你是连aciton和service一起单元测试的,那dao的mock哪?如果说你是 action,service,dao,数据库表一起测的,那么那就不是单元测试了,是集成测试了!还谈什么弱藕合,或者你们能提供一个不是基于接口的单元测试方案出来,看看需要的hardcode代价是多少.
写代码不只是敲个可以执行的代码出来,还要可维护,可测试,还要有注释,文档.如果没有单元测试,什么重构都是浮云,造出来的是你们自己曾经接收的他人代码(多么看不懂,不可维护),然后自己如法炮制,继续恶心后面的人,如果你们只是认为写代码就是写个可以执行的代码,那不是就自我认知为代码工人,那朝所谓的技术小牛也越来越远了


小兄弟呀,接口的实现类是不是你自己写的?对于业务实现,你是要测试接口还是实现类呢?


OK,我来细细说一下,自己定义的接口难道还搞一个Mock去测试,为什么要Mock,你看看Spring Test里面,它是针对JEE标准接口而言,比如ServletRequest这类的接口,因为标准技术提供一个规约,这个具体实现不用关心,JEE容器提供实现。容器方面的话,你不用太过于测试。但是在你的单元测试代码中依赖了这些接口,通过Mock的方法来模拟输入,断言输出。

你说的Action一起测试的问题,是单元测试粒度的问题。

对于业务实现,你都自己知道怎么实现的啦,还要去Mock一个对象吗?

比如:

A 类依赖于 B接口,那么你很清楚B接口只有一个实现B1,那么你在做A的单元测试的时候,有必要去做B的Mock吗?

在其他地方传入B接口实例是就是B1,为什么不直接传入B1实例呢?前提是B1的单元测试必须保证,即使没有保证的话,可以通过A的单元测试回归。

所以,你所说的“那朝所谓的技术小牛也越来越远了”,过于理论化,学习技术建议抱有怀疑的态度,什么能做比较重要,不能做更重要!

最后,送你一句话吧!纸上得来终觉浅,绝知此事要躬行


就是因为现在我们用的是maven+jenkins+sonar 所以有jenkins做持续构建并跑单元测试覆盖率,正因为我们现在的团队人数多,所以开发时不是由一个人从action写到dao,而是横切并行开发的,由专门的人写servcie和公用service.所以自己写的action自己要写mokc单元测试,而不是串行的等待其他人的servcie写完再测,至少是自扫门前雪,action行覆盖率要到85%,service的覆盖率要到90%.这也许与开发模式相关.但相比以前自己写个网页点点,算是从action测到dao层,至少从项目上线后一个月看,不像以前狂改bug了,整个项目的bug都集中在页面的体验上了,而不是诡异的throw null啊,业务逻辑异常.这个就是我的体验,不知道算不算绝知此事已躬行


看看我前面的帖子,如果是远程调用或者API级别,是要做Mock确实没有错。这是单元测试的策略问题,呵呵。如果多部门的协作就复杂了,建议还是不要设计复杂的接口类型,采用简单类型过度,等需要的时候在添加上去,这样你没有办法保证接口实现是不是100%可靠,到时候他那边做了任何修改,如果没有通知到你的话,这样事故责任不好定位。因此,这些是开发流程的问题。但不是每个实现都需要接口,上面的意思是说过度设计接口带来了负责,其实没有必要。一个简单的功能没有必要用多层封装,保持简单就OK了。

一个简单功能是没有必要多层封装,有NCSS检测在sonar哪里等着的:(,反正我们开始写单元测试和mock,并且要求覆盖lv时,情绪也很不好,直到上线后,反而比以前轻松不用定着大压力改bug重复上线,从里面挖点作复用也觉得放心很多。接口的修改有svn和文档追踪的,反正比较好界定。而且有sonar的findbugs和checkstyle管着,觉得自己写的代码比开源的代码也比较接近了,至少知道一些不好的编程实践,改掉自己的编程的一些不好习惯,而不是没有单元测试,没有findbugs,写了代码也不知道好不好,哪里好,哪里不好,脚踩西瓜皮的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics