středa 12. září 2007

Spring 2.5 - podpora anotací, testovací framework a další

Nedávno uvolněný 4 milestone verze 2.1 Spring framewroku mě přinutil k migraci na tento release. Na začátek bych ovšem rád vysvětlil jak to bude s verzováním dalších releasu Springu, prototože je to trochu zmatečné. Takže číslo 2.1 se používá pro označení milestonů, číslo označující nadcházející verzi Springu je 2.5 (stále ompatibilní s J2SE 1.4) a finálně by měla být k dispozici v říjnu. Dalším zásadní verzí bude 3.0, pro kterou se očekává jako cílové prostředí J2SE 5.0.

Pokud s ptáte co bude na 2.5 tak zásadního, pak odpovím oficiální podpora anotací. Ano je to tak, řídící metadata pro IoC kontejner je možné vyjádřit pomocí anotací viz dokumentace 3.10. Annotation-based configuration. S tím souvisí i automatické vyhledávání anotovaných tříd na classpath.

    
@Component
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Autowired
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }
}    
    
    

Další zásadní novinkou je integrace s novými verzemi testovacích frameworků JUnit a TestNG. Předchozí API využívané k psaní integračních testů záviselo na trojkové verzi JUnit, která nepodporovala anotace. Pokud jste tedy chtěli použít původní podporu a JUnit 4.x bylo potřeba využít workaround.

Do podpory testování bylo vloženo dost úsilí, které nechalo vzniknout Spring TestContext Frameworku. Psaní testů, ve kterých lze využít transakce, dependency injection je teď mnohem snašší. První rozdíl je v tom, že není potřeba dědit od konkrétní třídy.

    
@RunWith(SpringJUnit4ClassRunner.class)
// specifies the Spring configuration to load for this test fixture
@ContextConfiguration(locations={"daos.xml"})
public final class HibernateTitleDaoTests {

    // this instance will be dependency injected by type
    @Autowired    
    private HibernateTitleDao titleDao;

    public void testLoadTitle() throws Exception {
        Title title = this.titleDao.loadTitle(new Long(10));
        assertNotNull(title);
    }
}    
    
    

Druhý rozdíl je v koncepci, kdy se veškerá přidaná funkčnost řeší pomocí TestExecutionListeneru. Spring má tyto listenery předimplementované pro řízení transakcí a nebo dependency injection. Vy si samozřejmě můžete naimplementovat vlastní listener, kterým dodáte potřebnou funkčnost. Pokud jste četli výborný článek Honzi Novotného Jak na rychlé integrační testy ve Springu, tak pomocí listeneru a řízení transakcí anotacemi by to šlo naimplementovat elegantněji. Právě něco podobného implementuji ještě navíc s využitím DbUnit, takže se můžete v budoucnu těšit na obsáhlejší článek.

Samozřejmě 2.5 je i o dalších velice užitečných vlastnostech. Oficiálně certifikovaná podpora WebSphere 6, možnost deploynutí kontextu pomocí resource adapterů (lepší management zdrojů - vlákna) a další. Kompletní soupis pocházející z oficiálního postu Jurgena Hoellera následuje.

  • full Java 6 and Java EE 5 support (JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0, etc)
  • full-featured annotation-driven dependency injection (including support for 'qualifier' annotations)
  • support for component scanning in the classpath (autodetecting annotated classes)
  • "beanName" pointcut element in AspectJ pointcut expressions
  • built-in support for for AspectJ load-time weaving (based on Spring's LoadTimeWeaver abstraction)
  • further XML configuration namespaces ("context", "jms") for maximum convenience
  • extended SimpleJdbcTemplate functionality (support for named parameters etc)
  • officially certified WebSphere support (support for the WebSphere 6 UOWManager facility etc)
  • Spring ApplicationContext can be deployed as RAR file (for headless application modules)
  • JCA 1.5 message endpoint management (for Spring-managed JMS and CCI message listeners)
  • completely revised framework for integration tests (with support for JUnit 4 and TestNG)