Someone asked for my full Spring 3.1 annotation configuration. I've stripped all domain-specific information, but the overall structure is intact.
- SpringConfig.java - this is the top level class, is empty except for @ComponentScan and @Import statements. The web.xml references this.
- SpringMvcConfiguration - Any MVC related configuration
- DatabaseConfiguration
@Configuration
@ComponentScan(basePackageClasses = { SpringConfig.class})
@Import({ SpringMvcConfiguration.class, DatabaseConfiguration.class})
public class SpringConfig {
}
@Configuration
@EnableWebMvc
@Import({ MvcComponents.class,BeanConfiguration.class })
public class SpringMvcConfiguration extends WebMvcConfigurerAdapter {
@Qualifier("generalMapper")
@Autowired ObjectMapper mapper;
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//Our app has some custom message converters
// converters.add(...);
}
@Bean
public HttpMessageConverter<Object> jsonConverter() {
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
ObjectMapper m = new ObjectMapper();
//We have to customize our mapper a bit
converter.setObjectMapper(m);
return converter;
}
}
@Configuration
@EnableTransactionManagement
@ComponentScan(basePackageClasses = { DatabaseConfiguration.class }, excludeFilters = @Filter(Configuration.class))
public class DatabaseConfiguration {
@Autowired
private DataSource dataSource;
@Autowired
private boolean hibernateShowSql;
private final String hibernateDialect = "org.hibernate.dialect.SQLServerDialect";//This app uses SQL Server
@Bean
public AbstractSessionFactoryBean paymentSessionFactory() {
AnnotationSessionFactoryBean b = new AnnotationSessionFactoryBean();
b.setDataSource(dataSource);
b.setPackagesToScan(new String[] { this.getClass().getPackage().getName() + ".model" });//All our models are in a sub-package "model"
Properties hiberProps = new Properties();
hiberProps.setProperty("hibernate.show_sql", Boolean.toString(hibernateShowSql));
hiberProps.setProperty("hibernate.dialect", hibernateDialect);
b.setHibernateProperties(hiberProps);
return b;
}
@Bean
@Autowired
public AbstractPlatformTransactionManager transactionManager(AbstractSessionFactoryBean bean) {
HibernateTransactionManager tm = new HibernateTransactionManager();
tm.setSessionFactory(bean.getObject());
return tm;
}
@Configuration
@Profile({ "production", "stage", "qa", "test" })
// For normal use.
public static class TomcatLinuxSetup {
@Resource(mappedName = "jdbc/dataSourceNameHere")
private DataSource dataSource;
@Bean
public DataSource dataSource() {
return dataSource;
}
@Bean
public boolean hibernateShowSql() {
return false;
}
}
/**
* Beans for testing.
*/
@Configuration
@Profile("development")
// Only unit tests/local app server
public static class DevelopmentSetup {
@Bean
public DataSource dataSource() {
DriverManagerDataSource delegate = new DriverManagerDataSource();
delegate.setDriverClassName("...");
delegate.setUrl("...");
delegate.setUsername("...");
delegate.setPassword("...");
return delegate;
}
@Bean
public boolean hibernateShowSql() {
return true;
}
}
}
