SlideShare a Scribd company logo
Spring Framework
Petclinic
Michael Isvy
Antoine Rey
Spring Petclinic
 Sample application designed to show how the Spring application frameworks can
be used to build simple, but powerful database-oriented applications
 Demonstrate the use of Spring's core functionality:
 JavaBeans based application configuration using Inversion of Control (IoC)
 Model View Controller (MVC) web Presentation Layer
 Practical database access through JDBC, Java Persistence API (JPA) or Spring Data JPA
 Application monitoring based on JMX
 Declarative Transaction Management using AOP
 Data Validation that supports but is not dependent on the Presentation Layer
 Exists many versions (forks) of the Spring Petclinic sample application
Spring Framework Petclinic
 https://github.com/spring-petclinic/spring-framework-petclinic
 Fork of the « canonical » implementation of Spring Petclinic
 Maintain a Petclinic version with a plain old Spring Framework configuration
and with a 3-layer architecture
3 Spring
profiles
JDBC
JPA (default)
Spring Data JPA
Repository
Service
@Cacheable
@Transactional
Controller
Bean Validation
Spring @MVC
annotations
Views
Bootstrap (CSS)
JSP with
custom tags
custom LESS
webjars
Software Layers
Domain Model
Data Access
VisitRepository
JdbcVisit
RepositoryImpl
JpaVisit
RepositoryImpl
SpringData
VisitRepository
findByPetId: 16 lines of code findByPetId: 3 (short)
lines of code
findByPetId: 0 lines (interface
declaration is enough based
on naming conventions)
In order to select which implementation should be used :
1. select the appropriate bean profile inside PetclinicInitializer (jdbc, jpa or spring-data-jpa)
2. or use the -Dspring.profiles.active=jdbc VM option
Database
# Properties that control the population of schema and data for a new data source
jdbc.initLocation=classpath:db/${db.script}/initDB.sql
jdbc.dataLocation=classpath:db/${db.script}/populateDB.sql
 Supports HSQLDB (default), MySQL, PostgreSQL
 Connections parameters and drivers are declared into Maven profiles
 DDL and DML SQL scripts for each database vendors:
docker run --name mysql-petclinic -e MYSQL_ROOT_PASSWORD=petclinic -e MYSQL_DATABASE=petclinic
-p 3306:3306 mysql:5.7.8
mvn tomcat7:run-war -P MySQL
 How to start Spring Petclinic with a MySQL database?
data-access.properties
Bean profiles
business-config.xml
3 profiles
default (JPA)
jdbc
Spring Data JPA
Inside PetclinicInitializer.javaInside Junit tests
No configuration needed in case you wish to use the default profile (jpa)
@ContextConfiguration(locations = … })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("jpa")
public class ClinicServiceJpaTests … { }
XmlWebApplicationContext context =
new XmlWebApplicationContext();
context.setConfigLocations(…);
context.getEnvironment().setDefaultProfiles("jpa");
<beans profile="jpa,spring-data-jpa">
<bean id="entityManagerFactory" … >
</beans>
Caching
 The list of Veterinarians is cached using ehcache
ClinicServiceImpl
tools-config.xml
ehcache.xml
@Cacheable(value = "vets")
public Collection<Vet> findVets()
throws DataAccessException {…}
<cache name="vets"
timeToLiveSeconds="60"
maxElementsInMemory="100" …/>
<!-- Enables scanning for @Cacheable annotation -->
<cache:annotation-driven/>
<bean id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheCacheManager"
p:cacheManager-ref="ehcache"/>
<bean id="ehcache"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:cache/ehcache.xml"/>
Transaction management
<!-- Enables scanning for @Transactional annotations -->
<tx:annotation-driven/>
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory"/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/>
@Transactional(readOnly = true)
public Collection<PetType> findPetTypes() throws DataAccessException {
return petRepository.findPetTypes();
}
business-config.xml
ClinicServiceImpl.java
Alternative to JPA,
Transaction Managers
for a single:
JPA
EntityManagerFactory
JDBC
DataSource
Exception Handling
PetRepository
ClinicService
PetController
May throw a RuntimeException
(typically DataAccessException)
Transaction is rolled back
in case of a RuntimeException
(exception is still propagated to PetController)
Exception is not handled there
It is propagated.
SimpleMapping
ExceptionResolver
Declared in mvc-core-config.xml
Based on the configuration used in petclinic:
• Logs the exception stacktrace
• Forwards to WEB-INF/jsp/exception.jsp
• Exception logged as a comment inside exception.jsp
Aspect Oriented Programming (1/2)
 How to add behavior in all methods of all Repository classes?
