SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov,...

31
Spring Miroslav Blaˇ sko, Bogdan Kostov, Martin Ledvinka KBSS FEL CTU in Prague Winter Term 2020 Miroslav Blaˇ sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague) Spring Winter Term 2020 1 / 29

Transcript of SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov,...

Page 1: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka

KBSS FEL CTU in Prague

Winter Term 2020

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 1 / 29

Page 2: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Contents

1 Introduction

2 Dependency Injection - Revisited

3 Spring Beans

4 Spring Transaction ManagementProxy Design Pattern

5 Other Commonly Used Spring FeaturesDemo E-Shop Application

6 Tasks

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 2 / 29

Page 3: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Introduction

Introduction

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 3 / 29

Page 4: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Introduction

Seminar Topic

In this seminar we will learn to use Spring’s:

Dependency Injection (DI) functionality

Transaction management

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 4 / 29

Page 5: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Dependency Injection - Revisited

Dependency Injection - Revisited

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 5 / 29

Page 6: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Dependency Injection - Revisited

Definition and Sequence Example

Dependency Injection

Component lifecycle is controlled by the container which is responsible fordelivering correct implementation of the given dependency.

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 6 / 29

Page 7: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Dependency Injection - Revisited

Plain Java code vs DI

package cz.cvut.kbss.ear.spring_example;import ...

public class SchoolInformationSystem {

private CourseRepository repository= new InMemoryCourseRepository();

public static void main(String[] args) {SchoolInformationSystem main = new SchoolInformationSystem();System.out.println(main.repository.getName());

}}

The client code (SchoolInformationSystem) itself decides whichrepository implementation to use

change in implementation requires client code change.

change in configuration requires client code change.

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 7 / 29

Page 8: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Dependency Injection - Revisited

DI using Annotations

SchoolInformationSystem.java

package cz.cvut.kbss.ear.spring_example;import ...

@Componentpublic class SchoolInformationSystem {@Autowiredprivate CourseRepository repository;

}

CourseRepository.java

package cz.cvut.kbss.ear.spring_example;public interface CourseRepository {public String getName() { return name; }

}

InMemoryCourseRepository.java

package cz.cvut.kbss.ear.spring_example;import ...

@Componentpublic class InMemoryCourseRepositoryimplements CourseRepository {public String getName() { return"In-memory course repository"; }

}

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 8 / 29

Page 9: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Beans

Spring Beans

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 9 / 29

Page 10: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Beans

Bean Declaration

Bean declaration tells Spring from which classes to create beans. We willlearn about two ways of bean declaration:

Bean creation through annotated classes

Bean creation with a factory method

Spring needs to know where to look for bean declarations. With SpringBoot, it scans the package of the main application class and all itssub-packages.

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 10 / 29

Page 11: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Beans

Bean Declaration - Annotated Class

A bean can be declared using annotation on a class. Annotations used fordeclaration of beans in this way are:

@Component

@Configuration

@Repository

@Service

etc.

Code example:

package cz.cvut.kbss.ear.spring_example;import ...

@Componentpublic class InMemoryCourseRepository implements CourseRepository {public String getName() { return "In-memory course repository"; }

}

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 11 / 29

Page 12: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Beans

Bean Declaration - Factory method

A bean factory method should be implemented in a configuration bean.The method should be annotated with the @Bean annotation and it shouldreturn the bean. The method’s parameters will be injected if possible.Code example:

@Configuration // is this a bean? Yes it is.public class RepositoryConfiguration{@Beanpublic InMemoryCourseRepository createInMemoryRepository() {return new InMemoryCourseRepository();}

}

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 12 / 29

Page 13: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Beans

Spring Bean Scopes

Scopes define the life cycle of a bean

singleton a single bean instance per Spring IoC container (the defaultscope)

prototype a new bean instance each time when requested (e.g. injectedduring creation of another bean)

request a single bean instance per HTTP request

session a single bean instance per HTTP session

globalSession a single bean instance per global HTTP session

Code example specifying the scope of a bean:

@Component@Scope("singleton")public class SchoolInformationSystem {@Autowiredprivate CourseRepository repository;

}

Spring allows custom scope definition (e.g. JSF 2 Flash scope)

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29

Page 14: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Beans

Bean Injection

During creation, beans are injected with the declared dependencies (mustbe also beans). To declare a dependency in Spring use the annotation:

@Autowired

Code example:

package cz.cvut.kbss.ear.spring_example;import ...

@Componentpublic class SchoolInformationSystem {@Autowiredprivate CourseRepository repository;

}

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 14 / 29

Page 15: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Beans

Injecting Entity Manager

The entity manager is injected using the @PersistenceContextannotation (JPA).Code example:

@Repositorypublic class CartDao {@PersistenceContextprivate EntityManager em;...

}

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 15 / 29

Page 16: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Transaction Management

Spring Transaction Management

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 16 / 29

Page 17: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Transaction Management

Transaction Management Annotations

Spring provides means to declaratively manage business transactions.The following annotations work in conjunction with JPA.

@Transactional - on methods and classes, wraps a method in atransaction

@EnableTransactionManagement - enabling declarativetransaction support, enabled by default in Spring Boot

Code example:

@Servicepublic class CartService {@Transactionalpublic void addItem(Cart cart, CartItem toAdd) {...

}}

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 17 / 29

