From 27c062d7e58f27645226465e5e7617573989252e Mon Sep 17 00:00:00 2001 From: Ralf Ueberfuhr Date: Fri, 18 Jul 2025 08:50:23 +0200 Subject: [PATCH] BAEL-9294: Add sample for BeanRegistrar with Spring 7 --- spring-boot-modules/pom.xml | 7 +- spring-boot-modules/spring-boot-4/pom.xml | 171 ++++++++++++++++++ .../BeanRegistrationsConfiguration.java | 26 +++ ...BeanRegistrationsSpring6Configuration.java | 37 ++++ .../spring/beanregistrar/MyService.java | 5 + .../beanregistrar/SampleApplication.java | 13 ++ .../BeanRegistrarIntegrationTest.java | 20 ++ ...anRegistrationsSpring6IntegrationTest.java | 20 ++ 8 files changed, 296 insertions(+), 3 deletions(-) create mode 100644 spring-boot-modules/spring-boot-4/pom.xml create mode 100644 spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/BeanRegistrationsConfiguration.java create mode 100644 spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/BeanRegistrationsSpring6Configuration.java create mode 100644 spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/MyService.java create mode 100644 spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/SampleApplication.java create mode 100644 spring-boot-modules/spring-boot-4/src/test/java/com/baeldung/spring/beanregistrar/BeanRegistrarIntegrationTest.java create mode 100644 spring-boot-modules/spring-boot-4/src/test/java/com/baeldung/spring/beanregistrar/BeanRegistrationsSpring6IntegrationTest.java diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index 838b856b8814..9344a257bc17 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.spring-boot-modules spring-boot-modules @@ -107,9 +107,11 @@ spring-boot-3-observation spring-boot-3-test-pitfalls spring-boot-3-testcontainers + spring-boot-3-url-matching spring-boot-3-2 spring-boot-3-4 + spring-boot-4 spring-boot-resilience4j spring-boot-properties spring-boot-properties-2 @@ -122,7 +124,6 @@ spring-boot-springdoc-2 spring-boot-ssl spring-boot-documentation - spring-boot-3-url-matching spring-boot-graalvm-docker spring-boot-validations spring-boot-openapi diff --git a/spring-boot-modules/spring-boot-4/pom.xml b/spring-boot-modules/spring-boot-4/pom.xml new file mode 100644 index 000000000000..1463a385000f --- /dev/null +++ b/spring-boot-modules/spring-boot-4/pom.xml @@ -0,0 +1,171 @@ + + + 4.0.0 + spring-boot-4 + 0.0.1-SNAPSHOT + spring-boot-4 + Demo project for Spring Boot + + + com.baeldung.spring-boot-modules + spring-boot-modules + 1.0.0-SNAPSHOT + + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + true + + + org.mapstruct + mapstruct + ${mapstruct.version} + true + + + org.springframework.boot + spring-boot-starter-test + + + + + + default + + true + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.virtualthreads.VirtualThreadsApp + + + org.projectlombok + lombok + + + + + + + + + + integration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + none + 1 + false + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + + + + + repository.spring.milestone + Spring Snapshot Repository + https://repo.spring.io/milestone + + + repository.spring.snapshot + Spring Snapshot Repository + https://repo.spring.io/snapshot + + true + daily + + + + + + repository.spring.milestone.plugins + Spring Snapshot Repository + https://repo.spring.io/milestone + + + repository.spring.snapshot.plugins + Spring Snapshot Repository + https://repo.spring.io/snapshot + + true + daily + + + + + + 1.6.3 + 4.0.0-SNAPSHOT + 1.5.18 + 0.2.0 + + + diff --git a/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/BeanRegistrationsConfiguration.java b/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/BeanRegistrationsConfiguration.java new file mode 100644 index 000000000000..4a668850119d --- /dev/null +++ b/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/BeanRegistrationsConfiguration.java @@ -0,0 +1,26 @@ +package com.baeldung.spring.beanregistrar; + +import org.springframework.beans.factory.BeanRegistrar; +import org.springframework.beans.factory.BeanRegistry; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.core.env.Environment; + +@ConditionalOnProperty(name = "application.registration-v7", havingValue = "true", matchIfMissing = true) +@Configuration +@Import(BeanRegistrationsConfiguration.MyBeanRegistrar.class) +public class BeanRegistrationsConfiguration { + + static class MyBeanRegistrar implements BeanRegistrar { + + @Override + public void register(BeanRegistry registry, Environment env) { + registry.registerBean("myService", MyService.class); + registry.registerBean("service2", MyService.class, spec -> spec.prototype() + .lazyInit() + .primary()); + } + } + +} diff --git a/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/BeanRegistrationsSpring6Configuration.java b/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/BeanRegistrationsSpring6Configuration.java new file mode 100644 index 000000000000..c98938b634eb --- /dev/null +++ b/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/BeanRegistrationsSpring6Configuration.java @@ -0,0 +1,37 @@ +package com.baeldung.spring.beanregistrar; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; +import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@ConditionalOnProperty(name = "application.registration-v7", havingValue = "false") +@SuppressWarnings("NullableProblems") +@Configuration +public class BeanRegistrationsSpring6Configuration { + + @Bean + BeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor() { + return new BeanDefinitionRegistryPostProcessor() { + + @Override + public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { + var beanDefinition = new GenericBeanDefinition(); + beanDefinition.setBeanClass(MyService.class); + beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON); + registry.registerBeanDefinition("myService", beanDefinition); + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + // No-op + } + }; + } + +} diff --git a/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/MyService.java b/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/MyService.java new file mode 100644 index 000000000000..e20f90e763ef --- /dev/null +++ b/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/MyService.java @@ -0,0 +1,5 @@ +package com.baeldung.spring.beanregistrar; + +public class MyService { + +} diff --git a/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/SampleApplication.java b/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/SampleApplication.java new file mode 100644 index 000000000000..07c2684e3e22 --- /dev/null +++ b/spring-boot-modules/spring-boot-4/src/main/java/com/baeldung/spring/beanregistrar/SampleApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.spring.beanregistrar; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SampleApplication { + + public static void main(String[] args) { + SpringApplication.run(SampleApplication.class, args); + } + +} diff --git a/spring-boot-modules/spring-boot-4/src/test/java/com/baeldung/spring/beanregistrar/BeanRegistrarIntegrationTest.java b/spring-boot-modules/spring-boot-4/src/test/java/com/baeldung/spring/beanregistrar/BeanRegistrarIntegrationTest.java new file mode 100644 index 000000000000..e4152aa40e01 --- /dev/null +++ b/spring-boot-modules/spring-boot-4/src/test/java/com/baeldung/spring/beanregistrar/BeanRegistrarIntegrationTest.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.beanregistrar; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class BeanRegistrarIntegrationTest { + + @Autowired + MyService myService; + + @Test + void whenRunningPlatform_thenRegisterBean() { + assertThat(myService).isNotNull(); + } + +} diff --git a/spring-boot-modules/spring-boot-4/src/test/java/com/baeldung/spring/beanregistrar/BeanRegistrationsSpring6IntegrationTest.java b/spring-boot-modules/spring-boot-4/src/test/java/com/baeldung/spring/beanregistrar/BeanRegistrationsSpring6IntegrationTest.java new file mode 100644 index 000000000000..199ba4693460 --- /dev/null +++ b/spring-boot-modules/spring-boot-4/src/test/java/com/baeldung/spring/beanregistrar/BeanRegistrationsSpring6IntegrationTest.java @@ -0,0 +1,20 @@ +package com.baeldung.spring.beanregistrar; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(properties = "application.registration-v7=false") +class BeanRegistrationsSpring6IntegrationTest { + + @Autowired + MyService myService; + + @Test + void whenRunningPlatform_thenRegisterBean() { + assertThat(myService).isNotNull(); + } + +}