首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@autowired字段和@autowired构造函数

@autowired字段和@autowired构造函数
EN

Stack Overflow用户
提问于 2013-07-23 13:51:23
回答 1查看 1.4K关注 0票数 0

我有一个spring应用程序。我有一个bean,它连接为一个单例,也是一个字段,它也是自动设置的,但具有请求范围。例如:

代码语言:javascript
复制
class Hello {

  @Autowired
  BDepend b; // this is defined as a request scope bean

  @Autowired
  public Hello(ADepend a){
  }
}

在这里,我的类Hello是一个单例,但是BDepend是一个请求作用域对象。spring对每个请求如何处理正确的实例,因为Hello是一个单例。

EN

回答 1

Stack Overflow用户

发布于 2013-07-23 15:55:42

默认情况下,应用程序安装时将出现运行时异常。就像这样:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'b': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton;

要在一些单例中使用请求作用域对象,您需要每次从应用程序上下文中获取一个新的实例。你可以这样做:

  • 直接使用应用程序上下文 类哈罗{ @Autowired私有ApplicationContext ctx;@Autowired Hello(ADepend A)}{ BDepend useB(){ BDepend实例= ctx.getBean(BDepend.class);instance.doSomething();}}
  • 或者通过javax.inject.Provider获得一个新实例。 类Hello { @Autowired私有提供者提供程序;@Autowired Hello(ADepend A)}{ BDepend useB(){ BDepend实例= this.provider.get();instance.doSomething();}
  • 或声明此bean的作用域代理: @Component @Scope(value = "request",proxyMode = ScopedProxyMode.TARGET_CLASS)类BDepend {} class BDepend {} class Hello { @Autowired BDepend b;@Autowired Hello(ADepend a){ public useB(){ b.doSomething();}}
  • 或者使用范围广泛的代理系统。 <上下文:组件扫描基包=“com.mycompany.beans”作用域-代理=“targetClass”/>

就我个人而言,我更喜欢第二个选项(javax.inject.Provider):从代码中可以清楚地看到,您的bean具有不同的范围。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17812192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档