Polish "Apply RSocketConnectorConfigurer beans to RSocketRequester.Builder"

See gh-26341
This commit is contained in:
Stephane Nicoll 2021-05-31 14:44:15 +02:00
parent 850c653862
commit 6b4efcce11
3 changed files with 10 additions and 12 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -29,6 +29,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import org.springframework.messaging.rsocket.RSocketConnectorConfigurer; import org.springframework.messaging.rsocket.RSocketConnectorConfigurer;
import org.springframework.messaging.rsocket.RSocketRequester; import org.springframework.messaging.rsocket.RSocketRequester;
import org.springframework.messaging.rsocket.RSocketRequester.Builder;
import org.springframework.messaging.rsocket.RSocketStrategies; import org.springframework.messaging.rsocket.RSocketStrategies;
/** /**
@ -39,7 +40,6 @@ import org.springframework.messaging.rsocket.RSocketStrategies;
* requester instances with different configurations. * requester instances with different configurations.
* *
* @author Brian Clozel * @author Brian Clozel
* @author Nguyen Bao Sach
* @since 2.2.0 * @since 2.2.0
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ -52,9 +52,9 @@ public class RSocketRequesterAutoConfiguration {
@ConditionalOnMissingBean @ConditionalOnMissingBean
public RSocketRequester.Builder rSocketRequesterBuilder(RSocketStrategies strategies, public RSocketRequester.Builder rSocketRequesterBuilder(RSocketStrategies strategies,
ObjectProvider<RSocketConnectorConfigurer> connectorConfigurers) { ObjectProvider<RSocketConnectorConfigurer> connectorConfigurers) {
return connectorConfigurers.orderedStream() Builder builder = RSocketRequester.builder().rsocketStrategies(strategies);
.collect(RSocketRequester::builder, RSocketRequester.Builder::rsocketConnector, (first, second) -> { connectorConfigurers.orderedStream().forEach(builder::rsocketConnector);
}).rsocketStrategies(strategies); return builder;
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2019 the original author or authors. * Copyright 2012-2021 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -64,14 +64,12 @@ class RSocketRequesterAutoConfigurationTests {
} }
@Test @Test
void rSocketConnectorConfigurersArePickedUp() { void shouldCreateBuilderWithAvailableRSocketConnectorConfigurers() {
RSocketConnectorConfigurer first = mock(RSocketConnectorConfigurer.class); RSocketConnectorConfigurer first = mock(RSocketConnectorConfigurer.class);
RSocketConnectorConfigurer second = mock(RSocketConnectorConfigurer.class); RSocketConnectorConfigurer second = mock(RSocketConnectorConfigurer.class);
this.contextRunner.withBean("firstRSocketConnectorConfigurer", RSocketConnectorConfigurer.class, () -> first) this.contextRunner.withBean("first", RSocketConnectorConfigurer.class, () -> first)
.withBean("secondRSocketConnectorConfigurer", RSocketConnectorConfigurer.class, () -> second) .withBean("second", RSocketConnectorConfigurer.class, () -> second).run((context) -> {
.run((context) -> {
assertThat(context).getBeans(RSocketConnectorConfigurer.class).hasSize(2); assertThat(context).getBeans(RSocketConnectorConfigurer.class).hasSize(2);
RSocketRequester.Builder builder = context.getBean(RSocketRequester.Builder.class); RSocketRequester.Builder builder = context.getBean(RSocketRequester.Builder.class);
assertThat(builder).extracting("rsocketConnectorConfigurers", as(InstanceOfAssertFactories.LIST)) assertThat(builder).extracting("rsocketConnectorConfigurers", as(InstanceOfAssertFactories.LIST))
.containsExactly(first, second); .containsExactly(first, second);

View File

@ -73,7 +73,7 @@ Once the `RSocket` channel is established between server and client, any party c
As a server, you can get injected with an `RSocketRequester` instance on any handler method of an RSocket `@Controller`. As a server, you can get injected with an `RSocketRequester` instance on any handler method of an RSocket `@Controller`.
As a client, you need to configure and establish an RSocket connection first. As a client, you need to configure and establish an RSocket connection first.
Spring Boot auto-configures an `RSocketRequester.Builder` for such cases with the expected codecs. Spring Boot auto-configures an `RSocketRequester.Builder` for such cases with the expected codecs and apply any `RSocketConnectorConfigurer` bean.
The `RSocketRequester.Builder` instance is a prototype bean, meaning each injection point will provide you with a new instance . The `RSocketRequester.Builder` instance is a prototype bean, meaning each injection point will provide you with a new instance .
This is done on purpose since this builder is stateful and you shouldn't create requesters with different setups using the same instance. This is done on purpose since this builder is stateful and you shouldn't create requesters with different setups using the same instance.