1919import io .flamingock .internal .core .builder .FlamingockFactory ;
2020import io .flamingock .internal .core .builder .AbstractChangeRunnerBuilder ;
2121import io .flamingock .internal .core .store .CommunityAuditStore ;
22- import io .flamingock .internal .core .runner .RunnerBuilder ;
23- import io .flamingock .internal .util .Constants ;
2422import org .springframework .beans .factory .InitializingBean ;
2523import org .springframework .beans .factory .annotation .Autowired ;
26- import org .springframework .beans .factory .annotation .Value ;
2724import org .springframework .boot .ApplicationRunner ;
2825import org .springframework .boot .autoconfigure .condition .ConditionalOnClass ;
2926import org .springframework .boot .autoconfigure .condition .ConditionalOnExpression ;
30- import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
3127import org .springframework .boot .context .properties .EnableConfigurationProperties ;
3228import org .springframework .context .ApplicationContext ;
3329import org .springframework .context .ApplicationEventPublisher ;
3430import org .springframework .context .annotation .Bean ;
3531import org .springframework .context .annotation .Configuration ;
36- import org .springframework .context .annotation .Profile ;
3732
3833import java .util .List ;
3934
35+ /**
36+ * Spring Boot auto-configuration for Flamingock.
37+ *
38+ * <p>The configuration behavior is controlled by the {@code flamingock.management-mode} property:</p>
39+ * <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 DEFERRED} - Spring creates the builder; the application controls execution</li>
43+ * <li>{@code UNMANAGED} - No beans are created; the application manages everything</li>
44+ * </ul>
45+ */
4046@ Configuration
4147@ ConditionalOnClass (name = "org.springframework.boot.SpringApplication" )
42- @ ConditionalOnFlamingockEnabled
48+ @ ConditionalOnExpression ( "!'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('UNMANAGED')" )
4349@ EnableConfigurationProperties (SpringbootProperties .class )
4450public class FlamingockAutoConfiguration {
4551
52+ /**
53+ * Creates an ApplicationRunner that builds and executes Flamingock at application startup.
54+ * Only created when management-mode is APPLICATION_RUNNER (the default).
55+ */
4656 @ Bean ("flamingock-runner" )
47- @ Profile (Constants .NON_CLI_PROFILE )
48- @ ConditionalOnExpression ("'${flamingock.runner-type:ApplicationRunner}'.toLowerCase().equals('applicationrunner')" )
49- public ApplicationRunner applicationRunner (RunnerBuilder runnerBuilder ,
50- @ Value ("${flamingock.autorun:true}" ) boolean autoRun ) {
51- return SpringbootUtil .toApplicationRunner (runnerBuilder , autoRun );
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 );
5266 }
5367
68+ /**
69+ * Creates an InitializingBean that builds and executes Flamingock during bean initialization.
70+ * Only created when management-mode is INITIALIZING_BEAN.
71+ */
5472 @ Bean ("flamingock-runner" )
55- @ Profile (Constants .NON_CLI_PROFILE )
56- @ ConditionalOnExpression ("'${flamingock.runner-type:null}'.toLowerCase().equals('initializingbean')" )
57- public InitializingBean initializingBeanRunner (RunnerBuilder runnerBuilder ,
58- @ Value ("${flamingock.autorun:true}" ) boolean autoRun ) {
59- return SpringbootUtil .toInitializingBean (runnerBuilder , autoRun );
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 );
6082 }
6183
84+ /**
85+ * Exposes the Flamingock builder for manual control over execution.
86+ * Only created when management-mode is DEFERRED.
87+ */
6288 @ Bean ("flamingock-builder" )
63- @ Profile (Constants .NON_CLI_PROFILE )
64- @ ConditionalOnMissingBean (RunnerBuilder .class )
65- public AbstractChangeRunnerBuilder <?,?> flamingockBuilder (SpringbootProperties configurationProperties ,
66- ApplicationContext springContext ,
67- ApplicationEventPublisher applicationEventPublisher ,
68- @ Autowired (required = false ) CommunityAuditStore auditStore ,
69- List <TargetSystem > targetSystems ) {
89+ @ ConditionalOnExpression ("'${flamingock.management-mode:APPLICATION_RUNNER}'.toUpperCase().equals('DEFERRED')" )
90+ public AbstractChangeRunnerBuilder <?, ?> flamingockBuilder (SpringbootProperties configurationProperties ,
91+ ApplicationContext springContext ,
92+ ApplicationEventPublisher applicationEventPublisher ,
93+ @ Autowired (required = false ) CommunityAuditStore auditStore ,
94+ List <TargetSystem > targetSystems ) {
95+ return createBuilder (configurationProperties , springContext , applicationEventPublisher , auditStore , targetSystems );
96+ }
7097
71- AbstractChangeRunnerBuilder <?,?> builder = FlamingockFactory .getEditionAwareBuilder (
98+ private AbstractChangeRunnerBuilder <?, ?> createBuilder (SpringbootProperties configurationProperties ,
99+ ApplicationContext springContext ,
100+ ApplicationEventPublisher applicationEventPublisher ,
101+ CommunityAuditStore auditStore ,
102+ List <TargetSystem > targetSystems ) {
103+ AbstractChangeRunnerBuilder <?, ?> builder = FlamingockFactory .getEditionAwareBuilder (
72104 configurationProperties .getCoreConfiguration (),
73105 configurationProperties .getCloudProperties (),
74106 configurationProperties .getLocalConfiguration (),
75107 auditStore
76108 )
77- .addDependency (SpringRunnerType .class , configurationProperties .getRunnerType ())
109+ .addDependency (SpringbootManagementMode .class , configurationProperties .getManagementMode ())
78110 .addDependency (ApplicationContext .class , springContext )
79111 .addDependency (ApplicationEventPublisher .class , applicationEventPublisher );
80112
@@ -83,6 +115,5 @@ public AbstractChangeRunnerBuilder<?,?> flamingockBuilder(SpringbootProperties c
83115 }
84116
85117 return builder ;
86-
87118 }
88119}
0 commit comments