spring - a java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... ·...
TRANSCRIPT
![Page 2: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/2.jpg)
! Script
2
" https://github.com/odrotbohm/lectures " http://static.olivergierke.de/lectures/spring
![Page 3: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/3.jpg)
# Guestbook Sample
3
" https://github.com/st-tu-dresden/guestbook
![Page 4: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/4.jpg)
Goals of Frameworks
4
![Page 5: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/5.jpg)
1. Separation of concerns 2. Raising the abstraction level 3. Removal of boilerplate code
5
![Page 6: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/6.jpg)
Spring Framework
6
![Page 7: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/7.jpg)
1. Dependency Injection 2. Portable service abstraction
7
![Page 8: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/8.jpg)
Dependency Injection
8
![Page 9: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/9.jpg)
About constructing a net of objects…
9
![Page 10: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/10.jpg)
10
class MyService {
void someBusinessMethod() { !// MyRepository.save(…) ? } }
class MyRepository {
MyEntity save(MyEntity entity) { … } }
How do we establish
this relationship?
![Page 11: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/11.jpg)
11
class MyService {
private final MyRepository repo;
void someBusinessMethod() { repo.save(new MyEntity()); } }
class MyRepository {
MyEntity save(MyEntity entity) { … } }
![Page 12: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/12.jpg)
12
class MyService {
private final MyRepository repo;
MyService() { … !// ? }
void someBusinessMethod() { repo.save(new MyEntity()); } }
class MyRepository {
MyEntity save(MyEntity entity) { … } }
How do we obtain a
repository instance?
![Page 13: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/13.jpg)
13
class MyService {
private final MyRepository repo;
MyService(MyRepository repo) { this.repo = repo }
void someBusinessMethod() { repo.save(new MyEntity()); } }
class MyRepository {
MyEntity save(MyEntity entity) { … } }
![Page 14: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/14.jpg)
14
class MyService {
private final MyRepository repo;
MyService(MyRepository repo) { this.repo = repo }
void someBusinessMethod() { repo.save(new MyEntity()); } }
interface MyRepository { MyEntity save(MyEntity entity); }
class JpaRepository implements MyRepository {
@Override MyEntity save(MyEntity entity) { … } }
![Page 15: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/15.jpg)
15
![Page 16: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/16.jpg)
16
![Page 17: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/17.jpg)
Manual dependency injection 17
!// For production MyRepository repository = new JpaRepository(); MyService service = new MyService(repository);
!// For tests MyRepository repository = new DummyRepository(); MyService service = new MyService(repository);
Different implementationsfor production and test!
![Page 18: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/18.jpg)
Dependency Injection allows to select the actual implementationat construction time.
18
![Page 19: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/19.jpg)
Spring-based Dependency Injection 19
@Component class MyService { MyService(MyRepository repository) { … } }
@Component class JpaRepository implements MyRepository { … }
!// For production ApplicationContext context = new AnnotationConfigApplicationContext(); MyService service = context.getBean(MyService.class);
Declare classes as framework components
Bootstrapframework
![Page 20: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/20.jpg)
Portable Service Abstraction
20
![Page 21: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/21.jpg)
Transactions Security
…
21
![Page 22: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/22.jpg)
Transactions
22
![Page 23: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/23.jpg)
Declarative transactions 23
class JpaRepository implements MyRepository {
@Override @Transactional MyEntity save(MyEntity entity) {
} }
The magic happens here!
![Page 24: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/24.jpg)
Proxy creation 24
!// Wrapping a component into a transactional proxy
JpaRepository repository = new JpaRepository();
ProxyFactory factory = new ProxyFactory(repository); factory.addAdvice(new TransactionInterceptor(…));
MyRepository proxy = factory.getProxy(); MyService service = new MyService(proxy);
![Page 25: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/25.jpg)
Runtime component setup 25
User code
Spring-provided
![Page 26: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/26.jpg)
Proxy invocation flow 26
User code Spring-provided
![Page 27: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/27.jpg)
Spring MVC
27
![Page 28: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/28.jpg)
Spring MVC Controller 28
class MyController {
}
![Page 29: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/29.jpg)
Spring MVC Controller 29
@RestController class MyController {
}
Declares what
kind of class that is
![Page 30: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/30.jpg)
Spring MVC Controller 30
@RestController class MyController {
String sayHelloTo( ) { } }
![Page 31: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/31.jpg)
Spring MVC Controller 31
@RestController class MyController {
@GetMapping("/hello") String sayHelloTo(@RequestParam Optional<String> name) { } }
Which URI to map to?
![Page 32: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/32.jpg)
Spring MVC Controller 32
@RestController class MyController {
@GetMapping("/hello") String sayHelloTo(@RequestParam Optional<String> name) { } }
What parts of the request
are we interested in?
![Page 33: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/33.jpg)
Spring MVC Controller 33
@RestController class MyController {
@GetMapping("/hello") String sayHelloTo(@RequestParam Optional<String> name) { return String.format("Hello, %s!", name.orElse("world")); } }
![Page 34: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/34.jpg)
Using Frameworks
34
![Page 35: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/35.jpg)
Reuse VS. Coupling
35
![Page 36: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/36.jpg)
Java and the Enterprise
36
![Page 37: Spring - A Java application frameworkstatic.olivergierke.de/lectures/spring/spring-a-java... · 2019-06-03 · Removal of boilerplate code 5. Spring Framework 6. 1. Dependency Injection](https://reader034.vdocuments.us/reader034/viewer/2022042220/5ec664f082720d70de4230b0/html5/thumbnails/37.jpg)
1. Security of investment 2. Backwards compatibility 3. Availability of support
37