Spring配置类如何获取其方法所需的对象实例?
嘿,这个问题问到点子上了——刚接触Spring WebSocket的时候,确实会对这种“凭空出现”的参数感到困惑,我来给你理清楚背后的逻辑:
首先,核心在于@EnableWebSocketMessageBroker注解和AbstractWebSocketMessageBrokerConfigurer抽象类的配合:
@EnableWebSocketMessageBroker触发自动配置
当你在配置类上标注这个注解时,Spring会自动导入一系列内部配置类(比如WebSocketMessageBrokerConfigurationSupport),这些类负责初始化WebSocket消息代理的核心组件。configureMessageBroker是Spring的回调方法
你重写的configureMessageBroker并不是由你调用的,而是Spring在初始化消息代理的过程中,主动创建MessageBrokerRegistry实例,然后遍历所有实现了WebSocketMessageBrokerConfigurer的类(也就是你的WebSocketConfig),调用这个方法并把创建好的Registry实例传递进去。为什么不需要手动注册Bean?
MessageBrokerRegistry本质上是Spring内部用来收集消息代理配置的工具类,不是给业务逻辑使用的Bean。它的生命周期完全由Spring的配置流程管理,你只需要在回调方法里用它来设置代理规则(比如启用简单代理、设置前缀),不需要也不应该手动注册它的Bean。
这种模式在Spring里非常常见,比如你用WebMvcConfigurer配置Spring MVC时,重写的addInterceptors、configureViewResolvers等方法,参数(InterceptorRegistry、ViewResolverRegistry)也都是Spring自动创建并传递的,原理和这个完全一致。
简单来说:这个实例是Spring在处理WebSocket消息代理配置的流程中自动生成的,通过回调你的配置类方法让你自定义规则,你不用操心它的创建和注册~
内容的提问来源于stack exchange,提问作者JiKra

