就像在上面的标题中一样,我对通过直接@Autowired annnotation注入applicationContext或在Singleton Spring bean中实现ApplicationContextAware接口之间的优缺点感到困惑。在Spring3中注入applicationContext的最佳实践
哪一个你喜欢哪种情况?为什么?谢谢。
就像在上面的标题中一样,我对通过直接@Autowired annnotation注入applicationContext或在Singleton Spring bean中实现ApplicationContextAware接口之间的优缺点感到困惑。在Spring3中注入applicationContext的最佳实践
哪一个你喜欢哪种情况?为什么?谢谢。
其实两者都不好。它们都将你的应用程序绑定到Spring框架,从而颠倒了整个反转控制概念。在理想的世界中,您的应用程序不应该意识到由ApplicationContext管理。
一旦你选择违反这个原则,你怎么做并不重要。 ApplicationContextAware
是已经在at least since Version 2.0附近的传统版本。 @Autowired
是一种较新的机制,但它们的工作方式几乎相同。我可能会去ApplicationContextAware
,因为它在语义上明确了它是什么。
由于您是不扩展任何弹簧类,您的应用程序始终与框架分开。大多数情况下,您不需要注入ApplicationContext
,但需要注入ApplicationContext
中定义的bean。
最好的情况是始终坚持最低限度,直到除非你有任何具体的要求,这是非常简单的春天。
因此,要么,
标注您的豆类和scan
他们application context
,然后用@Autowire
接线起来。
使用application context
来连接你的bean expediencies(旧的xml样式配置)。您也可以使用@Autowire
。
当你想控制这个bean的生命周期,你可以阅读API和自定义,但大多数情况下,这些一般设置将做的工作。
以下是一些示例。
感谢您的评论,但我在春季的常见案例和自动装配方面有足够的知识:)与我的问题相关的主要原因是能够将原型范围的bean注入到单例范围的bean中。在这种情况下,正常的bean注入无法按预期工作,所以我应该从每个方法调用的applicationContext(或更好的BeanFactory)中获取bean。 – Javatar 2012-03-14 06:38:05
“既然你没有扩展任何Spring类,你的应用程序总是与框架分离”。这不是真的。只需注入ApplicationContext将应用程序绑定到Spring。如果Spring不存在,它将不会编译 – 2016-12-26 08:50:49
由于@Sean帕特里克·弗洛伊德说,ApplicationContext中的需求往往是由于糟糕的设计。但有时你没有别的选择。在这些情况下,我更喜欢使用@Autowired,因为这是我注入所有其他属性的方式。因此,如果我使用@Autowired注入MyRepository,为什么我不能将它用于ApplicationContext或任何其他Spring bean?
我只对那些我不能做注释的事情使用Spring接口,例如BeanNameAware。
如果你需要在单例中得到一个原型,那么你可以使用方法注入。基本上,你创建一个抽象方法返回你需要的对象,并且每当你调用该方法时,spring将返回原型。你在你的spring配置中定义了“lookup-method”。这里有一些链接: http://docs.spring.io/spring/docs/1.2.9/reference/beans.html#beans-factory-method-injection http://java.dzone.com/articles/method-injection-spring
谢谢。但是,如果将applicationContext注入到bean中的bean已经是spring bean了呢?你认为这还是违规吗?顺便说一句,实际上我的大部分bean都是我的应用程序中的一个spring bean,这就是为什么我对你提到的只是有点困惑:'将你的应用程序绑定到Spring框架'。在所有情况下还是在这种情况下,只有当我有一个部分与Spring框架分离的应用程序时,我才使用Spring来实现某些功能? – Javatar 2012-03-12 07:48:57
这取决于你所说的Spring Bean。如果您拥有由外部的Spring管理的普通Java Bean,则您的应用程序不与Spring绑定,并且可能需要不到一天才能切换到不同的IOC Container。这是一个极端(这一点,你肯定不会找到),另一个极端就是你所描述的:通过服务定位器进行依赖注入,或者我称之为:控制反转的反转。只有在你真正需要的时候才会尝试做到这一点。 – 2012-03-12 09:06:14
与我的问题相关的主要原因是将原型范围的bean注入到单例范围的bean中。这就是为什么我必须从每个方法调用的applicationContext(或BeanFactory)中获取bean。顺便说一下,我的根包下的每个类(它表示所有类)都受春季控制。所以最后一个问题,你能否详细解释一下你提到的问题:'它在语义上明确了它是什么。'?再次感谢您的提前。 – Javatar 2012-03-14 06:43:05