2012-03-11 66 views
6

就像在上面的标题中一样,我对通过直接@Autowired annnotation注入applicationContext或在Singleton Spring bean中实现ApplicationContextAware接口之间的优缺点感到困惑。在Spring3中注入applicationContext的最佳实践

哪一个你喜欢哪种情况?为什么?谢谢。

回答

9

其实两者都不好。它们都将你的应用程序绑定到Spring框架,从而颠倒了整个反转控制概念。在理想的世界中,您的应用程序不应该意识到由ApplicationContext管理。

一旦你选择违反这个原则,你怎么做并不重要。 ApplicationContextAware是已经在at least since Version 2.0附近的传统版本。 @Autowired是一种较新的机制,但它们的工作方式几乎相同。我可能会去ApplicationContextAware,因为它在语义上明确了它是什么。

+0

谢谢。但是,如果将applicationContext注入到bean中的bean已经是spring bean了呢?你认为这还是违规吗?顺便说一句,实际上我的大部分bean都是我的应用程序中的一个spring bean,这就是为什么我对你提到的只是有点困惑:'将你的应用程序绑定到Spring框架'。在所有情况下还是在这种情况下,只有当我有一个部分与Spring框架分离的应用程序时,我才使用Spring来实现某些功能? – Javatar 2012-03-12 07:48:57

+0

这取决于你所说的Spring Bean。如果您拥有由外部的Spring管理的普通Java Bean,则您的应用程序不与Spring绑定,并且可能需要不到一天才能切换到不同的IOC Container。这是一个极端(这一点,你肯定不会找到),另一个极端就是你所描述的:通过服务定位器进行依赖注入,或者我称之为:控制反转的反转。只有在你真正需要的时候才会尝试做到这一点。 – 2012-03-12 09:06:14

+0

与我的问题相关的主要原因是将原型范围的bean注入到单例范围的bean中。这就是为什么我必须从每个方法调用的applicationContext(或BeanFactory)中获取bean。顺便说一下,我的根包下的每个类(它表示所有类)都受春季控制。所以最后一个问题,你能否详细解释一下你提到的问题:'它在语义上明确了它是什么。'?再次感谢您的提前。 – Javatar 2012-03-14 06:43:05

0

由于您是不扩展任何弹簧类,您的应用程序始终与框架分开。大多数情况下,您不需要注入ApplicationContext,但需要注入ApplicationContext中定义的bean。

最好的情况是始终坚持最低限度,直到除非你有任何具体的要求,这是非常简单的春天。

因此,要么,

  1. 标注您的豆类和scan他们application context,然后用@Autowire接线起来。

  2. 使用application context来连接你的bean expediencies(旧的xml样式配置)。您也可以使用@Autowire

当你想控制这个bean的生命周期,你可以阅读API和自定义,但大多数情况下,这些一般设置将做的工作。

以下是一些示例。

  1. Spring Auto-Wiring Beans with @Autowired annotation
  2. Spring Auto-Wiring Beans XML Style
  3. Spring IoC container API Docs
+0

感谢您的评论,但我在春季的常见案例和自动装配方面有足够的知识:)与我的问题相关的主要原因是能够将原型范围的bean注入到单例范围的bean中。在这种情况下,正常的bean注入无法按预期工作,所以我应该从每个方法调用的applicationContext(或更好的BeanFactory)中获取bean。 – Javatar 2012-03-14 06:38:05

+0

“既然你没有扩展任何Spring类,你的应用程序总是与框架分离”。这不是真的。只需注入ApplicationContext将应用程序绑定到Spring。如果Spring不存在,它将不会编译 – 2016-12-26 08:50:49

2

由于@Sean帕特里克·弗洛伊德说,ApplicationContext中的需求往往是由于糟糕的设计。但有时你没有别的选择。在这些情况下,我更喜欢使用@Autowired,因为这是我注入所有其他属性的方式。因此,如果我使用@Autowired注入MyRepository,为什么我不能将它用于ApplicationContext或任何其他Spring bean?

我只对那些我不能做注释的事情使用Spring接口,例如BeanNameAware。