【问题标题】:Spring Boot - Web Application Context Bean ScopeSpring Boot - Web 应用程序上下文 Bean 范围
【发布时间】:2020-01-27 14:16:29
【问题描述】:

我有一个类 A 作为 bean。

public class A
{
   // constructors
   // properties
   // getters and setters
}

春季开机配置:

@Configuration
public class AConfig{
    @Bean
    @Scope(scopeName = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public A getA() {
        return new A();
    }   
}

我现在正在使用 WebSocket,我正在尝试为某些特定的 WebSocket 通道获取一个新的 A 类实例,假设我正在使用 WebSocket id:1,那么我将拥有 A 的实例(某个地址)对于那个 WebSocket,对于 WebSocket id:2 我将有另一个 A 实例(其他地址),我可以在应用程序中使用它。我怎样才能做到这一点?在这种情况下,我想我必须向服务器发送一些 ID 来识别我正在寻找的 spring bean。

【问题讨论】:

  • 您是否有理由不简单地使用 WebSocket 范围 (baeldung.com/spring-bean-scopes)?
  • @Smutje,我找不到任何关于如何与 Websocket 一起实现此功能的具体信息。有什么帮助吗?
  • 请确认我的理解:您希望其他类中的A类bean说WebSocketTest类,并且在WebSocketTest类的每个实例中都有一个具有不同不同状态(不同地址)的A类单独bean。
  • 你是什么意思“如何与Websocket一起实现”?您检查过链接并尝试过吗?
  • @Jitendra,是的!例如,范围scopeName = WebApplicationContext.SCOPE_APPLICATION 在不同的实例中工作正常,但它在整个应用程序中创建了一个 bean。现在我想当我收到一个新的 WebSocket 连接时构建一个新的类的 bean,比如说A,我可以从不同的客户端访问它。

标签: java spring spring-boot websocket javabeans


【解决方案1】:

**我们应该使用构造函数参数而不是 Autowired 来使其松散耦合**

class MessageSocketDemo {

private A a;

public MessageSocketDemo(A a) {
    this.a = a;
}

public MessageSocketDemo() {
    a = new A("address");
}

}

class A {
String address;

public A(String add) {
    address = add;
}

}

因此,当您创建 MessageSocketDemo 的对象时,您每次都会创建 A 的对象。 或者将 A 的范围作为原型或请求,每次被询问时都会创建新的,以及创建 A 实例的查找方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    相关资源
    最近更新 更多