2424import org .springframework .boot .ApplicationRunner ;
2525import org .springframework .boot .autoconfigure .condition .ConditionalOnClass ;
2626import org .springframework .boot .autoconfigure .condition .ConditionalOnExpression ;
27+ import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
2728import org .springframework .boot .context .properties .EnableConfigurationProperties ;
2829import org .springframework .context .ApplicationContext ;
2930import org .springframework .context .ApplicationEventPublisher ;
3031import org .springframework .context .annotation .Bean ;
3132import org .springframework .context .annotation .Configuration ;
33+ import org .springframework .context .annotation .Profile ;
3234
3335import java .util .List ;
3436
3739 *
3840 * <p>The configuration behavior is controlled by the {@code flamingock.management-mode} property:</p>
3941 * <ul>
40- * <li>{@code APPLICATION_RUNNER} (default) - Spring creates, builds, and executes the runner as an ApplicationRunner</li>
41- * <li>{@code INITIALIZING_BEAN} - Spring creates, builds, and executes the runner as an InitializingBean</li>
42+ * <li>{@code APPLICATION_RUNNER} (default) - Spring creates the builder and executes it as an ApplicationRunner</li>
43+ * <li>{@code INITIALIZING_BEAN} - Spring creates the builder and executes it as an InitializingBean</li>
4244 * <li>{@code DEFERRED} - Spring creates the builder; the application controls execution</li>
4345 * <li>{@code UNMANAGED} - No beans are created; the application manages everything</li>
4446 * </ul>
47+ *
48+ * <p>The builder bean is always created (unless UNMANAGED) and can be overridden by providing
49+ * your own {@link AbstractChangeRunnerBuilder} bean.</p>
4550 */
4651@ Configuration
4752@ ConditionalOnClass (name = "org.springframework.boot.SpringApplication" )
5055public class FlamingockAutoConfiguration {
5156
5257 /**
53- * Creates an ApplicationRunner that builds and executes Flamingock at application startup.
54- * Only created when management-mode is APPLICATION_RUNNER (the default).
55- */
56- @ Bean ("flamingock-runner" )
57- @ ConditionalOnExpression ("'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('APPLICATION_RUNNER')" )
58- public ApplicationRunner applicationRunner (SpringbootProperties configurationProperties ,
59- ApplicationContext springContext ,
60- ApplicationEventPublisher applicationEventPublisher ,
61- @ Autowired (required = false ) CommunityAuditStore auditStore ,
62- List <TargetSystem > targetSystems ) {
63- AbstractChangeRunnerBuilder <?, ?> builder = createBuilder (
64- configurationProperties , springContext , applicationEventPublisher , auditStore , targetSystems );
65- return SpringbootUtil .toApplicationRunner (builder );
66- }
67-
68- /**
69- * Creates an InitializingBean that builds and executes Flamingock during bean initialization.
70- * Only created when management-mode is INITIALIZING_BEAN.
71- */
72- @ Bean ("flamingock-runner" )
73- @ ConditionalOnExpression ("'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('INITIALIZING_BEAN')" )
74- public InitializingBean initializingBeanRunner (SpringbootProperties configurationProperties ,
75- ApplicationContext springContext ,
76- ApplicationEventPublisher applicationEventPublisher ,
77- @ Autowired (required = false ) CommunityAuditStore auditStore ,
78- List <TargetSystem > targetSystems ) {
79- AbstractChangeRunnerBuilder <?, ?> builder = createBuilder (
80- configurationProperties , springContext , applicationEventPublisher , auditStore , targetSystems );
81- return SpringbootUtil .toInitializingBean (builder );
82- }
83-
84- /**
85- * Exposes the Flamingock builder for manual control over execution.
86- * Only created when management-mode is DEFERRED.
58+ * Creates the Flamingock builder bean.
59+ * Always created unless management-mode is UNMANAGED or user provides their own builder.
8760 */
8861 @ Bean ("flamingock-builder" )
89- @ ConditionalOnExpression ( "'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('DEFERRED')" )
62+ @ ConditionalOnMissingBean ( AbstractChangeRunnerBuilder . class )
9063 public AbstractChangeRunnerBuilder <?, ?> flamingockBuilder (SpringbootProperties configurationProperties ,
9164 ApplicationContext springContext ,
9265 ApplicationEventPublisher applicationEventPublisher ,
9366 @ Autowired (required = false ) CommunityAuditStore auditStore ,
9467 List <TargetSystem > targetSystems ) {
95- return createBuilder (configurationProperties , springContext , applicationEventPublisher , auditStore , targetSystems );
96- }
97-
98- private AbstractChangeRunnerBuilder <?, ?> createBuilder (SpringbootProperties configurationProperties ,
99- ApplicationContext springContext ,
100- ApplicationEventPublisher applicationEventPublisher ,
101- CommunityAuditStore auditStore ,
102- List <TargetSystem > targetSystems ) {
10368 AbstractChangeRunnerBuilder <?, ?> builder = FlamingockFactory .getEditionAwareBuilder (
10469 configurationProperties .getCoreConfiguration (),
10570 configurationProperties .getCloudProperties (),
@@ -116,4 +81,24 @@ public InitializingBean initializingBeanRunner(SpringbootProperties configuratio
11681
11782 return builder ;
11883 }
84+
85+ /**
86+ * Creates an ApplicationRunner that builds and executes Flamingock at application startup.
87+ * Only created when management-mode is APPLICATION_RUNNER (the default).
88+ */
89+ @ Bean ("flamingock-runner" )
90+ @ ConditionalOnExpression ("'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('APPLICATION_RUNNER')" )
91+ public ApplicationRunner applicationRunner (AbstractChangeRunnerBuilder <?, ?> builder ) {
92+ return SpringbootUtil .toApplicationRunner (builder );
93+ }
94+
95+ /**
96+ * Creates an InitializingBean that builds and executes Flamingock during bean initialization.
97+ * Only created when management-mode is INITIALIZING_BEAN.
98+ */
99+ @ Bean ("flamingock-runner" )
100+ @ ConditionalOnExpression ("'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('INITIALIZING_BEAN')" )
101+ public InitializingBean initializingBeanRunner (AbstractChangeRunnerBuilder <?, ?> builder ) {
102+ return SpringbootUtil .toInitializingBean (builder );
103+ }
119104}
0 commit comments