由于范围似乎都不singleton
适合prototype
您(您不想要一个对象,但您不希望每次都有一个新实例),因此您需要另一个范围。
在 web 应用程序上下文中,有一个现成的解决方案 - 使用request
范围 - 因此在每个请求/响应周期中,无论您在何处注入它以及注入它多少次,您都将只有一个 bean 实例。
在非 Web 应用程序上下文中,您可以定义自己的实现org.springframework.beans.factory.config.Scope
更新:在你澄清之后,这似乎是一个非常奇怪的案例。我想到的是以下内容:
- 定义两个
FactoryBean
(实际上是 的子类AbstractFactoryBean
)——一个每次都返回新对象,一个返回相同的对象(它们都应该在singleton
范围内)
- 用and注入
Foo
s (而不是)@Resource(name="prototypeFactoryBean")
@Resource(name="singletonFactoryBean")
@Autowired
singletonFactoryBean
可以设计为只返回一个单例(在工厂 bean 类中注入)
prototypeFactoryBean
可以创建一个新实例,将(BeanFactory
可通过getBeanFactory()
)转换为AutowireCapableBeanFactory
并调用.autowire(newlyCreatedBean)
,然后返回它。(或者你可以注入一个ApplicationContext
并得到它AutowireCapableBeanFactory
)
但这过于复杂,即使经过我的解释,您也需要扩展弹簧知识 :)
此外,我认为您应该重新考虑您的设计,而不是制造上述“怪癖”
更新 2:在您发表评论之后,命名概念被转移到注释 - 正如我在上面指出的那样,您可以使用@Resource(name="someBean")