2007-11-10
Not Convinced about JavaConfig
印象中,Spring就象上个世纪的产品。不论使用方便性和代码设计都相当20世纪。有了Guice,Spring似乎应该逐渐退隐,被遗忘于江湖了。我最近这个项目就是在从Spring往Guice移植。大家都很高兴终于不用在这个即将失事的火车上挤着了。一个哥们在白板上用红笔大字写上:“用xml写配制半点好处也木有!”。
然后就看到了Spring JavaConfig。和这个火药贴:
http://www.jroller.com/habuma/entry/guice_vs_spring_javaconfig_a
本来都对Spring失去兴趣了,不过看这么多人为之正名,于是就去看了一下。总的来说呢,眼睛一亮,然后比较失望。
JavaConfig从语法上说比Guice 1.0又进了一步,使用了最简单直观的method,然后用一些annotation来增加功能。这个和Guice 2.0比较象。谁抄谁我不管,技术上就这么点东西,这年头,民工都快能造原子弹了。
简单的东西两者差不多。文章里比的是Guice 1.0, 但是我觉得拿快出来的Guice 2.0比较更加有意义一些。比如他那个KnightConfig的例子,用Guice 2.0写,大致是这样:
JavaConfig是这样:
除了annotation不同,都一样。JavaConfig基本上就是把xml的manual wiring换到Java里面了(一件非常积德的事情)。Walls喋喋不休地强调的Spring的非侵入性其实没半点意义。要是真不想用Guice的@Inject,你完全可以也写成这种manual wiring的形式(就象上面的例子一样),根本不会有侵入。Guice只不过是通过@Inject让你可以以少许的侵入换取编程的方便罢了。
我认为比较重要的,是两者如何解决“依赖”。这个骑士的例子不存在依赖,每个bean都不需要引用其它的bean。其实这种简单的例子根本就没有意义。你说你能看出来JavaConfig比直接用裸Java配制优势在哪?就在于你最后可以用:
而不是简单的:
显得比较sophisticated?今天我“春”了?
然后我就去找了JavaConfig的教程,看了一下它怎么解决依赖,下面是例子:
然后我就怅然太息。这就是Spring的想象力呀。还是xml那一套,不过是从:
变成了
这到也罢了。但是看到人家自豪的宣称:“你以为rod()是个函数调用吗?哈,答错啦!扣10分。这其实是一个bean reference, 它不直接调用你简单的大脑自以为调用的rod()函数,也不要以为你在电脑前作弊,用F3/F4热键带你过去的就是正确的选项。正确的答案是这里通过Spring的魔法得到了一个singleton!强吧?”,我就吐了。
这里的魔术,不用说,又是用了cglib,给偷偷弄了一个子类给override了——虽然我看不见这个子类。
但是,用了cglib,也就意味着下面几个限制:
1. 必须有public default constructor。
2. 必须不能final
也就是说我这个Config类不能带状态,不能给它注射依赖。这些函数虽然不能是static(否则spring的魔法就失效了)但是作用跟static method一样。白马非马吗?
确实强悍啊。看来以后可以象oracle认证一样,弄个spring认证来骗钱好了。
算了,不够聪明的我还是看看Guice 2.0的吧:
恩。我发现我虽然比较笨,看这个代码似乎还没有什么困难。不过是两个一点花头没有的函数,我眼睛里看见的它做了什么,它就必然做了什么,所有经典物理定律完全适用,没有任何不符合常识的东西。而且这似乎更符合"don't call us, we'll call you"的精神。也不需要担心那么多限制。比如,我可以快乐地把book title当成参数注射到这个Module里面:
想怎么搞就怎么搞,因为BookModule自己也不过就是一个没什么限制的Pojo。
然后就看到了Spring JavaConfig。和这个火药贴:
http://www.jroller.com/habuma/entry/guice_vs_spring_javaconfig_a
本来都对Spring失去兴趣了,不过看这么多人为之正名,于是就去看了一下。总的来说呢,眼睛一亮,然后比较失望。
JavaConfig从语法上说比Guice 1.0又进了一步,使用了最简单直观的method,然后用一些annotation来增加功能。这个和Guice 2.0比较象。谁抄谁我不管,技术上就这么点东西,这年头,民工都快能造原子弹了。
简单的东西两者差不多。文章里比的是Guice 1.0, 但是我觉得拿快出来的Guice 2.0比较更加有意义一些。比如他那个KnightConfig的例子,用Guice 2.0写,大致是这样:
public class KnightModule {
@Provide
public Knight knight() {
...
}
@Provide
public Quest quest() {
...
}
...
}
JavaConfig是这样:
@Configuration
public class KnightConfig {
@Bean public Knight knight() {
KnightOfTheRoundTable knight = new KnightOfTheRoundTable("Bedivere");
knight.setQuest(quest());
return knight;
}
@Bean public Quest quest() {
return new HolyGrailQuest();
}
@Bean @SpringAdvice("execution(* *.embarkOnQuest(..))")
public MinstrelInterceptor minstelAdvice() {
return new MinstrelInterceptor();
}
}
除了annotation不同,都一样。JavaConfig基本上就是把xml的manual wiring换到Java里面了(一件非常积德的事情)。Walls喋喋不休地强调的Spring的非侵入性其实没半点意义。要是真不想用Guice的@Inject,你完全可以也写成这种manual wiring的形式(就象上面的例子一样),根本不会有侵入。Guice只不过是通过@Inject让你可以以少许的侵入换取编程的方便罢了。
我认为比较重要的,是两者如何解决“依赖”。这个骑士的例子不存在依赖,每个bean都不需要引用其它的bean。其实这种简单的例子根本就没有意义。你说你能看出来JavaConfig比直接用裸Java配制优势在哪?就在于你最后可以用:
Knight knight = (Knight) ctxt.getBean("knight");
而不是简单的:
Knight knight = new KnightModule().knight();
显得比较sophisticated?今天我“春”了?
然后我就去找了JavaConfig的教程,看了一下它怎么解决依赖,下面是例子:
@Bean(scope = DefaultScopes.SINGLETON)
public Person rod() {
return new Person("Rod Johnson");
}
@Bean(scope = DefaultScopes.PROTOTYPE)
public Book book() {
Book book = new Book("Expert One-on-One J2EE Design and Development");
book.setAuthor(rod()); // rod() method is actually a bean reference !
return book;
}
然后我就怅然太息。这就是Spring的想象力呀。还是xml那一套,不过是从:
<property name="author" ref="rod"/>
变成了
book.setAuthor(rod());
这到也罢了。但是看到人家自豪的宣称:“你以为rod()是个函数调用吗?哈,答错啦!扣10分。这其实是一个bean reference, 它不直接调用你简单的大脑自以为调用的rod()函数,也不要以为你在电脑前作弊,用F3/F4热键带你过去的就是正确的选项。正确的答案是这里通过Spring的魔法得到了一个singleton!强吧?”,我就吐了。
这里的魔术,不用说,又是用了cglib,给偷偷弄了一个子类给override了——虽然我看不见这个子类。
但是,用了cglib,也就意味着下面几个限制:
1. 必须有public default constructor。
2. 必须不能final
也就是说我这个Config类不能带状态,不能给它注射依赖。这些函数虽然不能是static(否则spring的魔法就失效了)但是作用跟static method一样。白马非马吗?
确实强悍啊。看来以后可以象oracle认证一样,弄个spring认证来骗钱好了。
算了,不够聪明的我还是看看Guice 2.0的吧:
@Provide @Singleton
public Person bob() {
return new Person("crazybob");
}
@Provide
public Book book(Person author) {
Book book = new Book("Guice!");
book.setAuthor(author);
return book;
}
恩。我发现我虽然比较笨,看这个代码似乎还没有什么困难。不过是两个一点花头没有的函数,我眼睛里看见的它做了什么,它就必然做了什么,所有经典物理定律完全适用,没有任何不符合常识的东西。而且这似乎更符合"don't call us, we'll call you"的精神。也不需要担心那么多限制。比如,我可以快乐地把book title当成参数注射到这个Module里面:
class BookModule {
private final String title;
BookModule(String title) {
this.title = title;
}
@Provide @Singleton
public Person bob() {
return new Person("crazybob");
}
@Provide
public Book book(Person author) {
Book book = new Book(title);
book.setAuthor(author);
return book;
}
}
想怎么搞就怎么搞,因为BookModule自己也不过就是一个没什么限制的Pojo。
评论
andycui
2008-04-06
集中精力解决业务问题,如果你是做软件产品,那么成为该软件产品所服务的行业的行业专家,如果你是做项目,好好帮助客户解决他的问题,而不是在这里讨论这些无关紧要的问题,否则你永远只是一个coder
murainwood
2008-03-31
你的意思是说,这么写代码,不理解IoC?
请详细解释下
请详细解释下
radar
2008-03-31
@Bean(scope = DefaultScopes.SINGLETON)
public Person rod() {
return new Person("Rod Johnson");
}
@Bean(scope = DefaultScopes.PROTOTYPE)
public Book book() {
Book book = new Book("Expert One-on-One J2EE Design and Development");
book.setAuthor(rod()); // rod() method is actually a bean reference !
return book;
}
理解IOC的这样写代码,不让人疯吗!
murainwood
2008-03-31
Annotaition在项目里面早已经大量使用了.
所以,不发表评论.
所以,不发表评论.
williamy
2008-03-31
请问一个工具很重要吗?
我有时候喜欢用标枪来捕猎,吃吃肉食
有时候喜欢用石斧,砍一些素食
我觉得工具对我来说,不重要
对于那些机械化很高的东西,我不会用
因为我还不知道什么叫机械,
我有时候喜欢用标枪来捕猎,吃吃肉食
有时候喜欢用石斧,砍一些素食
我觉得工具对我来说,不重要
对于那些机械化很高的东西,我不会用
因为我还不知道什么叫机械,
quaff
2008-03-31
dan 写道
quaff 写道
dan 写道
請問這是莊表偉"JavaEye社區分析"blog中的深度討論嗎?,請問評為精華帖的內容在那裡?知道的人請說明,看來看去都是使用習慣的討論,如果發帖者是星星級以慣例應早沉了。
这位是tw过来的?
楼主的就是精华贴,信徒们评的.
我比較笨,想從帖子得到知識,精華帖有他的價值,能不能說明有價值內容在那裡,我想學習到東西
"精華帖有他的價值"在这里不适用.
Readonly
2008-03-31
dan 写道
請問這是莊表偉"JavaEye社區分析"blog中的深度討論嗎?,請問評為精華帖的內容在那裡?知道的人請說明,看來看去都是使用習慣的討論,如果發帖者是星星級以慣例應早沉了。
庄表伟 写道
6、神出鬼没者,有些人在JavaEye有着极高的人气和知名度,不过出现的次数很少,一旦出现就会引发围观
ajoo和T1都是属于这种类型的,拥有自己的亲卫队,哪怕发入门帖也有可能会被fans投成精华贴...
其实,这帖子偶当初投了隐藏,可惜敌不过他的fans...
dan
2008-03-31
quaff 写道
dan 写道
請問這是莊表偉"JavaEye社區分析"blog中的深度討論嗎?,請問評為精華帖的內容在那裡?知道的人請說明,看來看去都是使用習慣的討論,如果發帖者是星星級以慣例應早沉了。
这位是tw过来的?
楼主的就是精华贴,信徒们评的.
我比較笨,想從帖子得到知識,精華帖有他的價值,能不能說明有價值內容在那裡,我想學習到東西
quaff
2008-03-31
dan 写道
請問這是莊表偉"JavaEye社區分析"blog中的深度討論嗎?,請問評為精華帖的內容在那裡?知道的人請說明,看來看去都是使用習慣的討論,如果發帖者是星星級以慣例應早沉了。
这位是tw过来的?
楼主的就是精华贴,信徒们评的.
dan
2008-03-31
請問這是莊表偉"JavaEye社區分析"blog中的深度討論嗎?,請問評為精華帖的內容在那裡?知道的人請說明,看來看去都是使用習慣的討論,如果發帖者是星星級以慣例應早沉了。
tinywind
2008-03-31
为什么我看到annotation就觉得很恶心
murainwood
2008-03-31
一个世纪都落后了,落后几年没啥大问题.
天门冬
2008-03-31
哈,我对JavaConfig不了解,但从我用Spring中,我觉得使用XML Config可以很方便看出整体的情况。
如果在Java注解配置,觉得没那么方便!
如果在Java注解配置,觉得没那么方便!
calmness
2008-03-28
支持XML,但是也不反对注解,不过注解用多了确实不好,虽然都是代码,但是意义不同,配置代码独立出来更容易统一维护,我不敢想象整个应用到处都充斥着annotation,我相信那样我会被它搞疯掉。就像我的JSP文件中到处都是JAVA代码一样的头疼,为了后期方便维护以及管理,即使XML麻烦,但是我还是选择XML方式。而且使用XML配置,能够方便的为配置提供可视化支持,如果是annotation就......
cindy_taozhiang
2008-03-28
ronghao 写道
[quote="ajoo"]重构不友好。很多IDE给Java代码提供的功能(如find reference)不能用了。xml语法烦琐。你可以轻易获得几千行的xml代码,而无法用我们熟悉的重构方法(如extract class, extract method)来改善。 归根结底,配制也是代码,为什么要另外找一种语言来写代码?[/quote]
我觉得之所以用xml,一个显然的优势是清晰。正如你说的:你可以轻易获得几千行的xml代码。关键是对这些xml需要一种合适的管理。另外我觉得还有一个很重要的部分:xml可以在运行期动态的修改。xml甚至可以描述大粒度的业务逻辑。
我觉得之所以用xml,一个显然的优势是清晰。正如你说的:你可以轻易获得几千行的xml代码。关键是对这些xml需要一种合适的管理。另外我觉得还有一个很重要的部分:xml可以在运行期动态的修改。xml甚至可以描述大粒度的业务逻辑。
同意...
Herculesx
2007-12-17
spring2.5支持注解方式的IoC,其他的因为要向下兼容也没办法,API设计本来就是吃力不讨好的活,反正我现在能用注解的地方就不再写xml了。另外,spring的侵入性也很明显,用了那么多他的工具,没办法说换就换,aop,tx,orm,jms...整的现在不用spring不会写程序了
leadyu
2007-12-16
xml还是有好处的,在大型项目里面哪能说改代码就改代码的?xml起码工程人员改了重新发布就行。而且像第三方组件包呢?代码都没有,怎么改?
当项目大到一定程度的时候是非常需要一个集中的地方去配置,而不是散布在各个类里面。开发和生产是不一样的呀,作为开发者和生产系统运营者两种不同的角度看这个问题就不是这样想的咯。
annotation替换配置?
java世界怎么了?倒退阿!
当项目大到一定程度的时候是非常需要一个集中的地方去配置,而不是散布在各个类里面。开发和生产是不一样的呀,作为开发者和生产系统运营者两种不同的角度看这个问题就不是这样想的咯。
annotation替换配置?
java世界怎么了?倒退阿!
bookong
2007-12-14
差沙 写道
风水轮流转, 早晚有一天我们一帮人还会拿着个新的框架说Guice的不好, 不然我的姓怎么写都行。
哈哈哈哈,说的好!
差沙
2007-12-06
风水轮流转, 早晚有一天我们一帮人还会拿着个新的框架说Guice的不好, 不然我的姓怎么写都行。
realghost819
2007-12-06
上了spring的贼船了,下不来了
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 179855 次

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
动态properties转换
恩,不错,method.getReturnType 都用上了。动态代理的价值全被 ...
-- by upyaya -
动态properties转换
apache beanutils中 dwr中 jsf myfaces中 都有基 ...
-- by kimmking -
动态properties转换
签名,泛型,代理 都是自己平时很少用到的,运行一下,学习一下
-- by soleghost -
动态properties转换
呵呵,精益求精啊,不过有个地方参数顺序好像错了: public final c ...
-- by racnow -
动态properties转换
感觉可以参考spring里面的类型转换吧,它好像用的是java的Property ...
-- by yufu






评论排行榜