Java ApplicationContextAware与Setter注入

Java ApplicationContextAware与Setter注入,java,spring,jakarta-ee,Java,Spring,Jakarta Ee,ApplicationContextAware相对于Setter注入的优势是什么。通过Setter注入,我们还可以从Spring容器中获取bean 使用ApplicationContextAware,您可以获得对当前上下文的引用,以便可以对其进行编辑,例如添加或删除bean。通常这是一个坏主意,除了在一些测试场景中 Spring还强调,使用ApplicationContextAware比使用带有setter的简单POJO更依赖Spring框架。除非您确实需要,否则不应使用ApplicationC

ApplicationContextAware相对于Setter注入的优势是什么。通过Setter注入,我们还可以从Spring容器中获取bean

使用ApplicationContextAware,您可以获得对当前上下文的引用,以便可以对其进行编辑,例如添加或删除bean。通常这是一个坏主意,除了在一些测试场景中

Spring还强调,使用ApplicationContextAware比使用带有setter的简单POJO更依赖Spring框架。

除非您确实需要,否则不应使用ApplicationContextAware。如果您可以通过setter/field/constructor注入来支持所有业务需求,请不要使用ApplicationContextAware


有些人可能会尝试使用ApplicationContextAware来获取原型范围bean的新实例,实际上BeanFactoryAware已经足够了。但有更好的工具,即查找方法。

这是两种不同的模式。当您使用ApplicationContextAware时,您实现了服务定位器模式,但setter注入指的是依赖项注入模式。在开发低耦合应用程序时,后者更可取


描述了这两种模式之间的差异,或者说在大多数场景中,setter注入已经足够全面,这提供了一个更好的解决方案,帮助您维护实例之间的关系。因为类不直接依赖于容器,也就是说,它们是POJO,不需要知道容器的存在,这将为单元测试和将来的集成带来很多方便


如果您真的需要从容器中获取一些东西,例如对某些类型的bean进行一些增强,那么是时候使用ApplicationContextAware了。通常,不建议通过实现ApplicationContextAware在类中手动获取依赖项,尤其是对于业务对象。他们不应对自己的组装负责

如果我们班上需要很多实用程序bean,如果你需要很多实用的bean,你应该考虑一下你的bean是否有正确的角色,如果它做了太多的事情/有太多的责任,或者你的实用程序bean被分割成好的逻辑组,那么这个类看起来会很复杂。这样,您应该能够减少不必要的依赖关系。我可以想出在任何生产bean中使用ApplicationContextAware的任何理由。