Page 18: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Transaction Management Proxy Design Pattern

Proxy Design Pattern

Question Is the class of CartService bean CartService?

Answer No, it is not. It is a subclass of CartService.

Proxy Design Pattern

Spring implements transaction management using the Proxy DesignPattern on beans. The CartService is sub-classed in the backgroundto enable wrapping transactional method calls with code managing thetransactions.

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 18 / 29

Page 19: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Transaction Management Proxy Design Pattern

Proxy Design Pattern

Question Is the class of CartService bean CartService?

Answer No, it is not. It is a subclass of CartService.

Proxy Design Pattern

Spring implements transaction management using the Proxy DesignPattern on beans. The CartService is sub-classed in the backgroundto enable wrapping transactional method calls with code managing thetransactions.

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 18 / 29

Page 20: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Transaction Management Proxy Design Pattern

Proxy Design Pattern

Question Is the class of CartService bean CartService?

Answer No, it is not. It is a subclass of CartService.

Proxy Design Pattern

Spring implements transaction management using the Proxy DesignPattern on beans. The CartService is sub-classed in the backgroundto enable wrapping transactional method calls with code managing thetransactions.

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 18 / 29

Page 21: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Spring Transaction Management Proxy Design Pattern

Proxy Design Pattern - Java Code Example

Calculator.java

public class Calculator{public int add(int a, int b){return a + b;

}

public int subtract(int a, int b){return a - b;

}}

CalculatorLoggerProxy.java

public class CalculatorLoggerProxy extendsCalculator{private static final Logger LOG ...@Overridepublic int add(int a, int b){int ret = super.add(a,b);LOG.debug("{} + {} = {}", a, b, ret);return ret;

}

@Overridepublic int subtract(int a, int b){int ret = super.subtract(a,b);LOG.debug("{} - {} = {}", a, b, ret);return ret;

}}

Some observations:

CalculatorLoggerProxy is also a Calculator

Extends execution by adding pre- and post-processing code

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 19 / 29

Page 22: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Other Commonly Used Spring Features

Other Commonly Used SpringFeatures

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 20 / 29

Page 23: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Other Commonly Used Spring Features

Annotation based Spring Configuration

@ComponentScan searching for Spring beans among classes in agiven package

@ComponentScan without argument scans the current package andall its sub-packages

@Import composing Spring configuration

Searching for beans:

@Configuration@ComponentScan(basePackages = "cz.cvut.kbss.ear.eshop.dao")public class PersistenceConfig {...}

Importing configuration:

@Configuration@Import( {PersistenceConfig.class})public class AppConfig {...}

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 21 / 29

Page 24: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Other Commonly Used Spring Features Demo E-Shop Application

Spring Configuration in E-shop

The E-Shop application is implemented using Spring Boot, which hasmany benefits over plain Spring:

Provides a single Maven dependency which includes profiles ofdifferent spring packages commonly used together

Provides a simpler Maven build configuration

A Maven plugin which builds the application into a JAR with anembedded application server for rapid deployment

Requires minimal application configuration compared to Spring

Contains a lot of sensible defaults which just work in most cases

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 22 / 29

Page 25: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Tasks

Tasks

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 23 / 29

Page 26: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Tasks

Syncing Your Fork

1 Make sure your local copy git repository is configured correctly and allchanges are committed (git status - your branch is up to date,nothing to commit).

2 Fetch branches and commits from the upstream repository(EAR/B201-eshop)

git fetch upstream

3 Check out local branch corresponding to the task branch

git checkout -b b201-seminar-05-task

4 Merge changes from the corresponding upstream branch

git merge upstream/b201-seminar-05-task

5 Do your task6 Push the solution to your fork

git push origin b201-seminar-05-task

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 24 / 29

Page 27: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Tasks

Task 1 – Configuration of Persistence Layer (1 point)

1 Declare missing bean declarations and injections.

Some of the classes in the dao package should be declared as beansbut they are not. Declared them properly.In the dao package, there is also one dependency injection which notis declared properly. Fix it.Hint: @Repository, @PersistenceContext

2 Create a prototype bean of type java.util.Date.

Hint: @Configuration, @Bean

Hint: Use tests to help you debug the issues.

Acceptance criteria: All enabled tests are passing.

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 25 / 29

Page 28: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

Tasks

Task 2 – Implementation of a Service (1 point)

1 Remove @Ignore annotation from CartServiceTest and verifythat tests are now failing

2 Implement CartService that allows to

Add specific items to a cartRemove specific items from a cartAmount of products available in stock is correctly adjusted after everyadd/remove operationCartService class must be declared as a Spring beanInject beans necessary to implement the service methods (DAO)

3 Make sure that service methods are transactional

4 Hint: @Service

5 Acceptance criteria: Transactional processing is configured properlyand all tests are passing.

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 26 / 29

Page 29: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

The End

The End

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 27 / 29

Page 30: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

The End

The End

Thank You

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 28 / 29

Page 31: SpringSpring allows custom scope de nition (e.g. JSF 2 Flash scope) Miroslav Bla sko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 13 / 29 Spring

The End

Resources

https://docs.spring.io/spring-boot/docs/current/reference/html/

Miroslav Blasko, Bogdan Kostov, Martin Ledvinka (KBSS FEL CTU in Prague)Spring Winter Term 2020 29 / 29