Browse Source

Only add `httpServiceProxyRegistry` bean when necessary

Update `AbstractHttpServiceRegistrar` so that the
`httpServiceProxyRegistry` bean  is only added when registrations
are found.
pull/35329/head
Phillip Webb 7 months ago committed by rstoyanchev
parent
commit
169b7015d2
  1. 30
      spring-web/src/main/java/org/springframework/web/service/registry/AbstractHttpServiceRegistrar.java
  2. 7
      spring-web/src/main/java/org/springframework/web/service/registry/GroupsMetadata.java
  3. 25
      spring-web/src/test/java/org/springframework/web/service/registry/ClientHttpServiceRegistrarTests.java
  4. 3
      spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceRegistrarTests.java

30
spring-web/src/main/java/org/springframework/web/service/registry/AbstractHttpServiceRegistrar.java

@ -147,20 +147,22 @@ public abstract class AbstractHttpServiceRegistrar implements
registerHttpServices(new DefaultGroupRegistry(), metadata); registerHttpServices(new DefaultGroupRegistry(), metadata);
RootBeanDefinition proxyRegistryBeanDef = createOrGetRegistry(beanRegistry); if (this.groupsMetadata.hasRegistrations()) {
RootBeanDefinition proxyRegistryBeanDef = createOrGetRegistry(beanRegistry);
mergeGroups(proxyRegistryBeanDef);
mergeGroups(proxyRegistryBeanDef);
this.groupsMetadata.forEachRegistration((groupName, types) -> types.forEach(type -> {
RootBeanDefinition proxyBeanDef = new RootBeanDefinition(); this.groupsMetadata.forEachRegistration((groupName, types) -> types.forEach(type -> {
proxyBeanDef.setBeanClassName(type); RootBeanDefinition proxyBeanDef = new RootBeanDefinition();
proxyBeanDef.setAttribute(HTTP_SERVICE_GROUP_NAME_ATTRIBUTE, groupName); proxyBeanDef.setBeanClassName(type);
proxyBeanDef.setInstanceSupplier(() -> getProxyInstance(groupName, type)); proxyBeanDef.setAttribute(HTTP_SERVICE_GROUP_NAME_ATTRIBUTE, groupName);
String beanName = (groupName + "#" + type); proxyBeanDef.setInstanceSupplier(() -> getProxyInstance(groupName, type));
if (!beanRegistry.containsBeanDefinition(beanName)) { String beanName = (groupName + "#" + type);
beanRegistry.registerBeanDefinition(beanName, proxyBeanDef); if (!beanRegistry.containsBeanDefinition(beanName)) {
} beanRegistry.registerBeanDefinition(beanName, proxyBeanDef);
})); }
}));
}
} }
/** /**

7
spring-web/src/main/java/org/springframework/web/service/registry/GroupsMetadata.java

@ -97,6 +97,13 @@ final class GroupsMetadata {
return this.groupMap.values().stream(); return this.groupMap.values().stream();
} }
/**
* Return if there are any {@link Registration registrations}.
*/
boolean hasRegistrations() {
return !this.groupMap.isEmpty();
}
/** /**
* Registration metadata for an {@link HttpServiceGroup}. * Registration metadata for an {@link HttpServiceGroup}.

25
spring-web/src/test/java/org/springframework/web/service/registry/ClientHttpServiceRegistrarTests.java

@ -22,6 +22,9 @@ import java.util.Map;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.StandardEnvironment; import org.springframework.core.env.StandardEnvironment;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.AnnotationMetadata;
@ -63,6 +66,13 @@ public class ClientHttpServiceRegistrarTests {
TestGroup.ofListing("echo", EchoClientA.class, EchoClientB.class)); TestGroup.ofListing("echo", EchoClientA.class, EchoClientB.class));
} }
@Test
void registerWhenNoClientsDoesNotCreateBeans() {
try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(NothingFoundConfiguration.class)) {
assertThat(context.getBeanNamesForType(HttpServiceProxyRegistry.class)).isEmpty();
}
}
private void assertGroups(TestGroup... expectedGroups) { private void assertGroups(TestGroup... expectedGroups) {
Map<String, TestGroup> groupMap = this.groupRegistry.groupMap(); Map<String, TestGroup> groupMap = this.groupRegistry.groupMap();
assertThat(groupMap.size()).isEqualTo(expectedGroups.length); assertThat(groupMap.size()).isEqualTo(expectedGroups.length);
@ -75,4 +85,19 @@ public class ClientHttpServiceRegistrarTests {
} }
} }
@Configuration(proxyBeanMethods = false)
@Import(NothingFoundRegistrar.class)
static class NothingFoundConfiguration {
}
static class NothingFoundRegistrar extends AbstractClientHttpServiceRegistrar {
@Override
protected void registerHttpServices(GroupRegistry registry,
AnnotationMetadata importingClassMetadata) {
findAndRegisterHttpServiceClients(registry, List.of("com.example.missing.package"));
}
}
} }

3
spring-web/src/test/java/org/springframework/web/service/registry/HttpServiceRegistrarTests.java

@ -120,8 +120,7 @@ public class HttpServiceRegistrarTests {
@Test @Test
void noRegistrations() { void noRegistrations() {
doRegister(registry -> {}); doRegister(registry -> {});
assertRegistryBeanDef(); assertBeanDefinitionCount(0);
assertBeanDefinitionCount(1);
} }

Loading…
Cancel
Save