2012-09-21 75 views
0

访问不受弹簧管理的应用中深层的弹簧组件的最佳方法(或选项)是什么?深层注射 - 弹簧

例如,假设我有一些@Controllers。通过一些不受Spring管理的POJO抽象层,这些@Controllers最终可能会使用需要注入@Service的POJO。

一个选择是将所有的图层制作成弹簧组件,但是好像我在破解我的设计以强制春天来帮助我。我有一些复杂的事情发生,如果我必须@Autowire的一切都不会那么干净。另一种选择可能是在低级别类中手动注入组件,但我不确定这是否可行或正确的解决方案。

+0

我的直觉是,如果事情彼此“分离”,那么他们就不应该依赖彼此。 – rolve

+0

@rolve - 我不确定我是否理解评论,但我认为我的回复是“他们没有”。 LowLevelHelper POJO需要使用\ @Service类来访问数据库。它不依赖于它上面的任何层。 –

+0

@rolve - 我想我意识到混乱 - LowLevelHelper POJO需要使用的弹簧组件与“图层”顶部的组件不同。我会在帖子中明确这一点。 –

回答

2

本着回答原始问题的精神,我会说你可以让低级的非Spring类实现ApplicationContextAware来访问ApplicationContext,并使用ApplicationContext来访问你想要的任何spring bean。 (google搜索“spring application context aware”找到sample code

但是,本着这样一个大问题,从一开始就存在一些问题。首先,这听起来像你有高级组件,你想注入到低级别的组件 - 通常你希望你的设计是相反的方式。另外,正如已经指出的那样,彼此“层叠”的事物可能不应该依赖于彼此。在这种情况下,考虑到这些要点来改进设计将有助于您。

我不会回避将所有图层转换为弹簧组件,以充分利用您已经使用的框架。如果您想使用DI框架,使用它来构建整个应用程序通常很有帮助。我认为,整个使用@Inject(Java EE标准)和使用DI框架布线进行范围控制的干净设计实际上比“新”一切都要干净。

+0

也许我想在任何地方都使用DI框架。我看到你关于如何创建混合/匹配的观点,但所有的应用程序永远都不需要是弹簧组件,所以以这种方式强制它看起来是错误的。框架应该帮助我,而不是强迫我去迎合它。 我试图澄清原始文章 - 低级别的类不依赖于使用它的弹簧组件;它取决于高层控制器不知道的其他弹簧组件。 –

+0

我决定从你共享的示例代码中去找方法。如果我试图强迫它实现完全弹簧管理的设计,那么会有太多其他事情发生,最终会变得非常不自然。谢谢! –