2017-10-20 110 views
0

避免我所经历的春天文档,和整个以下说明─为什么getBean()方法应该在Spring应用程序

来到然后可以使用的getBean检索bean的实例。 ApplicationContext接口有几个其他方法可用于 检索bean,但理想情况下,您的应用程序代码不应使用 这些方法。 事实上,您的应用程序代码应该没有调用 getBean()方法的所有,因此不依赖于所有的Spring API。例如,Spring与Web框架的集成为各种Web框架组件(如 控制器和JSF管理的bean)提供了 依赖注入,允许您通过元数据声明对特定Bean的依赖关系(例如自动装配 注释)。

参考 - https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html

在我的申请,我收到了一些参数,我的客户的方法,在此基础上,我注入接口的正确实施。 我这样做的方式是在连接这些参数后搜索bean id。 例如,如果我收到type=C,subType=D,我通过调用getBean(beanId)获得与bean id=typeCsubTypeD的bean。 即,我的依赖关系决定于运行时间。

我已经通过Why is Spring's ApplicationContext.getBean considered bad?

走了,但,这并不能掩盖我的使用情况下(也通过在问题中留言讨论)。

+0

有趣的问题,你可以分享代码吗?参数的方式是什么? – Andrew

+0

我的项目在另一个应用程序中用作jar库。该应用程序调用这个jar的方法。现在基于它通过什么参数,我必须选择bean并产生结果。 – Deb

回答

1

一般来说,我的建议是避免月份风味的狂热分子。

如今,反转控制的是非常多的炒作(为的SOLID设计原则的一部分),因此,如果有人使用任何违背这一原则,人们会盲目地抨击它,并说,你应该避免使用它。然而,真正的答案是在软件设计方面没有普遍的规律。如果您在应用程序中没有使用控制反转的正当理由,那么在使用getBean()时肯定没问题。原理通常是意思是意思是“在静态初始化上下文中不要使用getBean()”,您可以改为使用控制反转。

例如,我们有一个使用Spring作为“bean脚本语言”的应用程序,允许非开发人员在不使用完整的DSL的情况下定义可配置的Java Bean。如果你在这方面使用Spring,那么你可以避免使用getBean()

+0

getBean()如何违背IoC?因为,我仍然使用Spring容器(而不是依赖类)创建bean,并在运行时获取bean。只是这一点,依赖关系在编译时没有解决。 – Deb

+1

由于您依赖的是ApplicationContext,除非上下文本身被注入,否则它不再是完全的IoC,因为您必须知道如何获取上下文本身。在关于服务定位器和IoC之间的区别的帖子中,有一个很好的讨论,您提到的用例比纯粹的IoC更像服务定位器。 –

相关问题