|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-03-19
ajoo 写道 Guice 1.0的Provider语法本来就比较烦琐,java的匿名类就长成这样子啦,没办法。但是再差劲也比xml好看。而且毕竟是类型安全,重构方便的。
Guice 2.0的语法会漂亮很多:
@Provide
public Foo foo(FooImpl impl) { // Foo is an interface
impl.initialize();
return impl;
}
至于为什么不需要postconstruct,我觉得是: 1。setter injection本来就不推荐,所以二等公民的特殊要求得不到支持很正常。 2。需要postConstruct/initialize的bean占的比例更少,而且这种做法本身就被Guice开发者们认为是很不好的习惯,不值得为此把框架复杂化。用上面的方法已经足够了。 至于PreDestroy,呵呵,看2.0吧。 为什么setter不好?看Effective Java里面关于immutable的条目。 不用重编译?有多大意义?你难道不需要重新打包?重新部署?编译器是助手,是朋友,它帮你做类型检查的。要是真这么讨厌编译,为什么不用ruby?不管什么,直接改代码就是了。 语法怎么漂亮也不如在一个方法上面加@PostConstruct方便,还有框架首先考虑的应该是用户的方便性而不是自己的复杂化,用户不用去关心你内部复杂不复杂. setter injection不知道被谁评为二等公民了,至少目前来说还是主流,IoC出现之前的那些很古老的lib基本上也是提供了setter/getter. 如果对象是immutable的,当然用constructor注入最好,但是用setter注入也不见得有什么问题,但是很多情况下对象不是immutable的,需要在运行期改变系统行为 |
|
| 返回顶楼 | |
|
时间:2008-03-19
我觉得方便性没什么差别。
设计一个框架不是shopping-list。不是不管什么功能哪怕有一个人要也得塞进去,那样最终又是一个庞大臃肿的Spring了。每个新的功能在带来好处的同时,也同时复杂化框架,增大学习曲线。需要权衡的。 至于对setter的爱好,我就不和你争论了。这么喜欢setter的,也许还是呆在spring里算了。Guice是给我们这些认识到setter的丑陋,愿意拥抱immutable的人用的。 引用一下Hani的话: XML wiring is for girls. |
|
| 返回顶楼 | |
|
时间:2008-03-19
个人口味喜欢轻纯的,管它是否spring
|
|
| 返回顶楼 | |
|
时间:2008-03-19
ajoo 写道 我觉得方便性没什么差别。
设计一个框架不是shopping-list。不是不管什么功能哪怕有一个人要也得塞进去,那样最终又是一个庞大臃肿的Spring了。每个新的功能在带来好处的同时,也同时复杂化框架,增大学习曲线。需要权衡的。 至于对setter的爱好,我就不和你争论了。这么喜欢setter的,也许还是呆在spring里算了。Guice是给我们这些认识到setter的丑陋,愿意拥抱immutable的人用的。 引用一下Hani的话: XML wiring is for girls. 我也同意不是所有功能都要塞进去,但是我说这个需求是最基本的需求,新功能可以交给扩展去做 我觉得你是对spring有偏见,spring一样可以用Annotation配置,我也在尽量回避刻意拿spring来做比较. 还是要提一下XML配置有两个Anntation做不到的地方 1.前面说过了,改个用户密码什么的不需要重编译,这个很重要,系统管理员才不会去管编译的事情 2.对于已经存在的lib,一样可以注入,不可能自己去下载源码然后手动加上@Inject吧. 萝卜青菜,各有所好,谁吃谁知道. |
|
| 返回顶楼 | |
|
时间:2008-03-19
quaff 写道 还是要提一下XML配置有两个Anntation做不到的地方 1.前面说过了,改个用户密码什么的不需要重编译,这个很重要,系统管理员才不会去管编译的事情 2.对于已经存在的lib,一样可以注入,不可能自己去下载源码然后手动加上@Inject吧. 萝卜青菜,各有所好,谁吃谁知道. 1.
import static com.google.inject.name.Names.bindProperties;
import java.util.Properties;
...
Properties prop = new Properties();
prop.load(....);
Injector injector = Guice.createInjector(new AbstractModule() {
protected void configure() {
bindProperties(binder(), prop);
},...);
2. Provider+Scope 我滴项目统统以guice为基础,我觉得,挺好使。lz说的preXXX和postXXX,我就不明白了,这能有啥困扰的,要多灵活能做多灵活呀。listener可以,scope更好,其实多半不管也没差,@Inject方法初始也未必就味道差啊,你起个initial或者inject或者你喜欢的afterPropertiesSet不就好了么。 |
|
| 返回顶楼 | |
|
时间:2008-03-19
quaff 写道 我也同意不是所有功能都要塞进去,但是我说这个需求是最基本的需求,新功能可以交给扩展去做 我觉得你是对spring有偏见,spring一样可以用Annotation配置,我也在尽量回避刻意拿spring来做比较. 呵呵。可是很多人,包括Guice的开发者,包括我,都不认为这是一个值得支持的功能啊。Guice强调immutable,强调无副作用,为了一个best practice不需要的功能复杂化内核,不值得也不情愿啊。(其实,我心里是偷偷这么想的:让你丫用setter,麻烦死你! Spring那个annotation支持我认为是笑话的。有心情可以去找找我前段时间写的Not Convinced about JavaConfig。 quaff 写道 还是要提一下XML配置有两个Anntation做不到的地方 1.前面说过了,改个用户密码什么的不需要重编译,这个很重要,系统管理员才不会去管编译的事情 2.对于已经存在的lib,一样可以注入,不可能自己去下载源码然后手动加上@Inject吧. 萝卜青菜,各有所好,谁吃谁知道. 如果是系统管理员,一般情况xml也不合适。我们不希望让系统管理员看见那一大堆bean的。一般或者是部署到jee容器里(比如websphere),或者用command line flag,而xml和properties文件一般都打包到jar里的。 至于说不能加@Inject,呵呵,用provider呀,最多也就和spring的manual wiring一样罢了。要说manual wiring可是Spring的推荐配置。 |
|
| 返回顶楼 | |
|
时间:2008-03-20
b051 写道 quaff 写道 还是要提一下XML配置有两个Anntation做不到的地方 1.前面说过了,改个用户密码什么的不需要重编译,这个很重要,系统管理员才不会去管编译的事情 2.对于已经存在的lib,一样可以注入,不可能自己去下载源码然后手动加上@Inject吧. 萝卜青菜,各有所好,谁吃谁知道. 1.
import static com.google.inject.name.Names.bindProperties;
import java.util.Properties;
...
Properties prop = new Properties();
prop.load(....);
Injector injector = Guice.createInjector(new AbstractModule() {
protected void configure() {
bindProperties(binder(), prop);
},...);
2. Provider+Scope 我滴项目统统以guice为基础,我觉得,挺好使。lz说的preXXX和postXXX,我就不明白了,这能有啥困扰的,要多灵活能做多灵活呀。listener可以,scope更好,其实多半不管也没差,@Inject方法初始也未必就味道差啊,你起个initial或者inject或者你喜欢的afterPropertiesSet不就好了么。 你说用@Inject方法初始化味道很好我没什么好说的了,麻烦贴个实现PreDestroy的代码. |
|
| 返回顶楼 | |
|
时间:2008-03-20
ajoo 写道 呵呵。可是很多人,包括Guice的开发者,包括我,都不认为这是一个值得支持的功能啊。Guice强调immutable,强调无副作用,为了一个best practice不需要的功能复杂化内核,不值得也不情愿啊。(其实,我心里是偷偷这么想的:让你丫用setter,麻烦死你! Spring那个annotation支持我认为是笑话的。有心情可以去找找我前段时间写的Not Convinced about JavaConfig。 如果你们觉得生命周期管理不是Guice的职责,那么我想知道如果我用Guice来管理数据源,是不是要自己手动关闭? 我认为你们只是拿Guice当作一个lib使用而不是容器来用. Spring的annotation本来就是把xml配置用java代码写出来,对于spring开发者来说可以重用已有的功能,对于spring的使用者来说,可以利用IDE的代码检测重构等功能,一般情况下是两个共用,把javaconfig放入xml配置里面,所以你拿javaconfig和Guice的module来比没有意义,两者是不同的东西虽然都是用Annotation.选用了哪个就得按照哪个的设计者的思路去开发这个没什么好说的,你拿guice来要求spring和别人拿spring来要求guice是一样没有意义的,就像Linux新手老是问我在Windows里面可以这么做这么做,Linux怎么不行,我拿生命周期来说事不是因为spring有这个才拿来比,是我认为所有的容器应该提供的最基本的功能. ajoo 写道 如果是系统管理员,一般情况xml也不合适。我们不希望让系统管理员看见那一大堆bean的。一般或者是部署到jee容器里(比如websphere),或者用command line flag,而xml和properties文件一般都打包到jar里的。 至于说不能加@Inject,呵呵,用provider呀,最多也就和spring的manual wiring一样罢了。要说manual wiring可是Spring的推荐配置。 我们现在就是系统管理员直接去修改xml或者properties,我相信很多人都是直接部署而不是打包war,ear,况且生产环境的配置比如用户密码有的时候是保密的只能系统管理员知道,系统管理员不在乎是xml还是别的什么,他只需要知道是文本可以直接修改就行了. |
|
| 返回顶楼 | |
|
时间:2008-03-20
Java最大的好处,就是民主开放,可以充分发挥想像力,可以不断地制造各式各样的轮子。
Java最大的坏处,就是选轮子、换轮子累人。 |
|
| 返回顶楼 | |
|
时间:2008-03-20
我不是说了吗?PreDestroy是有存在的必要的。估计Guice 2.0应该会有这个支持了。我怀疑的主要是PostConstruct的必要性。
另外,对于password,如果你不打包,properties文件是最合适的地方。 对JavaConfig,最大的问题是它不够pojo。你看见它的代码调用fooBean(),然后你用IDE navigate过去,可以看见代码。可是,这一切都是假象,Spring在背后用cglib做了很多小动作,比如singleton,你看见代码调用了fooBean(),但是实际上它并不见得调用。这种违反直觉的东西亏得他们好意思写出来! |
|
| 返回顶楼 | |










