SlideShare ist ein Scribd-Unternehmen logo
1 von 25
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)

Weitere ähnliche Inhalte

Was ist angesagt?

Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
Antoine Rey
 

Was ist angesagt? (20)

Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Spring Security
Spring SecuritySpring Security
Spring Security
 
Mastering Active Directory_ Design, deploy, and protect Active Directory Doma...
Mastering Active Directory_ Design, deploy, and protect Active Directory Doma...Mastering Active Directory_ Design, deploy, and protect Active Directory Doma...
Mastering Active Directory_ Design, deploy, and protect Active Directory Doma...
 
Clean architectures with fast api pycones
Clean architectures with fast api   pyconesClean architectures with fast api   pycones
Clean architectures with fast api pycones
 
Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans Spring - Part 1 - IoC, Di and Beans
Spring - Part 1 - IoC, Di and Beans
 
Spring boot Introduction
Spring boot IntroductionSpring boot Introduction
Spring boot Introduction
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introduction
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 
Support distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcastSupport distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcast
 
ASP.NET MVC 3.0 Validation
ASP.NET MVC 3.0 ValidationASP.NET MVC 3.0 Validation
ASP.NET MVC 3.0 Validation
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with Spring
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action
 
Maven ppt
Maven pptMaven ppt
Maven ppt
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 
Microservice Architecture | Microservices Tutorial for Beginners | Microservi...
Microservice Architecture | Microservices Tutorial for Beginners | Microservi...Microservice Architecture | Microservices Tutorial for Beginners | Microservi...
Microservice Architecture | Microservices Tutorial for Beginners | Microservi...
 
Secure your app with keycloak
Secure your app with keycloakSecure your app with keycloak
Secure your app with keycloak
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Microservice Architecture using Spring Boot with React & Redux
Microservice Architecture using Spring Boot with React & ReduxMicroservice Architecture using Spring Boot with React & Redux
Microservice Architecture using Spring Boot with React & Redux
 

Ähnlich wie Spring Framework Petclinic sample application

Spring design-juergen-qcon
Spring design-juergen-qconSpring design-juergen-qcon
Spring design-juergen-qcon
Yiwei Ma
 
Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1
Michał Orman
 
Spring 3: What's New
Spring 3: What's NewSpring 3: What's New
Spring 3: What's New
Ted Pennings
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
Tuna Tore
 
springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892
Tuna Tore
 
Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)
Gunith Devasurendra
 
ASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin LauASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin Lau
Spiffy
 

Ähnlich wie Spring Framework Petclinic sample application (20)

Introduction to Spring Boot
Introduction to Spring BootIntroduction to Spring Boot
Introduction to Spring Boot
 
Integrating Wicket with Java EE 6
Integrating Wicket with Java EE 6Integrating Wicket with Java EE 6
Integrating Wicket with Java EE 6
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
 
Spring design-juergen-qcon
Spring design-juergen-qconSpring design-juergen-qcon
Spring design-juergen-qcon
 
Dropwizard
DropwizardDropwizard
Dropwizard
 
Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1Integration of Backbone.js with Spring 3.1
Integration of Backbone.js with Spring 3.1
 
Spring framework in depth
Spring framework in depthSpring framework in depth
Spring framework in depth
 
Spring 3: What's New
Spring 3: What's NewSpring 3: What's New
Spring 3: What's New
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with Spring
 
Javatwo2012 java frameworkcomparison
Javatwo2012 java frameworkcomparisonJavatwo2012 java frameworkcomparison
Javatwo2012 java frameworkcomparison
 
Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5Java Spring MVC Framework with AngularJS by Google and HTML5
Java Spring MVC Framework with AngularJS by Google and HTML5
 
springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892springmvc-150923124312-lva1-app6892
springmvc-150923124312-lva1-app6892
 
PUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBootPUC SE Day 2019 - SpringBoot
PUC SE Day 2019 - SpringBoot
 
Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)Rediscovering Spring with Spring Boot(1)
Rediscovering Spring with Spring Boot(1)
 
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdfdokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
 
dokumen.tips_rediscovering-spring-with-spring-boot1.pdf
dokumen.tips_rediscovering-spring-with-spring-boot1.pdfdokumen.tips_rediscovering-spring-with-spring-boot1.pdf
dokumen.tips_rediscovering-spring-with-spring-boot1.pdf
 
#31.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#31.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#31.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#31.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
 
Spring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenSpring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in Heaven
 
ASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin LauASP.NET Overview - Alvin Lau
ASP.NET Overview - Alvin Lau
 
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
 

Mehr von Antoine Rey

Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
Antoine Rey
 

Mehr von Antoine Rey (11)

Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Les dessous du framework spring
Les dessous du framework springLes dessous du framework spring
Les dessous du framework spring
 
Introduction à Angular JS
Introduction à Angular JSIntroduction à Angular JS
Introduction à Angular JS
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring Integration
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
 
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
Workshop Spring  3 - Tests et techniques avancées du conteneur SpringWorkshop Spring  3 - Tests et techniques avancées du conteneur Spring
Workshop Spring 3 - Tests et techniques avancées du conteneur Spring
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 

Kürzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Kürzlich hochgeladen (20)

Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 

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)

Hinweis der Redaktion

  1. Source: http://docs.spring.io/docs/petclinic.html
  2. Hibernate as JPA provider
  3. DDL and DML scripts depends from the database
  4. Possibly: show that we can outsource from a variable