论坛首页 Java企业应用论坛

别装了,难道你们不想把properties直接注入到object中去(spring-plugin)?

浏览 28476 次
该帖已经被评为良好帖
作者 正文
   发表时间: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就代表这个是基于规则的。

0 请登录后投票
   发表时间: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定义做后处理,至于通过何种方式获取后处理用的数据,那就各家自显神通了,呵呵
0 请登录后投票
   发表时间:2008-04-10  
Quake Wang果然是经验丰富啊。这里依稀看到了Webwork中类型转化的影子。用在这里真是恰到好处。
0 请登录后投票
   发表时间:2008-04-11  
downpour 写道
Quake Wang果然是经验丰富啊。这里依稀看到了Webwork中类型转化的影子。用在这里真是恰到好处。

呵呵,Quake Wang是习惯了rails,同时更习惯了rails的默认优于配置的原则
0 请登录后投票
   发表时间: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简单很多
0 请登录后投票
   发表时间: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;
}



0 请登录后投票
   发表时间:2008-04-12  
说简化也就是没有xml了而已,也许感觉xml换成了annotation就算是简化了,是说配置文件减少了吗?

用guice支持properties还是第一次见到,谢谢yizhuo的代码了。不知道有没有可能修改成Quake Wang说的那种自动查找包内同名配置文件的方式。
0 请登录后投票
   发表时间:2008-04-12  
ahuaxuan 写道

上面的设置代码在spring只是一段配置?


你指的是setProperty么?我只是写个testcase举例,真正的环境自然是读取property文件。

区别在于,spring要做你写的那些东西,而guice不需要。
0 请登录后投票
   发表时间:2008-04-12  
xyz20003 写道
不知道有没有可能修改成Quake Wang说的那种自动查找包内同名配置文件的方式。


是说不同包内有同样的设置文件,但是里面的内容不同?

目前我的开发里没有这种需求。如果是开发和生产环境要用不同的代码,可以把不同的文件放进classpath,然后读取classpath里面的文件。

比如test/config/server.properties和main/config/properties,测试环境用前者,生产环境用后者
0 请登录后投票
   发表时间:2008-04-12  
Quake Wang所说的意思是
如果有一个com.family168.domain.Student类。
那么他对应的i18n文件就放在com/family168/domain/Student.properties下。

听ajoo说guice是静态绑定模型,可能没办法实现这种动态查找同一个包下对应配置的功能。
0 请登录后投票
论坛首页 Java企业应用版

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