diff --git a/flyway/flyway-callbacks/.gitignore b/flyway/flyway-callbacks/.gitignore
new file mode 100644
index 0000000000..2af7cefb0a
--- /dev/null
+++ b/flyway/flyway-callbacks/.gitignore
@@ -0,0 +1,24 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/flyway/flyway-callbacks/pom.xml b/flyway/flyway-callbacks/pom.xml
new file mode 100644
index 0000000000..e61a5742a4
--- /dev/null
+++ b/flyway/flyway-callbacks/pom.xml
@@ -0,0 +1,59 @@
+
+
+ 4.0.0
+
+ flyway-callbacks
+ 0.0.1-SNAPSHOT
+ jar
+
+ flyway-callbacks
+ Flyway Callbacks Demo
+
+
+ flyway
+ com.baeldung
+ 1.0
+ ../../flyway
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.flywaydb
+ flyway-core
+ 5.0.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+
+ com.h2database
+ h2
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java b/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java
new file mode 100644
index 0000000000..6ad4ce510c
--- /dev/null
+++ b/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java
@@ -0,0 +1,33 @@
+package com.baeldung.flywaycallbacks;
+
+import java.sql.Connection;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.flywaydb.core.api.MigrationInfo;
+import org.flywaydb.core.api.callback.BaseFlywayCallback;
+
+public class ExampleFlywayCallback extends BaseFlywayCallback {
+
+ private Log log = LogFactory.getLog(getClass());
+
+ @Override
+ public void afterEachMigrate(Connection connection, MigrationInfo info) {
+ log.info("> afterEachMigrate");
+ }
+
+ @Override
+ public void afterMigrate(Connection connection) {
+ log.info("> afterMigrate");
+ }
+
+ @Override
+ public void beforeEachMigrate(Connection connection, MigrationInfo info) {
+ log.info("> beforeEachMigrate");
+ }
+
+ @Override
+ public void beforeMigrate(Connection connection) {
+ log.info("> beforeMigrate");
+ }
+}
diff --git a/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java b/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java
new file mode 100644
index 0000000000..34d794f7d1
--- /dev/null
+++ b/flyway/flyway-callbacks/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.flywaycallbacks;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class FlywayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(FlywayApplication.class, args);
+ }
+
+}
diff --git a/flyway/flyway-callbacks/src/main/resources/application.properties b/flyway/flyway-callbacks/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeEachMigrate.sql b/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeEachMigrate.sql
new file mode 100644
index 0000000000..7a8f142d22
--- /dev/null
+++ b/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeEachMigrate.sql
@@ -0,0 +1 @@
+SELECT 1
\ No newline at end of file
diff --git a/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeMigrate.sql b/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeMigrate.sql
new file mode 100644
index 0000000000..7a8f142d22
--- /dev/null
+++ b/flyway/flyway-callbacks/src/main/resources/db/callbacks/beforeMigrate.sql
@@ -0,0 +1 @@
+SELECT 1
\ No newline at end of file
diff --git a/flyway/flyway-callbacks/src/main/resources/db/migration/V1_0__add_table_one.sql b/flyway/flyway-callbacks/src/main/resources/db/migration/V1_0__add_table_one.sql
new file mode 100644
index 0000000000..526d8e2aea
--- /dev/null
+++ b/flyway/flyway-callbacks/src/main/resources/db/migration/V1_0__add_table_one.sql
@@ -0,0 +1,5 @@
+create table table_one (
+ id numeric,
+ name varchar(50),
+ constraint pk_table_one primary key (id)
+);
\ No newline at end of file
diff --git a/flyway/flyway-callbacks/src/main/resources/db/migration/V1_1__add_table_two.sql b/flyway/flyway-callbacks/src/main/resources/db/migration/V1_1__add_table_two.sql
new file mode 100644
index 0000000000..d51f4a5d56
--- /dev/null
+++ b/flyway/flyway-callbacks/src/main/resources/db/migration/V1_1__add_table_two.sql
@@ -0,0 +1,5 @@
+create table table_two (
+ id numeric,
+ name varchar(50),
+ constraint pk_table_two primary key (id)
+);
\ No newline at end of file
diff --git a/flyway/flyway-callbacks/src/main/resources/logback.xml b/flyway/flyway-callbacks/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7f4aa46e0d
--- /dev/null
+++ b/flyway/flyway-callbacks/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java b/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java
new file mode 100644
index 0000000000..22edb5a007
--- /dev/null
+++ b/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.flywaycallbacks;
+
+import java.util.Arrays;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.flywaydb.core.Flyway;
+import org.flywaydb.core.api.MigrationInfoService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import com.baeldung.flywaycallbacks.FlywayCallbackTestConfig;
+
+@RunWith(SpringRunner.class)
+@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
+@ContextConfiguration(classes = FlywayCallbackTestConfig.class)
+public class FlywayApplicationTest {
+
+ private Log log = LogFactory.getLog(getClass());
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Test
+ public void migrateWithNoCallbacks() {
+ logTestBoundary("migrateWithNoCallbacks");
+ Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setLocations("db/migration");
+ flyway.migrate();
+ }
+
+ @Test
+ public void migrateWithJavaCallbacks() {
+ logTestBoundary("migrateWithJavaCallbacks");
+ Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setLocations("db/migration");
+ flyway.setCallbacks(new ExampleFlywayCallback());
+ flyway.migrate();
+ }
+
+ @Test
+ public void migrateWithSqlCallbacks() {
+ logTestBoundary("migrateWithSqlCallbacks");
+ Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setLocations("db/migration", "db/callbacks");
+ flyway.migrate();
+ }
+
+ @Test
+ public void migrateWithSqlAndJavaCallbacks() {
+ logTestBoundary("migrateWithSqlAndJavaCallbacks");
+ Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setLocations("db/migration", "db/callbacks");
+ flyway.setCallbacks(new ExampleFlywayCallback());
+ flyway.migrate();
+ }
+
+ private void logTestBoundary(String testName) {
+ System.out.println("\n");
+ log.info("> " + testName);
+ }
+ }
diff --git a/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java b/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java
new file mode 100644
index 0000000000..f64b490dcf
--- /dev/null
+++ b/flyway/flyway-callbacks/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java
@@ -0,0 +1,21 @@
+package com.baeldung.flywaycallbacks;
+
+import javax.sql.DataSource;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+@Configuration
+public class FlywayCallbackTestConfig {
+
+ @Bean
+ public DataSource createDatasource() {
+ EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder();
+ return dbBuilder.setType(EmbeddedDatabaseType.H2)
+ .setName("DATABASE")
+ .build();
+ }
+
+}