gpt4 book ai didi

spring - 是否可以在两个地方 Autowiring 原型(prototype)范围类的相同实例

转载 作者:行者123 更新时间:2023-12-03 15:56:22 26 4
gpt4 key购买 nike

** 更改示例以更好地表达情况

我正在使用spring 2.5并且有以下情况

@Component
@Scope("prototype")
Class Foo
{
}

class A
{
@Autowired
Foo fooA;
}


class B
{
@Autowired
Foo fooB;
}



class C
{
@Autowired
Foo fooC;
}

我想了解是否有某种方法可以使用 @Autowired并绑定(bind) FOO 的同一个实例到 fooAfooB同时将不同的实例绑定(bind)到 fooC
我理解如果 FOO 的范围将是 singleton它会起作用的

但是如果有一种方法可以在使用 protoype 时实现相同的目标,我正在徘徊范围。

还请解释这是 Autowiring 概念的正确用法吗?我是否试图滥用 Spring 框架的目的

最佳答案

由于 singleton也不是 prototype范围似乎适合您(您不想要一个对象,但您不希望每次都有一个新实例),您需要另一个范围。

在 Web 应用程序上下文中,有一个现成的解决方案 - 使用 request范围 - 因此在每个请求/响应周期中,您将只有一个 bean 实例,无论您在何处注入(inject)它以及注入(inject)它多少次。

在非 Web 应用程序上下文中,您可以定义自己的 org.springframework.beans.factory.config.Scope 实现。

更新:在你澄清之后,这似乎是一个非常奇怪的案例。我想到的是以下内容:

  • 定义两个 FactoryBean s(实际上是 AbstractFactoryBean 的子类)- 每次返回一个新对象,一个返回同一个对象(它们都应该在 singleton 范围内)
  • 注入(inject)Foo@Resource(name="prototypeFactoryBean")@Resource(name="singletonFactoryBean") (而不是 @Autowired )
  • singletonFactoryBean可以设计成只返回一个单例(在工厂 bean 类中注入(inject))
  • prototypeFactoryBean可以创建一个新实例,强制转换 BeanFactory (可通过 getBeanFactory() 获得)到 AutowireCapableBeanFactory并调用.autowire(newlyCreatedBean) ,然后返回。 (或者,您可以注入(inject) ApplicationContext 并获取它的 AutowireCapableBeanFactory )

  • 但这过于复杂,即使经过我的解释,您也需要扩展 Spring 知识 :)

    此外,我认为您应该重新考虑您的设计,而不是制造上述“怪癖”

    更新 2:在您发表评论后,命名概念将转移到注释 - 正如我在上面指出的,您可以使用 @Resource(name="someBean")

    关于spring - 是否可以在两个地方 Autowiring 原型(prototype)范围类的相同实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192169/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com