Abstrakte Komponenten-Konfiguration mit @Configuration in Spring 3

Ein großer Vorteil beim Einsatz von Spring ist die verbesserte Testbarkeit der Anwendung, da gezielt einzelne Komponenten für einen Testlauf per Konfiguration ausgetauscht werden können. Bei der Konfiguration per XML ist es dabei gängig, unterschiedliche XML-Konfigurationsdateien für den Test- und den Produktionsbetrieb einzusetzen. Vor allem in den Anwendungen, in denen die Abhängigkeiten zwischen den einzelnen Komponenten “byName” aufgelöst werden, muss der Entwickler dabei sehr genau darauf achten, dass die Konfigurationen für alle Umgebungen konsistent bleiben, so dass alle Komponenten beim Starten des Containers auch sicher aufgelöst werden können.

Bei Verwendung von “Java-based container configuration” mit @Configuration und @Bean kann die Prüfung der Konsistenz verschiedener Konfigurationen elegant durch den Compiler unterstützt werden. Durch die Verwendung von abstrakten Basiskonfigurationen, die durch Konfigurationen für spezielle Umgebungen konkretisiert werden, kann bereits der Compiler feststellen, ob alle notwendigen Komponenten konfiguriert wurden.

Nachfolgend ist eine solche abstrakte Konfiguration aufgeführt, bei der ein DAO auf eine Datenquelle (DataSource) zugreift. Die Datenquelle wird dabei allerdings lediglich als abstrakte Definition ohne konkrete Implementierung festgelegt:

@Configuration
public abstract class AbstractConfiguration {
  @Bean
  public UserDao userDao() {
    UserDao userDao = new UserDaoImpl();
    userDao.setDataSource(dataSource());
    return userDao;
  }

  public abstract DataSource dataSource();
}

In der Konfiguration für die Testumgebung (TestDataSourceConfiguration) wird diese Datenquelle anschließend durch eine Testdatenquelle (TestDataSourceImpl) konkretisiert:

@Configuration
public class TestDataSourceConfiguration extends AbstractConfiguration {
  @Bean
  public DataSource dataSource() {
    DataSource testDataSource = new TestDataSourceImpl();
    return testDataSource;
  }
}

Der ApplicationContext von Spring wird für den Testlauf schließlich mit dieser Testkonfiguration gestartet:

@Test
public void testDataSource() {
  ApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestDataSourceConfiguration.class);
  UserDao userDao = applicationContext.getBean(UserDao.class);
  assertTrue(userDao.getDataSource() instanceof TestDataSource);
}
Short URL for this post: http://wp.me/p4nxik-p1
This entry was posted in Java modularization, Spring Universe and tagged , , , , , . Bookmark the permalink.

Leave a Reply