diff --git a/src/main/java/org/springframework/samples/petclinic/config/BusinessConfig.java b/src/main/java/org/springframework/samples/petclinic/config/BusinessConfig.java
new file mode 100644
index 000000000..fd258f7e6
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/config/BusinessConfig.java
@@ -0,0 +1,22 @@
+package org.springframework.samples.petclinic.config;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+// import the dataSource definition
+@ImportResource("classpath:spring/datasource-config.xml")
+@ComponentScan("org.springframework.samples.petclinic.service")
+// Configurer that replaces ${...} placeholders with values from a properties file
+// (in this case, JDBC-related settings for the JPA EntityManager definition below)
+@PropertySource("classpath:spring/data-access.properties")
+@EnableTransactionManagement
+@Import({JdbcConfig.class, SharedJpaConfig.class, JpaConfig.class, SpringDataJpaConfig.class})
+public class BusinessConfig {
+
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/config/JdbcConfig.java b/src/main/java/org/springframework/samples/petclinic/config/JdbcConfig.java
new file mode 100644
index 000000000..34f5786f5
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/config/JdbcConfig.java
@@ -0,0 +1,40 @@
+package org.springframework.samples.petclinic.config;
+
+import javax.sql.DataSource;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+@Configuration
+@Profile("jdbc")
+@ComponentScan("org.springframework.samples.petclinic.repository.jdbc")
+public class JdbcConfig {
+
+ @Autowired
+ private DataSource dataSource;
+
+
+ @Bean
+ public DataSourceTransactionManager dataSourceTransactionManager() {
+ return new DataSourceTransactionManager(dataSource);
+ }
+
+ @Bean(name="transactionManager")
+ public JdbcTemplate jdbcTemplate() {
+ return new JdbcTemplate(dataSource);
+ }
+
+ @Bean
+
+ public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
+ return new NamedParameterJdbcTemplate(dataSource);
+ }
+
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/config/JpaConfig.java b/src/main/java/org/springframework/samples/petclinic/config/JpaConfig.java
new file mode 100644
index 000000000..a8c18e74a
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/config/JpaConfig.java
@@ -0,0 +1,12 @@
+package org.springframework.samples.petclinic.config;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+@Configuration
+@Profile("jpa")
+@ComponentScan("org.springframework.samples.petclinic.repository.jpa")
+public class JpaConfig {
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/config/RootApplicationContextConfig.java b/src/main/java/org/springframework/samples/petclinic/config/RootApplicationContextConfig.java
index 9a55d3605..254b3209c 100644
--- a/src/main/java/org/springframework/samples/petclinic/config/RootApplicationContextConfig.java
+++ b/src/main/java/org/springframework/samples/petclinic/config/RootApplicationContextConfig.java
@@ -1,10 +1,12 @@
package org.springframework.samples.petclinic.config;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
@Configuration
-@ImportResource({"classpath:spring/business-config.xml", "classpath:spring/tools-config.xml"})
+@Import(BusinessConfig.class)
+@ImportResource("classpath:spring/tools-config.xml")
public class RootApplicationContextConfig {
}
diff --git a/src/main/java/org/springframework/samples/petclinic/config/SharedJpaConfig.java b/src/main/java/org/springframework/samples/petclinic/config/SharedJpaConfig.java
new file mode 100644
index 000000000..0d454c977
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/config/SharedJpaConfig.java
@@ -0,0 +1,64 @@
+package org.springframework.samples.petclinic.config;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.JpaVendorAdapter;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.Database;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+
+@Configuration
+@Profile({"jpa", "spring-data-jpa"})
+public class SharedJpaConfig {
+
+ @Autowired
+ private Environment env;
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Bean
+ public EntityManagerFactory entityManagerFactory() {
+ LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource);
+ // gDickens: BOTH Persistence Unit and Packages to Scan are NOT compatible, persistenceUnit will win
+ em.setPersistenceUnitName("petclinic");
+ em.setPackagesToScan("org.springframework.samples.petclinic");
+ em.setJpaVendorAdapter(jpaVendorAdaper());
+ em.afterPropertiesSet();
+ return em.getObject();
+ }
+
+ @Bean
+ public JpaVendorAdapter jpaVendorAdaper() {
+ HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ // the 'database' parameter refers to the database dialect being used.
+ // By default, Hibernate will use a 'HSQL' dialect because 'jpa.database' has been set to 'HSQL'
+ // inside file spring/data-access.properties
+ vendorAdapter.setDatabase(env.getProperty("jpa.database", Database.class));
+ vendorAdapter.setShowSql(env.getProperty("jpa.showSql", Boolean.class));
+ return vendorAdapter;
+ }
+
+ @Bean(name="transactionManager")
+ public JpaTransactionManager jpaTransactionManager() {
+ JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
+ jpaTransactionManager.setEntityManagerFactory(entityManagerFactory());
+ return jpaTransactionManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+
+}
diff --git a/src/main/java/org/springframework/samples/petclinic/config/SpringDataJpaConfig.java b/src/main/java/org/springframework/samples/petclinic/config/SpringDataJpaConfig.java
new file mode 100644
index 000000000..c10b99bcf
--- /dev/null
+++ b/src/main/java/org/springframework/samples/petclinic/config/SpringDataJpaConfig.java
@@ -0,0 +1,12 @@
+package org.springframework.samples.petclinic.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@Configuration
+@Profile("spring-data-jpa")
+@EnableJpaRepositories("org.springframework.samples.petclinic.repository.springdatajpa")
+public class SpringDataJpaConfig {
+
+}
diff --git a/src/main/resources/spring/business-config.xml b/src/main/resources/spring/business-config.xml
deleted file mode 100644
index 99cf4c1d3..000000000
--- a/src/main/resources/spring/business-config.xml
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceJdbcTests.java b/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceJdbcTests.java
index 49e57ea40..1543596b0 100644
--- a/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceJdbcTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceJdbcTests.java
@@ -16,6 +16,7 @@
package org.springframework.samples.petclinic.service;
import org.junit.runner.RunWith;
+import org.springframework.samples.petclinic.config.BusinessConfig;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -27,7 +28,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @author Thomas Risberg
* @author Michael Isvy
*/
-@ContextConfiguration(locations = {"classpath:spring/business-config.xml"})
+@ContextConfiguration(classes = BusinessConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("jdbc")
public class ClinicServiceJdbcTests extends AbstractClinicServiceTests {
diff --git a/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceJpaTests.java b/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceJpaTests.java
index e024f21fd..2f5c9e3fc 100644
--- a/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceJpaTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceJpaTests.java
@@ -2,6 +2,7 @@
package org.springframework.samples.petclinic.service;
import org.junit.runner.RunWith;
+import org.springframework.samples.petclinic.config.BusinessConfig;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -15,7 +16,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @author Michael Isvy
*/
-@ContextConfiguration(locations = {"classpath:spring/business-config.xml"})
+@ContextConfiguration(classes = BusinessConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("jpa")
public class ClinicServiceJpaTests extends AbstractClinicServiceTests {
diff --git a/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceSpringDataJpaTests.java b/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceSpringDataJpaTests.java
index e01dda551..2cbd73c9e 100644
--- a/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceSpringDataJpaTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/service/ClinicServiceSpringDataJpaTests.java
@@ -2,6 +2,7 @@
package org.springframework.samples.petclinic.service;
import org.junit.runner.RunWith;
+import org.springframework.samples.petclinic.config.BusinessConfig;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -12,7 +13,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
* @author Michael Isvy
*/
-@ContextConfiguration(locations = {"classpath:spring/business-config.xml"})
+@ContextConfiguration(classes = BusinessConfig.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("spring-data-jpa")
public class ClinicServiceSpringDataJpaTests extends AbstractClinicServiceTests {
diff --git a/src/test/java/org/springframework/samples/petclinic/web/VisitsViewTests-config.xml b/src/test/java/org/springframework/samples/petclinic/web/VisitsViewTests-config.xml
deleted file mode 100644
index 8458ba2ec..000000000
--- a/src/test/java/org/springframework/samples/petclinic/web/VisitsViewTests-config.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/src/test/java/org/springframework/samples/petclinic/web/VisitsViewTests.java b/src/test/java/org/springframework/samples/petclinic/web/VisitsViewTests.java
index ace89a019..2f1e17fa3 100644
--- a/src/test/java/org/springframework/samples/petclinic/web/VisitsViewTests.java
+++ b/src/test/java/org/springframework/samples/petclinic/web/VisitsViewTests.java
@@ -28,8 +28,10 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
+import org.springframework.samples.petclinic.config.BusinessConfig;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.ContextHierarchy;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
@@ -44,7 +46,9 @@ import org.springframework.web.context.WebApplicationContext;
*/
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
-@ContextConfiguration("VisitsViewTests-config.xml")
+@ContextHierarchy({
+ @ContextConfiguration(classes = BusinessConfig.class),
+ @ContextConfiguration(locations = "classpath:spring/mvc-core-config.xml")})
@ActiveProfiles("jdbc")
public class VisitsViewTests {