other dependency injection ways
最近一直在想其它的dependnecy injection方法,现在看到的比较有吸引力的就是类似ejb 3的那种field injection,就像这样:
public class InjectableObject {
@Inject private DependencyObject dependency;
}
@Inject private DependencyObject dependency;
}
初看这种方法觉得很惊艳,因为一个object的dependnecies是属于实现级的问题,把具体实现方法中的dependecies这样的privacy以getter或是setter的方式暴露出来都不如直接使用field来得优雅,但转念一想,又觉得不对,我们为什么使用pico或者spring这样container?一致的装配机制是一方面,但更多的是因为我们觉得这样的容器对组件的入侵小同时组件对容器的依赖低,我们津津乐道的是在没有pico的时候可以这样使用:
new InjectableObject(new DepenendecyObject())
在没有spring的时候可以这样的使用:
injectableObject.setDependency(new DependencyObject());
可是在没有容器的时候我们要怎样用field injection的component?怎样用getter injection的component?在dependency injection container里容器对组件的入侵和组件对容器的依赖是一对矛盾,取舍在于对哪方面更重视,可是我觉得优雅的把一个组件绑到特定的容器对于轻量级方案而言并不是一个明智的办法,单纯为了减少组件入侵而增加了容器依赖,那么这个容器作为一种通用的装配容器就是失败的,当然它仍然可能在特定的架构上成功的,比如ejb 3,ejb始终是server-side component技术,那么必然绑会对server side container有依赖,那么sun能做的也就只是降低对组件的入侵,因此有了ejb3的field injection,这么一张华美的皮使他看上去更整洁而已。