Spring bean部分自动装配原型构造函数
Spring bean部分自动装配原型构造函数
我有一个类:
@Slf4j
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class WebSocketRegistrar extends AbstractWebSocketHandler{
private final ApplicationContext context;
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 这里有个问题。
context.getBean(WebSocketConsumer.class, session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
}
}
它尝试创建一个原型bean,其中一个参数是运行时参数,而其余参数我希望被注入。我需要它获取EventBus和一个函数。这两者都在上下文中可用,我可以解决这个问题。我正在努力理解如何在原型上进行部分构造函数自动装配。
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@NoArgsConstructor
public class WebSocketConsumer implements Consumer
private WebSocketSession session;
private Function
@Autowired
public WebSocketConsumer(WebSocketSession session, EventBus bus, BiFunction
this.session = session;
this.jsonApi = identifiable -> toJsonApi.apply(identifiable,session.getHandshakeHeaders().get("Host").get(0));
bus.on(R(session.getUri().getPath() + "/?.*"),this::accept);
}
@Override
public void accept(Identifiable> update) {
}
}
问题的原因:
根据回答中的内容,问题可能是在Spring中使用部分自动装配构造函数时遇到的。部分自动装配是指在创建bean时,Spring只自动装配一部分构造函数参数,而不是全部。这可能导致构造函数参数不完整,无法正确创建bean的实例。
解决方法:
为了解决这个问题,可以使用配置类来创建bean。在配置类中,可以手动创建bean的实例,并指定构造函数的参数。这样,就可以更好地控制构造函数参数,并根据需要在运行时更改参数的值。
以下是解决方法的示例代码:
public class TestConfiguration { @Bean("prototype") public SomePrototypeBean createBean(SingletonBean singletonBean){ return new SomePrototypeBean(singletonBean, "TODO whatever you want here" ); } }
在这个示例代码中,`TestConfiguration` 是一个配置类,使用`@Bean` 注解创建一个名为 `prototype` 的bean。这个bean的构造函数有两个参数,一个是 `SingletonBean` 类型的参数 `singletonBean`,另一个是一个字符串参数,值为 "TODO whatever you want here"。你可以根据需要修改这些参数的值。
同时,还建议避免使用 `context.getBean` 方法,因为它可能会导致代码逻辑混乱。只有在框架的限制下,才使用 `context.getBean` 方法。
此外,还可以参考stackoverflow上的一篇文章,了解关于在Spring的Java配置中自动装配bean的更多细节。
最后,需要注意的是,如果有其他解决方案可用,应尽量避免使用部分自动装配构造函数。只有在框架的限制下,才考虑使用这种方式。