【问题标题】:Spring boot defining configuration beans per userSpring Boot 为每个用户定义配置 bean
【发布时间】:2018-09-03 08:14:02
【问题描述】:

我正在使用 Spring 启动。我对 Spring Boot Bean 有一些疑问。

但我有疑问

我使用的是默认范围的 bean,它是单例的。所以每个应用程序只有一个实例。

@Configuration
public class ...{

     @Bean
     public void method() {}
}

现在我使用范围是原型的bean。所以他们将拥有每个请求的每个实例。

@Configuration
public class ...{

     @Bean 
     @Scope("prototype")
     public void method() {}
}

但是

我想要每个用户一个实例..?所有请求都使用每个用户的单个实例。

【问题讨论】:

  • 原型范围不是每个请求!。为每个用户定义实例?如果您需要实现自己的范围,那么会话范围是否足够。
  • @M.Deinum 但是当使用原型作用域时,它们就像每个请求一样工作。
  • 不,他们没有。每个方法调用都会导致 bean 的一个新实例(因此,如果您在 bean 上调用 2 个方法,您将获得 2 个实例而不是 1 个)。至少在正确用作范围代理时!。
  • @KailasBiradar 原型!=请求范围。 Prototype 会在每次请求时为您提供新的 bean - 这可能会在单个请求中发生多次。
  • @Antoniossss 好的

标签: spring spring-boot


【解决方案1】:
@Configuration
class Abc {
 @Bean
 @Scope("session")
 public YourBean getYourBean() {
 return new YourBean();
}
}

【讨论】:

  • 检查这个链接它对会话范围有更好的解释stackoverflow.com/questions/39488124/…
  • 您遇到的错误是什么,请尽可能发布错误日志
  • 错误:org.springframework.beans.factory.UnsatisfiedDependencyException:创建文件 [C:\kailas\workspace\LAPM010918\lapm\target\classes\com\avs 中定义的名称为“attendantServiceImpl”的 bean 时出错\lapm\service\impl\AttendantServiceImpl.class]:通过构造函数参数5表示的不满足依赖关系;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“consumer”的 bean 时出错:范围“会话”对于当前线程无效;如果您打算从单例中引用它,请考虑为该 bean 定义一个作用域代理;
  • 如何使用会话范围和实现..?
  • 我刚刚在我的 git repo 中添加了一个基本的 Session Scoped 项目,如果它有帮助请看一下github.com/sonuy221991/SessionScope
【解决方案2】:

您需要使用原型 bean 定义一个具有属性的单例 bean:(xml 示例)

使用@bean 定义:

@Component
@Scope("singleton")
public class SingletonBean {

   // ..

     @Autowired
     private PrototypeBean prototypeBean;
   //..

}



@Component
@Scope("prototype")
public class PrototypeBean {
 //.......
}

示例:https://www.baeldung.com/spring-inject-prototype-bean-into-singleton

【讨论】:

  • 我可以对类以及该类的方法使用范围注释
  • 你可以使用'@Component'、'@Controller'、'@Service'委托给Spring来创建你的实例。如果您不声明任何内容,请记住此 bean 将被创建为单例。如果不是,你可以定义它: '@Component' @Scope("prototype") 范围原型意味着每次你向 spring(getBean 或依赖注入)请求一个实例时,它都会创建一个新实例并给出一个引用。
  • @KailasBiradar 我刚刚用 bean 范围定义更新了响应
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 2016-09-10
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2017-04-24
  • 2017-11-14
  • 2019-01-27
相关资源
最近更新 更多