Hi,
I'll switch from XML to Java based configuration. I've always migrate my SpringMVC config into a @EnableWebMvc annotated class without -much- problems. Now I want to migrate the main application context configuration containing all the services, DAO's, database settings etc.
First, my test class for the new java based configuration:
Code:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes=AppConfig.class)
public class AppContextTest extends AbstractJUnit4SpringContextTests
{
    @Test
    public void testDAOWiring()
    {
        CustomerDAO dao = applicationContext.getBean(CustomerDAO.class);
        assertNotNull(dao);
    }
}
And here the actual java based configuration class:
Code:
@Configuration
@ComponentScan(basePackages = "webapp.customer", excludeFilters = {@ComponentScan.Filter(Configuration.class), @ComponentScan.Filter(Controller.class)})
@ImportResource({"classpath*:properties-config.xml"})
public class AppConfig
{
    @Bean
    public SessionFactory sessionFactory() throws Exception
    {
        AnnotationSessionFactoryBean bean = new AnnotationSessionFactoryBean();
        bean.setDataSource(dataSource());
        bean.setPackagesToScan(new String[] {"webapp"});
        bean.setHibernateProperties(hibernateProps());
        bean.afterPropertiesSet();
        return bean.getObject();
    }

    private Properties hibernateProps()
    {
        Properties jpaProperties = new Properties();
        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
        jpaProperties.put("hibernate.hbm2ddl.auto", "create-drop");
        jpaProperties.put("hibernate.show_sql", false);
        jpaProperties.put("hibernate.format_sql", true);
        return jpaProperties;
    }
   
    @Value("${db.driverClass}") private String driverClass;
    @Value("${db.jdbcUrl}") private String jdbcUrl;
    @Value("${db.user}") private String user;
    @Value("${db.password}") private String password;    

    @Bean
    public DataSource dataSource()
    {
        return new DriverManagerDataSource(driverClass, jdbcUrl, user, password);
    }
}
I exclude this configuration class itself and any SpringMVC @Controller class from component scan. The import-resources contains the JDBC property file definition.
With this implementation, the test failed with
Code:
'sessionFactory' or 'hibernateTemplate' is required
This is strange, due to the existing @Bean annotated method sessionFactory(). If DEBUG loglevel is enabled, I saw that there was a singleton created for the sessionFactory. Another strange fact was, that I can't debug this method as long as @ComponentScan was enabled for the class. Any breakpoint within the method wasn't hit. After disabling @ComponentScan, my breakpoint was hit, the method executed and the sessionFactory properly created. Also all the Hibernate stuff (connect to database, create DB schema etc.) happened. But -of course- my test for CustomerDAO failed due to the missing component scan, the @Repository annotated class CustomerDAOHibernateImpl wasn't created !

It seems, that here under Spring 3.1.0.RC1 the combination of @ComponentScan and Hibernate/sessionFactory configuration based on JavaConfig don't work properly. I also try the example from Spring 3.1 reference "2.5.3.1 Java based bean metadata". This was without @ComponentScan ... and it works as expected.

Has anybody any idea, what went wrong with my implementation mentioned here ?
Thanks in advance
Dominik