该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-10
Quake Wang 写道 这样做会不会更好一些?
在Config这个class所在的package下面,有一个同名的Config.properties文件,里面有设置同名field的值: accounts=xxx user=xxx password=xxx 然后实现一个BeanPostProcessor来根据这个约定来注入值。 这样就省了在Config.java文件写一堆的@Properties annotation,如果你觉得在某些情况下properties文件无法保证和field同名这个约定,你也可以再以@Properties annotation为优先设定。 有道理,尤其是用在vo上很方便,那么也就是说可以提供两个功能,一个是基于规则的(这个规则就是properties文件要和vo名称对应),一个是基于annotation的,如果没有annotation就代表这个是基于规则的。 |
|
返回顶楼 | |
发表时间:2008-04-10
Quake Wang 写道 这样做会不会更好一些?
在Config这个class所在的package下面,有一个同名的Config.properties文件,里面有设置同名field的值: accounts=xxx user=xxx password=xxx 然后实现一个BeanPostProcessor来根据这个约定来注入值。 这样就省了在Config.java文件写一堆的@Properties annotation,如果你觉得在某些情况下properties文件无法保证和field同名这个约定,你也可以再以@Properties annotation为优先设定。 Convention Over Configuration的理念用的cool啊,呵呵 其实总的理念就是用BeanPostProcessor对bean定义做后处理,至于通过何种方式获取后处理用的数据,那就各家自显神通了,呵呵 |
|
返回顶楼 | |
发表时间:2008-04-10
Quake Wang果然是经验丰富啊。这里依稀看到了Webwork中类型转化的影子。用在这里真是恰到好处。
|
|
返回顶楼 | |
发表时间:2008-04-11
downpour 写道 Quake Wang果然是经验丰富啊。这里依稀看到了Webwork中类型转化的影子。用在这里真是恰到好处。
呵呵,Quake Wang是习惯了rails,同时更习惯了rails的默认优于配置的原则 |
|
返回顶楼 | |
发表时间:2008-04-12
Guice作同样的事情简单很多
读取properties Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { Properties properties = new Properties(); properties.setProperty("name", "Guice"); properties.setProperty("description", "Value"); Names.bindProperties(binder(), properties); } }); 设置对象 class DummyPropertyClass { @Inject @Named("name") String name; @Inject @Named("description") String description; } 调用对象 DummyPropertyClass instance = injector.getInstance(DummyPropertyClass.class); assert instance.name.equals("Guice"); assert instance.description.equals("Value"); 个人认为,Guice在DI方面比Spring Javaconfig简单很多 |
|
返回顶楼 | |
发表时间:2008-04-12
yizhuo 写道 Guice作同样的事情简单很多
读取properties Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { Properties properties = new Properties(); properties.setProperty("name", "Guice"); properties.setProperty("description", "Value"); Names.bindProperties(binder(), properties); } }); 我怎么就没有看出来这方面guice简单很多呢,上面的设置代码在spring只是一段配置,我在原文中已经给出,这个功能上guice并没有什么突出的特点。 而下面这段代码和我原文中的注入代码没有什么本质的区别,要说区别,那么就是,我只要一个annotation(@Properties),而guice需要两个,哪里有什么guice在这方面简单多了之说???? class DummyPropertyClass { @Inject @Named("name") String name; @Inject @Named("description") String description; } |
|
返回顶楼 | |
发表时间:2008-04-12
说简化也就是没有xml了而已,也许感觉xml换成了annotation就算是简化了,是说配置文件减少了吗?
用guice支持properties还是第一次见到,谢谢yizhuo的代码了。不知道有没有可能修改成Quake Wang说的那种自动查找包内同名配置文件的方式。 |
|
返回顶楼 | |
发表时间:2008-04-12
ahuaxuan 写道 上面的设置代码在spring只是一段配置? 你指的是setProperty么?我只是写个testcase举例,真正的环境自然是读取property文件。 区别在于,spring要做你写的那些东西,而guice不需要。 |
|
返回顶楼 | |
发表时间:2008-04-12
xyz20003 写道 不知道有没有可能修改成Quake Wang说的那种自动查找包内同名配置文件的方式。
是说不同包内有同样的设置文件,但是里面的内容不同? 目前我的开发里没有这种需求。如果是开发和生产环境要用不同的代码,可以把不同的文件放进classpath,然后读取classpath里面的文件。 比如test/config/server.properties和main/config/properties,测试环境用前者,生产环境用后者 |
|
返回顶楼 | |
发表时间:2008-04-12
Quake Wang所说的意思是
如果有一个com.family168.domain.Student类。 那么他对应的i18n文件就放在com/family168/domain/Student.properties下。 听ajoo说guice是静态绑定模型,可能没办法实现这种动态查找同一个包下对应配置的功能。 |
|
返回顶楼 | |