/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.jdbc.datasource.embedded;

import javax.sql.DataSource;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.datasource.init.DatabasePopulator;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
import org.springframework.lang.Nullable;

A subclass of EmbeddedDatabaseFactory that implements FactoryBean for registration as a Spring bean. Returns the actual DataSource that provides connectivity to the embedded database to Spring.

The target DataSource is returned instead of an EmbeddedDatabase proxy since the FactoryBean will manage the initialization and destruction lifecycle of the embedded database instance.

Implements DisposableBean to shutdown the embedded database when the managing Spring container is being closed.

Author:Keith Donald, Juergen Hoeller
Since:3.0
/** * A subclass of {@link EmbeddedDatabaseFactory} that implements {@link FactoryBean} * for registration as a Spring bean. Returns the actual {@link DataSource} that * provides connectivity to the embedded database to Spring. * * <p>The target {@link DataSource} is returned instead of an {@link EmbeddedDatabase} * proxy since the {@link FactoryBean} will manage the initialization and destruction * lifecycle of the embedded database instance. * * <p>Implements {@link DisposableBean} to shutdown the embedded database when the * managing Spring container is being closed. * * @author Keith Donald * @author Juergen Hoeller * @since 3.0 */
public class EmbeddedDatabaseFactoryBean extends EmbeddedDatabaseFactory implements FactoryBean<DataSource>, InitializingBean, DisposableBean { @Nullable private DatabasePopulator databaseCleaner;
Set a script execution to be run in the bean destruction callback, cleaning up the database and leaving it in a known state for others.
Params:
  • databaseCleaner – the database script executor to run on destroy
See Also:
/** * Set a script execution to be run in the bean destruction callback, * cleaning up the database and leaving it in a known state for others. * @param databaseCleaner the database script executor to run on destroy * @see #setDatabasePopulator * @see org.springframework.jdbc.datasource.init.DataSourceInitializer#setDatabaseCleaner */
public void setDatabaseCleaner(DatabasePopulator databaseCleaner) { this.databaseCleaner = databaseCleaner; } @Override public void afterPropertiesSet() { initDatabase(); } @Override @Nullable public DataSource getObject() { return getDataSource(); } @Override public Class<? extends DataSource> getObjectType() { return DataSource.class; } @Override public boolean isSingleton() { return true; } @Override public void destroy() { if (this.databaseCleaner != null && getDataSource() != null) { DatabasePopulatorUtils.execute(this.databaseCleaner, getDataSource()); } shutdownDatabase(); } }