私たちのユースケースは、間違いなくさらに複雑でした。データベースの移行にFlywayを使用しており、entityManagerFactory
が作成される前に開始する必要があります。私たちにとっての問題は、<jdbc:initialize-database />
が移行テストでのみ使用されたため、flyway
およびentityManagerFactory
. そのため、単純にL.BIZE answer を使用して、flyway
Bean を依存させることはできません。これは、Beanorg.springframework.jdbc.datasource.init.DataSourceInitializer#0
が存在しない可能性があるためです (つまり、実稼働環境では存在しません)。最終的に、次のようなカスタム ファクトリ Bean を作成しました。
class OptionalBeanInitializer extends AbstractFactoryBean implements BeanFactoryAware {
private String beanName;
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
@Override
public Class<?> getObjectType() {
return OptionalBeanInitializer.class;
}
public void setBeanName(String beanName) {
this.beanName = beanName;
}
@Override
protected Object createInstance() throws Exception {
if (beanFactory.containsBean(beanName)) {
// Initialize
beanFactory.getBean(beanName);
}
return new OptionalBeanInitializer();
}
}
次のように、オプションの依存関係に依存するために使用できます。
<bean id="optionalDataSourceInitializer" class="com.x.y.z.OptionalBeanInitializer">
<property name="beanName" value="org.springframework.jdbc.datasource.init.DataSourceInitializer#0"/>
</bean>
<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate" depends-on="optionalDataSourceInitializer">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"
depends-on="flyway, optionalDataSourceInitializer">
<property name="dataSource" ref="dataSource"/>
</bean>
は、Beanが存在する場合にのみ、 BeanOptionalBeanInitializer
の初期化を処理します。org.springframework.jdbc.datasource.init.DataSourceInitializer#0