当前位置: 首页 > 知识库问答 >
问题:

Spring根据当前范围注入不同的bean

郁烨
2023-03-14

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

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

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

和另一个原型作用域bean:

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

Spring应用程序上下文是否可能在没有可用请求时自动注入正确的bean?我希望MyBeanRequest在web上下文(例如在controller中)中获取MyPrototypebean时被注入,并希望MyBeansingleton在没有web上下文时被注入(例如,当我通过Quartz调度器运行一些代码时)。

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

也许有一些spring组件允许我以编程方式选择要注入哪个bean?

共有1个答案

邓鸿信
2023-03-14

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

我很抱歉这么说,但恐怕你在这里有一个重大的建筑设计问题。Spring的方式是尊重分层架构。这意味着bean应该只存在于一个层中,或者是web层(控制器、拦截器、过滤器),并且在没有可用请求的情况下使用它是没有意义的,因为它的使用应该只是帮助处理一个请求,或者在非web层中(例如服务或持久化),并且它应该在不知道http意味着什么的情况下工作。规则是web可以调用nonweb,但绝对不应该发生相反的情况。

所以我的建议是小心地将你的bean分类在正确的层中,并将当前属于两边的bean分成两个不同的bean。这可能是一个很大的工作,但如果你继续一个奇怪的设计,它可能会变得更糟,随着时间的推移······

 类似资料:
  • 我在一个表(即TAB1)中有多个日期范围,如下所示。 对上面的SQL查询有什么建议吗?

  • 如果我尝试用web感知范围(即会话范围、请求范围)注入bean,那么注入器会忽略该bean。未调用bean方法和对象构造函数。这只发生在我声明的类上,因为我可以为标准库类型(如List或Map)注入会话范围的bean。此外,如果我使用单例或原型作用域,则注入工作正常。 有人能解释这种奇怪的行为吗?我创建了一个准系统样本来演示这个问题。(我也尝试搜索,但找不到遇到此问题的任何人。 我想注入的类 配置

  • 我正在使用不同作用域的bean开发一个Spring应用程序。许多bean是单例的,有其他请求或自定义的作用域。特别是,使用这些自定义作用域有时很难找出哪个作用域可以安全地注入到其他作用域中,或者何时需要使用。 我知道我可以为所有基本上不是单例的bean创建范围代理,但在许多情况下,这似乎是不必要的。例如,一个bean可能只应该被注入到相同范围的其他bean,但并不是每个在项目中工作的人都知道这一点

  • 我正在使用 Spring 3.1.1,在我的业务逻辑中,我有一个循环,每次迭代都需要一个新的 Spring bean(原型范围)实例。 最好的方法是什么?我是否必须创建自己的 BeanFactory 类,我可以将其注入一次到我的类中,并且每次都调用它来生成 bean?在查看 Spring 3 文档时,它似乎暗示我应该改用 ApplicationContext。但是,使用ApplicationCon

  • 问题内容: 我有两个第三方类,它们都采用接口的实现。我需要为每个注入不同的实现。 如果执行,如何实现它,以便它在运行时提供所需的实现?提供者不知道谁在请求注射。 从理论上讲,我可以使用,但不能修改正在注入的代码。我想做类似的事情: 显然,“ for”代码不存在,但是有某种等效的方法吗? 问题答案: 您可以使用专用模块来实现此目的,该模块允许您安装(相互不可访问)冲突的绑定,以用于构造有限的一组非冲

  • 我得到的错误是: 我检查的内容: > 已启用批注处理,否则AnyService根本不会实例化 AnyBean不是最终的 请求作用域在AnyBean中与AspectJ代理(ScopedProxyMode.target_class)一起定义 存在EnableAspectJAutoproxy批注 类路径上有以下JAR: Web XML还包含RequestContextListener: 当我向org.s