JpaOwnerRepository
JpaPetRepository
JpaVetRepository
JpaVisitRepository
ClinicService LOG ALL
METHOD
CALLS
Aspect Oriented Programming (2/2)
 CallMonitoringAspect
…
@Repository
public class
JpaVetRepositoryImpl
@Repository
public class
JpaVisitRepositoryImpl
Adds monitoring
Adds
monitoring
Adds monitoring
@Aspect
public class CallMonitoringAspect {
@Around("within(@org.springframework.stereotype.Repository *)")
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable { … }
To understand further how AOP works in Spring:
https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring
View Resolvers in Spring Petclinic
ContentNegotiatingViewResolver Does not resolve any view on its own
Delegates to other view resolvers
BeanName
ViewResolver
JSON and XML
InternalResource
ViewResolver
Default viewClass: JstlView
(used for JSP files)
vets.html
owners.html
vets.xml
vets.json
mvc-view-config.xml
Datatables in Spring MVC
15
JSP file
<table id="vets" class="table table-striped">
<thead>
<tr>
<th>Name</th><th>Address</th><th>City</th><th>Telephone</th><th>Pets</th>
</tr>
</thead>
<tbody>
<c:forEach items="${selections}" var="owner">
<tr>
<td>
<spring:url value="/owners/{ownerId}.html" var="ownerUrl">
<spring:param name="ownerId" value="${owner.id}"/>
</spring:url>
<a href="${fn:escapeXml(ownerUrl)}"><c:out value="${owner.firstName} ${owner.lastName}"/></a>
</td>
<td>
<c:out value="${owner.address}"/>
</td>
…
</tr>
</c:forEach>
</tbody>
</table>
Simple HTML tables with Bootstrap style
Templating
 Simple JSP custom tags
vetList.jsp
Main content
layout.tag
htmlHeader.tag
bodyHeader.tag
pivotal.tag
menu.tag
footer.tag
jquery.js, jquery-ui.js,
bootstrap.js
petclinic.css
Validation
 Server-side validation with Bean Validation
 Few annotations on entities: @Digits, @NotEmpty (Hibernate Validator)
 Custom Spring MVC Validator when required (i.e. PetValidator)
@RequestMapping(value = "/owners/new",
method = RequestMethod.POST)
public String processCreationForm(@Valid Owner owner,
BindingResult result) {
if (result.hasErrors()) { …
public class Owner extends Person {
@Column(name = "address")
@NotEmpty
private String address;
...
<c:if test="${status.error}">
<span class="glyphicon glyphicon-remove
form-control-feedback" aria-hidden="true"/>
<span class="help-inline">${status.errorMessage}</span>
</c:if>
 Allow CSS and JS libraries to be imported as Maven libraries
 Used in Petclinic for jQuery, jQuery-ui, Bootstrap
 http://www.webjars.org/
Webjars
Using Webjars
 Inside pom.xml
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>2.2.4</version>
</dependency>
<mvc:resources mapping="/webjars/**"
location="classpath:/META-INF/resources/webjars/"/>
 Inside JSP (footer.tag)
 Spring MVC configuration
<spring:url value="/webjars/jquery/2.2.4/jquery.min.js" var="jQuery"/>
<script src="${jQuery}"></script>
The Js file is inside a jar file!
 Inside IDE
LESS
 LESS as a CSS pre-processor
 See petclinic.less
 CSS generated by wro4j
 Integrated to the Maven build
 See usage of the wro4j-maven-plugin inside the pom.xml
 Less import from Bootstrap webjar
<groups xmlns="http://www.isdc.ro/wro">
<group name="petclinic">
<css>classpath:META-INF/resources/webjars/
bootstrap/3.3.6/less/bootstrap.less</css>
<css>/petclinic.less</css>
</group>
</groups>
wro.xml
Java based configuration
 Spring XML configuration could be replaced by Java configuration
 Checkout the javaconfig branch
@Configuration
@EnableWebMvc
@Import(MvcViewConfig.class)
@ComponentScan(basePackages =
{ "org.springfrk.samples.petclinic.web" })
public class MvcCoreConfig
extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry reg) {
reg.addViewController("/").setViewName("welcome");
}
…
}
MvcCoreConfig.java
<import resource="mvc-view-config.xml"/>
<context:component-scan
base-package="org.springfrk.samples.petclinic.web"/>
<mvc:annotation-driven />
<mvc:view-controller path="/" view-name="welcome"/>
…
mvc-core-config.xml
Unit Testing
@Test
public void testProcessUpdateFormHasErrors() throws Exception {
mockMvc.perform(post("/owners/{ownerId}/pets/{petId}/edit", 1, 1)
.param("name", "Betty")
.param("birthDate", "2015/02/12"))
.andExpect(model().attributeHasNoErrors("owner"))
.andExpect(model().attributeHasErrors("pet"))
.andExpect(status().isOk())
.andExpect(view().name("pets/createOrUpdatePetForm"));
}
 Frameworks: Spring Test, JUnit, HSQLDB, Mockito,
AssertJ, Hamcrest, Json Path
 Tests are shared between persistence technologies
 Inherits from AbstractClinicServiceTests
PetControllerTests.java
Comparing with the original Spring Petclinic
Spring Framework Petclinic « Canonical » Spring Petclinic
Spring stack Plain Old Spring Framework Spring Boot
Architecture 3 layers Aggregate-oriented domain
Persistence JDBC, JPA, Spring Data JPA Spring Data JPA
View JSP Thymeleaf
Databases support HSQLDB, MySQL, PostgreSQL HSQLDB, MySQL
Containers support Tomcat 7 and 8, Jetty 9 Embbeded Tomcat and Jetty
Java support Java 7 and 8 Java 8
• « Canonical » implementation : https://github.com/spring-projects/spring-petclinic
• Spring Framework version : https://github.com/spring-petclinic/spring-framework-petclinic
Other Spring Petclinic versions
Name Technologies Github
Spring Petclinic Angular AngularJS 1.x, Spring Boot
and Spring Data JPA
https://github.com/spring-
petclinic/spring-petclinic-angular1
Spring Petclinic React ReactJS (with TypeScript) and
Spring Boot
https://github.com/spring-
petclinic/spring-petclinic-reactjs
Spring Petclinic
Microservices
Distributed version of Spring
Petclinic built with Spring
Cloud
https://github.com/spring-
petclinic/spring-petclinic-microservices
References
 Transactions, Caching and AOP: understanding proxy usage in
Spring (Michael Isvy)
 Series of 5 blog entries from on how to Improve performance of
the Spring-Petclinic application (Julien Dubois)
 Exception Handling in Spring MVC (Paul Chapman)
 Spring MVC Test Framework (Rossen Stoyanchev)
 Empower your CSS in your Maven build (Nicolas Frankel)

More Related Content

What's hot (20)

PPTX
Kubernetes presentation
GauranG Bajpai
 
PDF
Ansible
Raul Leite
 
PDF
Ansible
Rahul Bajaj
 
PPT
Ansible presentation
John Lynch
 
PPTX
Springboot Microservices
NexThoughts Technologies
 
PDF
Kubernetes Architecture | Understanding Kubernetes Components | Kubernetes Tu...
Edureka!
 
PPTX
Why to Cloud Native
Karthik Gaekwad
 
PDF
DevOps Meetup ansible
sriram_rajan
 
PDF
Microservice With Spring Boot and Spring Cloud
Eberhard Wolff
 
PPTX
Docker Kubernetes Istio
Araf Karsh Hamid
 
PDF
OpenShift-Technical-Overview.pdf
JuanSalinas593459
 
PPTX
01. Kubernetes-PPT.pptx
TamalBanerjee16
 
PPTX
What Is Ansible? | How Ansible Works? | Ansible Tutorial For Beginners | DevO...
Simplilearn
 
PDF
Introduction to Spring Cloud
VMware Tanzu
 
PDF
Terraform -- Infrastructure as Code
Martin Schütte
 
PDF
Microservices with Java, Spring Boot and Spring Cloud
Eberhard Wolff
 
PDF
Helm - Application deployment management for Kubernetes
Alexei Ledenev
 
ODP
Openshift Container Platform
DLT Solutions
 
PDF
Kubernetes 101
Crevise Technologies
 
PDF
DevOps with Ansible
Swapnil Jain
 
Kubernetes presentation
GauranG Bajpai
 
Ansible
Raul Leite
 
Ansible
Rahul Bajaj
 
Ansible presentation
John Lynch
 
Springboot Microservices
NexThoughts Technologies
 
Kubernetes Architecture | Understanding Kubernetes Components | Kubernetes Tu...
Edureka!
 
Why to Cloud Native
Karthik Gaekwad
 
DevOps Meetup ansible
sriram_rajan
 
Microservice With Spring Boot and Spring Cloud
Eberhard Wolff
 
Docker Kubernetes Istio
Araf Karsh Hamid
 
OpenShift-Technical-Overview.pdf
JuanSalinas593459
 
01. Kubernetes-PPT.pptx
TamalBanerjee16
 
What Is Ansible? | How Ansible Works? | Ansible Tutorial For Beginners | DevO...
Simplilearn
 
Introduction to Spring Cloud
VMware Tanzu
 
Terraform -- Infrastructure as Code
Martin Schütte
 
Microservices with Java, Spring Boot and Spring Cloud
Eberhard Wolff
 
Helm - Application deployment management for Kubernetes
Alexei Ledenev
 
Openshift Container Platform
DLT Solutions
 
Kubernetes 101
Crevise Technologies
 
DevOps with Ansible
Swapnil Jain
 

Similar to Spring Framework Petclinic sample application (18)

PDF
the Spring 4 update
Joshua Long
 
PDF
The Spring 4 Update - Josh Long
jaxconf
 
PPTX
สปริงเฟรมเวิร์ค4.1
ทวิร พานิชสมบัติ
 
PDF
SpringOne 2GX 2013 - Spring Testing
Mattias Severson
 
PDF
Spring MVC Annotations
Jordan Silva
 
PPT
Spring Boot Introduction and framework.ppt
amitsharmahimcs
 
KEY
Multi Client Development with Spring
Joshua Long
 
PPTX
Building enterprise web applications with spring 3
Abdelmonaim Remani
 
PDF
Performance tuning the Spring Pet Clinic sample application
Julien Dubois
 
PPT
Spring 3.1: a Walking Tour
Joshua Long
 
PDF
Spring Framework Training From myTectra in Bangalore
myTectra Learning Solutions Private Ltd
 
PDF
Spring Data JPA + JSF + Maven + Mysql using Eclipse IDE
Nikhil Bhalwankar
 
PDF
Spring Framework 4.1
Sam Brannen
 
PPT
Spring training
TechFerry
 
PPTX
201502 - Integration Testing
lyonjug
 
PDF
Spring 3 - An Introduction
Thorsten Kamann
 
PDF
Advance Java Training in Bangalore | Best Java Training Institute
TIB Academy
 
PPTX
Configuring jpa in a Spring application
Jayasree Perilakkalam
 
the Spring 4 update
Joshua Long
 
The Spring 4 Update - Josh Long
jaxconf
 
สปริงเฟรมเวิร์ค4.1
ทวิร พานิชสมบัติ
 
SpringOne 2GX 2013 - Spring Testing
Mattias Severson
 
Spring MVC Annotations
Jordan Silva
 
Spring Boot Introduction and framework.ppt
amitsharmahimcs
 
Multi Client Development with Spring
Joshua Long
 
Building enterprise web applications with spring 3
Abdelmonaim Remani
 
Performance tuning the Spring Pet Clinic sample application
Julien Dubois
 
Spring 3.1: a Walking Tour
Joshua Long
 
Spring Framework Training From myTectra in Bangalore
myTectra Learning Solutions Private Ltd
 
Spring Data JPA + JSF + Maven + Mysql using Eclipse IDE
Nikhil Bhalwankar
 
Spring Framework 4.1
Sam Brannen
 
Spring training
TechFerry
 
201502 - Integration Testing
lyonjug
 
Spring 3 - An Introduction
Thorsten Kamann
 
Advance Java Training in Bangalore | Best Java Training Institute
TIB Academy
 
Configuring jpa in a Spring application
Jayasree Perilakkalam
 
Ad

More from Antoine Rey (13)

PPTX
Quoi de neuf à Devoxx France 2017 ?
Antoine Rey
 
PPTX
Introduction à spring boot
Antoine Rey
 
PPTX
Les Streams de Java 8
Antoine Rey
 
PPTX
Retours Devoxx France 2016
Antoine Rey
 
PPTX
Ces outils qui vous font gagner du temps
Antoine Rey
 
PPTX
Tester unitairement une application java
Antoine Rey
 
PPTX
Les dessous du framework spring
Antoine Rey
 
PPTX
Introduction à Angular JS
Antoine Rey
 
PPTX
Workshop Spring - Session 5 - Spring Integration
Antoine Rey
 
PPTX
Workshop Spring - Session 4 - Spring Batch
Antoine Rey
 
PPTX
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Antoine Rey
 
PPTX
Workshop spring session 2 - La persistance au sein des applications Java
Antoine Rey
 
PPTX
Workshop Spring - Session 1 - L'offre Spring et les bases
Antoine Rey
 
Quoi de neuf à Devoxx France 2017 ?
Antoine Rey
 
Introduction à spring boot
Antoine Rey
 
Les Streams de Java 8
Antoine Rey
 
Retours Devoxx France 2016
Antoine Rey
 
Ces outils qui vous font gagner du temps
Antoine Rey
 
Tester unitairement une application java
Antoine Rey
 
Les dessous du framework spring
Antoine Rey
 
Introduction à Angular JS
Antoine Rey
 
Workshop Spring - Session 5 - Spring Integration
Antoine Rey
 
Workshop Spring - Session 4 - Spring Batch
Antoine Rey
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Antoine Rey
 
Workshop spring session 2 - La persistance au sein des applications Java
Antoine Rey
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Antoine Rey
 
Ad

Recently uploaded (20)

PDF
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
PPTX
Agentic AI in Healthcare Driving the Next Wave of Digital Transformation
danielle hunter
 
PDF
Brief History of Internet - Early Days of Internet
sutharharshit158
 
PDF
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
PDF
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
PPTX
Farrell_Programming Logic and Design slides_10e_ch02_PowerPoint.pptx
bashnahara11
 
PDF
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
PDF
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
PDF
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
PPTX
AVL ( audio, visuals or led ), technology.
Rajeshwri Panchal
 
PDF
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
PDF
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
PPTX
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
PDF
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
PDF
Market Insight : ETH Dominance Returns
CIFDAQ
 
PDF
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
PDF
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
PPTX
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
PDF
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 
Tea4chat - another LLM Project by Kerem Atam
a0m0rajab1
 
Agentic AI in Healthcare Driving the Next Wave of Digital Transformation
danielle hunter
 
Brief History of Internet - Early Days of Internet
sutharharshit158
 
How Open Source Changed My Career by abdelrahman ismail
a0m0rajab1
 
Make GenAI investments go further with the Dell AI Factory
Principled Technologies
 
Farrell_Programming Logic and Design slides_10e_ch02_PowerPoint.pptx
bashnahara11
 
Economic Impact of Data Centres to the Malaysian Economy
flintglobalapac
 
The Future of Mobile Is Context-Aware—Are You Ready?
iProgrammer Solutions Private Limited
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
Peak of Data & AI Encore - Real-Time Insights & Scalable Editing with ArcGIS
Safe Software
 
AVL ( audio, visuals or led ), technology.
Rajeshwri Panchal
 
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
How ETL Control Logic Keeps Your Pipelines Safe and Reliable.pdf
Stryv Solutions Pvt. Ltd.
 
Agile Chennai 18-19 July 2025 | Emerging patterns in Agentic AI by Bharani Su...
AgileNetwork
 
AI Unleashed - Shaping the Future -Starting Today - AIOUG Yatra 2025 - For Co...
Sandesh Rao
 
Market Insight : ETH Dominance Returns
CIFDAQ
 
Responsible AI and AI Ethics - By Sylvester Ebhonu
Sylvester Ebhonu
 
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
AI and Robotics for Human Well-being.pptx
JAYMIN SUTHAR
 
GDG Cloud Munich - Intro - Luiz Carneiro - #BuildWithAI - July - Abdel.pdf
Luiz Carneiro
 

Spring Framework Petclinic sample application

  • 2. Spring Petclinic  Sample application designed to show how the Spring application frameworks can be used to build simple, but powerful database-oriented applications  Demonstrate the use of Spring's core functionality:  JavaBeans based application configuration using Inversion of Control (IoC)  Model View Controller (MVC) web Presentation Layer  Practical database access through JDBC, Java Persistence API (JPA) or Spring Data JPA  Application monitoring based on JMX  Declarative Transaction Management using AOP  Data Validation that supports but is not dependent on the Presentation Layer  Exists many versions (forks) of the Spring Petclinic sample application
  • 3. Spring Framework Petclinic  https://github.com/spring-petclinic/spring-framework-petclinic  Fork of the « canonical » implementation of Spring Petclinic  Maintain a Petclinic version with a plain old Spring Framework configuration and with a 3-layer architecture
  • 4. 3 Spring profiles JDBC JPA (default) Spring Data JPA Repository Service @Cacheable @Transactional Controller Bean Validation Spring @MVC annotations Views Bootstrap (CSS) JSP with custom tags custom LESS webjars Software Layers
  • 6. Data Access VisitRepository JdbcVisit RepositoryImpl JpaVisit RepositoryImpl SpringData VisitRepository findByPetId: 16 lines of code findByPetId: 3 (short) lines of code findByPetId: 0 lines (interface declaration is enough based on naming conventions) In order to select which implementation should be used : 1. select the appropriate bean profile inside PetclinicInitializer (jdbc, jpa or spring-data-jpa) 2. or use the -Dspring.profiles.active=jdbc VM option
  • 7. Database # Properties that control the population of schema and data for a new data source jdbc.initLocation=classpath:db/${db.script}/initDB.sql jdbc.dataLocation=classpath:db/${db.script}/populateDB.sql  Supports HSQLDB (default), MySQL, PostgreSQL  Connections parameters and drivers are declared into Maven profiles  DDL and DML SQL scripts for each database vendors: docker run --name mysql-petclinic -e MYSQL_ROOT_PASSWORD=petclinic -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:5.7.8 mvn tomcat7:run-war -P MySQL  How to start Spring Petclinic with a MySQL database? data-access.properties
  • 8. Bean profiles business-config.xml 3 profiles default (JPA) jdbc Spring Data JPA Inside PetclinicInitializer.javaInside Junit tests No configuration needed in case you wish to use the default profile (jpa) @ContextConfiguration(locations = … }) @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("jpa") public class ClinicServiceJpaTests … { } XmlWebApplicationContext context = new XmlWebApplicationContext(); context.setConfigLocations(…); context.getEnvironment().setDefaultProfiles("jpa"); <beans profile="jpa,spring-data-jpa"> <bean id="entityManagerFactory" … > </beans>
  • 9. Caching  The list of Veterinarians is cached using ehcache ClinicServiceImpl tools-config.xml ehcache.xml @Cacheable(value = "vets") public Collection<Vet> findVets() throws DataAccessException {…} <cache name="vets" timeToLiveSeconds="60" maxElementsInMemory="100" …/> <!-- Enables scanning for @Cacheable annotation --> <cache:annotation-driven/> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehcache"/> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="classpath:cache/ehcache.xml"/>
  • 10. Transaction management <!-- Enables scanning for @Transactional annotations --> <tx:annotation-driven/> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory"/> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource"/> @Transactional(readOnly = true) public Collection<PetType> findPetTypes() throws DataAccessException { return petRepository.findPetTypes(); } business-config.xml ClinicServiceImpl.java Alternative to JPA, Transaction Managers for a single: JPA EntityManagerFactory JDBC DataSource
  • 11. Exception Handling PetRepository ClinicService PetController May throw a RuntimeException (typically DataAccessException) Transaction is rolled back in case of a RuntimeException (exception is still propagated to PetController) Exception is not handled there It is propagated. SimpleMapping ExceptionResolver Declared in mvc-core-config.xml Based on the configuration used in petclinic: • Logs the exception stacktrace • Forwards to WEB-INF/jsp/exception.jsp • Exception logged as a comment inside exception.jsp
  • 12. Aspect Oriented Programming (1/2)  How to add behavior in all methods of all Repository classes? JpaOwnerRepository JpaPetRepository JpaVetRepository JpaVisitRepository ClinicService LOG ALL METHOD CALLS
  • 13. Aspect Oriented Programming (2/2)  CallMonitoringAspect … @Repository public class JpaVetRepositoryImpl @Repository public class JpaVisitRepositoryImpl Adds monitoring Adds monitoring Adds monitoring @Aspect public class CallMonitoringAspect { @Around("within(@org.springframework.stereotype.Repository *)") public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable { … } To understand further how AOP works in Spring: https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring
  • 14. View Resolvers in Spring Petclinic ContentNegotiatingViewResolver Does not resolve any view on its own Delegates to other view resolvers BeanName ViewResolver JSON and XML InternalResource ViewResolver Default viewClass: JstlView (used for JSP files) vets.html owners.html vets.xml vets.json mvc-view-config.xml
  • 15. Datatables in Spring MVC 15 JSP file <table id="vets" class="table table-striped"> <thead> <tr> <th>Name</th><th>Address</th><th>City</th><th>Telephone</th><th>Pets</th> </tr> </thead> <tbody> <c:forEach items="${selections}" var="owner"> <tr> <td> <spring:url value="/owners/{ownerId}.html" var="ownerUrl"> <spring:param name="ownerId" value="${owner.id}"/> </spring:url> <a href="${fn:escapeXml(ownerUrl)}"><c:out value="${owner.firstName} ${owner.lastName}"/></a> </td> <td> <c:out value="${owner.address}"/> </td> … </tr> </c:forEach> </tbody> </table> Simple HTML tables with Bootstrap style
  • 16. Templating  Simple JSP custom tags vetList.jsp Main content layout.tag htmlHeader.tag bodyHeader.tag pivotal.tag menu.tag footer.tag jquery.js, jquery-ui.js, bootstrap.js petclinic.css
  • 17. Validation  Server-side validation with Bean Validation  Few annotations on entities: @Digits, @NotEmpty (Hibernate Validator)  Custom Spring MVC Validator when required (i.e. PetValidator) @RequestMapping(value = "/owners/new", method = RequestMethod.POST) public String processCreationForm(@Valid Owner owner, BindingResult result) { if (result.hasErrors()) { … public class Owner extends Person { @Column(name = "address") @NotEmpty private String address; ... <c:if test="${status.error}"> <span class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"/> <span class="help-inline">${status.errorMessage}</span> </c:if>
  • 18.  Allow CSS and JS libraries to be imported as Maven libraries  Used in Petclinic for jQuery, jQuery-ui, Bootstrap  http://www.webjars.org/ Webjars
  • 19. Using Webjars  Inside pom.xml <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>2.2.4</version> </dependency> <mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/"/>  Inside JSP (footer.tag)  Spring MVC configuration <spring:url value="/webjars/jquery/2.2.4/jquery.min.js" var="jQuery"/> <script src="${jQuery}"></script> The Js file is inside a jar file!  Inside IDE
  • 20. LESS  LESS as a CSS pre-processor  See petclinic.less  CSS generated by wro4j  Integrated to the Maven build  See usage of the wro4j-maven-plugin inside the pom.xml  Less import from Bootstrap webjar <groups xmlns="http://www.isdc.ro/wro"> <group name="petclinic"> <css>classpath:META-INF/resources/webjars/ bootstrap/3.3.6/less/bootstrap.less</css> <css>/petclinic.less</css> </group> </groups> wro.xml
  • 21. Java based configuration  Spring XML configuration could be replaced by Java configuration  Checkout the javaconfig branch @Configuration @EnableWebMvc @Import(MvcViewConfig.class) @ComponentScan(basePackages = { "org.springfrk.samples.petclinic.web" }) public class MvcCoreConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry reg) { reg.addViewController("/").setViewName("welcome"); } … } MvcCoreConfig.java <import resource="mvc-view-config.xml"/> <context:component-scan base-package="org.springfrk.samples.petclinic.web"/> <mvc:annotation-driven /> <mvc:view-controller path="/" view-name="welcome"/> … mvc-core-config.xml
  • 22. Unit Testing @Test public void testProcessUpdateFormHasErrors() throws Exception { mockMvc.perform(post("/owners/{ownerId}/pets/{petId}/edit", 1, 1) .param("name", "Betty") .param("birthDate", "2015/02/12")) .andExpect(model().attributeHasNoErrors("owner")) .andExpect(model().attributeHasErrors("pet")) .andExpect(status().isOk()) .andExpect(view().name("pets/createOrUpdatePetForm")); }  Frameworks: Spring Test, JUnit, HSQLDB, Mockito, AssertJ, Hamcrest, Json Path  Tests are shared between persistence technologies  Inherits from AbstractClinicServiceTests PetControllerTests.java
  • 23. Comparing with the original Spring Petclinic Spring Framework Petclinic « Canonical » Spring Petclinic Spring stack Plain Old Spring Framework Spring Boot Architecture 3 layers Aggregate-oriented domain Persistence JDBC, JPA, Spring Data JPA Spring Data JPA View JSP Thymeleaf Databases support HSQLDB, MySQL, PostgreSQL HSQLDB, MySQL Containers support Tomcat 7 and 8, Jetty 9 Embbeded Tomcat and Jetty Java support Java 7 and 8 Java 8 • « Canonical » implementation : https://github.com/spring-projects/spring-petclinic • Spring Framework version : https://github.com/spring-petclinic/spring-framework-petclinic
  • 24. Other Spring Petclinic versions Name Technologies Github Spring Petclinic Angular AngularJS 1.x, Spring Boot and Spring Data JPA https://github.com/spring- petclinic/spring-petclinic-angular1 Spring Petclinic React ReactJS (with TypeScript) and Spring Boot https://github.com/spring- petclinic/spring-petclinic-reactjs Spring Petclinic Microservices Distributed version of Spring Petclinic built with Spring Cloud https://github.com/spring- petclinic/spring-petclinic-microservices
  • 25. References  Transactions, Caching and AOP: understanding proxy usage in Spring (Michael Isvy)  Series of 5 blog entries from on how to Improve performance of the Spring-Petclinic application (Julien Dubois)  Exception Handling in Spring MVC (Paul Chapman)  Spring MVC Test Framework (Rossen Stoyanchev)  Empower your CSS in your Maven build (Nicolas Frankel)

Editor's Notes

  • #3: Source: http://docs.spring.io/docs/petclinic.html
  • #5: Hibernate as JPA provider
  • #8: DDL and DML scripts depends from the database
  • #20: Possibly: show that we can outsource from a variable