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

标签 java spring spring-mvc dependency-injection

我定义了两个同一类的 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/

相关文章:

java - 已达到数据存储小型操作配额

java - 是否有旨在调试并发软件的 JVM?

java - 对每个实体子类型使用不同的投影

java - REST API : org. springframework.beans.factory.UnsatisfiedDependencyException:

java - 如何在 Spring Security MVC 中编写简单的过滤器?

Java spring 框架 - 如何设置内容类型?

java - JVM 为 40 行代码消耗了我所有的 RAM

java - 从 GridView 项目中获取值

java - Spring Boot不加载application.properties

java - Spring Boot MongoRepository 忽略验证