Spring boot

The preferred approach with Spring is to create a Database explicitly using Database.builder() and expose it as a normal Spring bean.

This keeps startup explicit and makes it easy to inject Database directly into repositories, services and tests.

Spring-managed transactions

If you want Spring to manage the transactions, add the ebean-spring-txn dependency and register SpringJdbcTransactionManager as Ebean's external transaction manager.

<dependency>
  <groupId>${groupid}</groupId>
  <artifactId>${artifactid}</artifactId>
  <version>${version_str}</version>
</dependency>
<dependency org="${groupid}" name="${artifactid}" rev="${version_str}"/>
@Grapes(
  @Grab(group='${groupid}', module='${artifactid}', version='${version_str}')
)
'${groupid}:${artifactid}:${version_str}'
'${groupid}:${artifactid}:${version_str}'
libraryDependencies += "${groupid}" % "${artifactid}" % "${version_str}"
[${groupid}/${artifactid} "${version_str}"]
@Configuration
public class DatabaseConfiguration {

  @Bean
  Database database(SpringJdbcTransactionManager txnManager) {
    return Database.builder()
      .name("db")
      .loadFromProperties()
      .externalTransactionManager(txnManager)
      .build();
  }
}
SpringJdbcTransactionManager

SpringJdbcTransactionManager implements Ebean's ExternalTransactionManager API and provides integration into Spring transaction management.

SpringJdbcTransaction

SpringJdbcTransaction extends Ebean's ExternalJdbcTransaction and is used by SpringJdbcTransactionManager.

Inject Database

Prefer injecting Database into Spring beans rather than relying on the global DB singleton in application code. In practice most applications still keep the default registration enabled on the builder so that query beans, Model and other default-database-based APIs can resolve the database under the hood.