gpt4 book ai didi

java - Spring根据当前范围注入(inject)不同的bean

转载 作者:行者123 更新时间:2023-12-02 07:53:42 24 4
gpt4 key购买 nike

我定义了两个同一类的 bean:

@Bean
@Scope("singleton")
public MyBean myBeanSingleton(){
return new MyBean()
}

@Bean
@Scope("request")
public MyBean myBeanRequest(){
return new MyBean()
}

还有另一个原型(prototype)作用域 bean:

@Component
@Scope("prototype")
public class MyPrototype {
@Autowired
private MyBean myBean
}

当没有可用的请求时,Spring应用程序上下文是否可以自动注入(inject)正确的bean?我希望在 Web 上下文中(例如在 Controller 中)获取 MyPrototype bean 时注入(inject) myBeanRequest,并且我想要 myBeanSingleton当没有网络上下文时(例如当我通过 Quartz 调度程序运行一些代码时)被注入(inject)。

目前 spring 每次都会尝试注入(inject) myBeanRequest,因此当没有可用请求时会失败。

我非常想坚持使用 MyPrototype 的一个 bean 定义,因为会有许多不同的 bean 需要类似的行为,因此使用限定符和两个不同的 bean 定义(用于请求和单例)不适合我的情况。

也许有一些 spring 组件可以让我以编程方式选择要注入(inject)哪个 bean?

最佳答案

Spring 具有高度的通用性,但目前,您有两个相同类的 bean,没有任何限定符,因此 Spring 无法区分它们。即使在手动使用 ApplicationContext.getBean() 的最低级别,您也只能传递一个类和一个名称。

我很抱歉地说,但我担心你在这里遇到了一个重大的架构设计问题。 Spring方式将尊重分层架构。这意味着 bean 应该仅位于任一 Web 层( Controller 、拦截器、过滤器)的一层中 - 并且在没有可用请求的情况下使用它是没有意义的,因为它的使用应该只是为了提供帮助在处理一个或在非 Web 层(例如服务或持久性)中,它应该在不知道 http 含义的情况下工作。规则是 web 可以调用非 web,但绝对不应该发生相反的情况。

所以我的建议是仔细地将你的 bean 分类到正确的层中,并将当前属于两侧的 bean 分成 2 个不同的 bean。这可能是一项艰巨的工作,但如果你继续进行奇怪的设计,随着时间的推移,情况可能会变得更糟......

我知道这不是您期望的答案,但这是我能给您的最好答案。

关于java - Spring根据当前范围注入(inject)不同的bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35848906/

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