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:
And here the actual java based configuration class: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); } }
I exclude this configuration class itself and any SpringMVC @Controller class from component scan. The import-resources contains the JDBC property file definition.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); } }
With this implementation, the test failed with
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 !Code:'sessionFactory' or 'hibernateTemplate' is required
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


Reply With Quote