2828import org .springframework .aop .framework .ProxyFactory ;
2929import org .springframework .aop .support .NameMatchMethodPointcutAdvisor ;
3030import org .springframework .beans .factory .config .BeanPostProcessor ;
31- import org .springframework .boot .sql .init .AbstractScriptDatabaseInitializer ;
31+ import org .springframework .boot .jdbc .init .DataSourceScriptDatabaseInitializer ;
3232import org .springframework .core .Ordered ;
3333import org .springframework .core .env .Environment ;
3434
3535import javax .sql .DataSource ;
3636
37- import static com .google .common .base .Preconditions .checkState ;
38-
3937public class SpringScriptDatabaseExtension implements BeanPostProcessor , Ordered {
4038
4139 private final boolean enabled ;
@@ -55,18 +53,18 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) {
5553 return bean ;
5654 }
5755
58- if (bean instanceof AbstractScriptDatabaseInitializer ) {
59- AbstractScriptDatabaseInitializer initializer = (AbstractScriptDatabaseInitializer ) bean ;
56+ if (bean instanceof DataSourceScriptDatabaseInitializer ) {
57+ DataSourceScriptDatabaseInitializer initializer = (DataSourceScriptDatabaseInitializer ) bean ;
6058 DataSource dataSource = ReflectionUtils .getField (initializer , "dataSource" );
6159 DatabaseContext context = AopProxyUtils .getDatabaseContext (dataSource );
6260
6361 if (context != null ) {
6462 if (bean instanceof Advised && !((Advised ) bean ).isFrozen ()) {
65- ((Advised ) bean ).addAdvisor (0 , createAdvisor (initializer ));
63+ ((Advised ) bean ).addAdvisor (0 , createAdvisor (initializer , context ));
6664 return bean ;
6765 } else {
6866 ProxyFactory proxyFactory = new ProxyFactory (bean );
69- proxyFactory .addAdvisor (createAdvisor (initializer ));
67+ proxyFactory .addAdvisor (createAdvisor (initializer , context ));
7068 proxyFactory .setProxyTargetClass (true );
7169 return proxyFactory .getProxy ();
7270 }
@@ -81,35 +79,36 @@ public Object postProcessAfterInitialization(Object bean, String beanName) {
8179 return bean ;
8280 }
8381
84- protected Advisor createAdvisor (AbstractScriptDatabaseInitializer initializer ) {
85- Advice advice = new SpringScriptDatabaseExtensionInterceptor (initializer );
82+ protected Advisor createAdvisor (DataSourceScriptDatabaseInitializer initializer , DatabaseContext context ) {
83+ Advice advice = new SpringScriptDatabaseExtensionInterceptor (initializer , context );
8684 NameMatchMethodPointcutAdvisor advisor = new NameMatchMethodPointcutAdvisor (advice );
8785 advisor .setMappedNames ("afterPropertiesSet" , "initializeDatabase" );
8886 return advisor ;
8987 }
9088
9189 protected static class SpringScriptDatabaseExtensionInterceptor implements MethodInterceptor {
9290
93- private final AbstractScriptDatabaseInitializer initializer ;
91+ private final DataSourceScriptDatabaseInitializer initializer ;
92+ private final DatabaseContext context ;
9493
95- protected SpringScriptDatabaseExtensionInterceptor (AbstractScriptDatabaseInitializer initializer ) {
94+ protected SpringScriptDatabaseExtensionInterceptor (DataSourceScriptDatabaseInitializer initializer ,
95+ DatabaseContext context ) {
9696 this .initializer = initializer ;
97+ this .context = context ;
9798 }
9899
99100 @ Override
100101 public Object invoke (MethodInvocation invocation ) throws Throwable {
101- String methodName = invocation .getMethod ().getName ();
102- if (!"afterPropertiesSet" .equals (methodName ) && !"initializeDatabase" .equals (methodName )) {
103- return invocation .proceed ();
102+ switch (invocation .getMethod ().getName ()) {
103+ case "afterPropertiesSet" :
104+ context .apply (new SpringScriptDatabasePreparer (initializer ));
105+ return null ;
106+ case "initializeDatabase" :
107+ context .apply (new SpringScriptDatabasePreparer (initializer ));
108+ return true ;
109+ default :
110+ return invocation .proceed ();
104111 }
105-
106- DataSource dataSource = ReflectionUtils .getField (initializer , "dataSource" );
107- DatabaseContext context = AopProxyUtils .getDatabaseContext (dataSource );
108- checkState (context != null , "Data source context cannot be resolved" );
109-
110- context .apply (new SpringScriptDatabasePreparer (initializer ));
111-
112- return null ;
113112 }
114113 }
115114}
0 commit comments