Browse Source

Fix problems with auto-configuration architecture checks

Closes gh-48216
pull/48239/head
Andy Wilkinson 4 weeks ago
parent
commit
4b8db9b630
  1. 11
      buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java
  2. 6
      buildSrc/src/main/java/org/springframework/boot/build/architecture/AutoConfigurationChecker.java
  3. 4
      documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/developingautoconfiguration/conditionannotations/classconditions/MyAutoConfiguration.java

11
buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureRules.java

@ -421,6 +421,8 @@ final class ArchitectureRules {
return ArchRuleDefinition.members() return ArchRuleDefinition.members()
.that() .that()
.areDeclaredInClassesThat(areRegularAutoConfiguration()) .areDeclaredInClassesThat(areRegularAutoConfiguration())
.and()
.areDeclaredInClassesThat(areNotKotlinClasses())
.and(areNotDefaultConstructors()) .and(areNotDefaultConstructors())
.and(areNotConstants()) .and(areNotConstants())
.and(dontOverridePublicMethods()) .and(dontOverridePublicMethods())
@ -440,13 +442,18 @@ final class ArchitectureRules {
} }
static DescribedPredicate<JavaClass> areRegularAutoConfiguration() { static DescribedPredicate<JavaClass> areRegularAutoConfiguration() {
return DescribedPredicate.describe("Regular @AutoConfiguration", return DescribedPredicate.describe("are regular @AutoConfiguration",
(javaClass) -> javaClass.isAnnotatedWith(AUTOCONFIGURATION_ANNOTATION) (javaClass) -> javaClass.isAnnotatedWith(AUTOCONFIGURATION_ANNOTATION)
&& !javaClass.getName().contains("TestAutoConfiguration") && !javaClass.isAnnotation()); && !javaClass.getName().contains("TestAutoConfiguration") && !javaClass.isAnnotation());
} }
static DescribedPredicate<JavaClass> areNotKotlinClasses() {
return DescribedPredicate.describe("are not Kotlin classes",
(javaClass) -> !javaClass.isAnnotatedWith("kotlin.Metadata"));
}
static DescribedPredicate<JavaClass> areTestAutoConfiguration() { static DescribedPredicate<JavaClass> areTestAutoConfiguration() {
return DescribedPredicate.describe("Test @AutoConfiguration", return DescribedPredicate.describe("are test @AutoConfiguration",
(javaClass) -> javaClass.isAnnotatedWith(AUTOCONFIGURATION_ANNOTATION) (javaClass) -> javaClass.isAnnotatedWith(AUTOCONFIGURATION_ANNOTATION)
&& javaClass.getName().contains("TestAutoConfiguration") && !javaClass.isAnnotation()); && javaClass.getName().contains("TestAutoConfiguration") && !javaClass.isAnnotation());
} }

6
buildSrc/src/main/java/org/springframework/boot/build/architecture/AutoConfigurationChecker.java

@ -31,12 +31,16 @@ import org.springframework.util.ReflectionUtils;
/** /**
* Finds all configurations from auto-configurations (either nested configurations or * Finds all configurations from auto-configurations (either nested configurations or
* imported ones) and checks that these classes don't contain public members. * imported ones) and checks that these classes don't contain public members.
* <p>
* Kotlin classes are ignored as Kotlin does not have package-private visibility and
* {@code internal} isn't a good substitute.
* *
* @author Moritz Halbritter * @author Moritz Halbritter
*/ */
class AutoConfigurationChecker { class AutoConfigurationChecker {
private final DescribedPredicate<JavaClass> isAutoConfiguration = ArchitectureRules.areRegularAutoConfiguration(); private final DescribedPredicate<JavaClass> isAutoConfiguration = ArchitectureRules.areRegularAutoConfiguration()
.and(ArchitectureRules.areNotKotlinClasses());
EvaluationResult check(JavaClasses javaClasses) { EvaluationResult check(JavaClasses javaClasses) {
AutoConfigurations autoConfigurations = new AutoConfigurations(); AutoConfigurations autoConfigurations = new AutoConfigurations();

4
documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/developingautoconfiguration/conditionannotations/classconditions/MyAutoConfiguration.java

@ -30,11 +30,11 @@ public final class MyAutoConfiguration {
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(SomeService.class) @ConditionalOnClass(SomeService.class)
public static class SomeServiceConfiguration { static class SomeServiceConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public SomeService someService() { SomeService someService() {
return new SomeService(); return new SomeService();
} }

Loading…
Cancel
Save