39
Spring Petr Kˇ remen KBSS FEL ˇ CVUT Winter Term 2020 Petr Kˇ remen (KBSS FEL ˇ CVUT) Spring Winter Term 2020 1 / 39

Spring - cvut.cz

  • Upload
    others

  • View
    12

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Spring - cvut.cz

Spring

Petr Kremen

KBSS FEL CVUT

Winter Term 2020

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 1 / 39

Page 2: Spring - cvut.cz

Contents

1 Business Logic

2 Dependency Injection

3 Spring Container Features

4 Spring 5

5 Spring Modules

6 Spring Boot

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 2 / 39

Page 3: Spring - cvut.cz

Business Logic

Business Logic

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 3 / 39

Page 4: Spring - cvut.cz

Business Logic

Spring and Java EE

Job Trends by indeed.com

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 4 / 39

Page 5: Spring - cvut.cz

Business Logic

Spring Framework Highlights

pros

Dependency Injection

Convention over Configuration

Many Components for desk-top/web/enterpriseapplicationdevelopment

Modular , i.e., individualSpring componentscan be used andcombined withother frameworks

Open-Source, POJO-Based

cons

Not part of the Java EE stack

Examples

Examples from this lecture canbe found athttps://gitlab.fel.cvut.cz/ear/spring-example.

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 5 / 39

Page 6: Spring - cvut.cz

Business Logic

Spring and EJB

Both technologies provide enterprise container with DI, IoC,transactions and other relevant features

EJB is a part of Java EE stack, it is a standard, supportinghigh-availability, clustering

Spring is a feature-rich alternative to EJB with many extensions cf.EJB, e.g. @Configurable

A comparison is at https://dzone.com/articles/spring-boot-or-jakarta-ee-whats-better

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 6 / 39

Page 7: Spring - cvut.cz

Dependency Injection

Dependency Injection

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 7 / 39

Page 8: Spring - cvut.cz

Dependency Injection

Dependency Injection Reminder

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.

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 8 / 39

Page 9: Spring - cvut.cz

Dependency Injection

DI using XMLSchoolInformationSystem.java

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

public class SchoolInformationSystem {private 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 ...

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

}

application-config.xml

<?xml version="1.0" encoding="UTF-8"?><beans ...><bean id="SchoolInformationSystem"

class="cz.cvut.kbss.ear.spring_example.SchoolInformationSystem"scope="singleton">

<property name="repository" ref="CourseRepository"/></bean><bean id="CourseRepository"

class="cz.cvut.kbss.ear.spring_example.InMemoryCourseRepository"></bean>

</beans>

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 9 / 39

Page 10: Spring - cvut.cz

Dependency Injection

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"; }

}

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 10 / 39

Page 11: Spring - cvut.cz

Dependency Injection

Dependency Injection (DI) and Inversion of Control (IoC)

Dependency Injection

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

Inversion of Control

The programmed application is a “library” for the generic framework thatcontrols the application lifecycle.

Hollywood Principle

Don’t call us, we’ll call you.

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 11 / 39

Page 12: Spring - cvut.cz

Dependency Injection

Dependency Injection

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 12 / 39

Page 13: Spring - cvut.cz

Dependency Injection

Inversion of Control

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 13 / 39

Page 14: Spring - cvut.cz

Dependency Injection

Related Dependency Technologies

Dependency Injection for Java (JSR 330)

Dependency mechanism(partially) implemented in Spring

∈ Java EE Web Profile

Context Dependency Injection (CDI) (JSR 299)

Definition of bean scopesNot implemented in Spring

∈ Java EE Web Profile

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 14 / 39

Page 15: Spring - cvut.cz

Dependency Injection

DI with JSR 330 annotations and bean disambiguation

JSR 330: Dependency Injection for Java

is a part of Java EE Web Profile. Spring supports JSR 330 annotations.

SchoolInformationSystem.java

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

@Namedpublic class SchoolInformationSystem {@Injectprivate 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 ...

@Namedpublic class InMemoryCourseRepositoryimplements CourseRepository {public String getName() { return "In-memorycourse repository"; }

}

AnotherInMemoryCourseRepository.java

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

@Named("repository")public class AnotherInMemoryCourseRepositoryimplements CourseRepository {public String getName() { return "AnotherIn-memory course repository"; }

}

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 15 / 39

Page 16: Spring - cvut.cz

Dependency Injection

Spring Bean Scopes

singleton a single bean instance per Spring IoC container

prototype a new bean instance each time when requested

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

global HTTP session

A session shared accross multiple portlets in a portlet application.

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

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 16 / 39

Page 17: Spring - cvut.cz

Dependency Injection

Spring Bean Scopes – Prototype

SchoolInformationSystem.java

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

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

@Autowiredprivate CourseRepositorysecondRepository;

...

public static void main(String[] args) {...// injected SchoolInformationSystem s;System.out.println(s.repository == s.secondRepository

);}

}

CourseRepository.java

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

}

AnotherInMemoryCourseRepository.java

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

@Component("repository")@Scope("prototype")public class AnotherInMemoryCourseRepositoryimplements CourseRepository {public String getName() { return "AnotherIn-memory course repository"; }

}

prints “false”

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 17 / 39

Page 18: Spring - cvut.cz

Dependency Injection

Spring Bean Scopes – Singleton

SchoolInformationSystem.java

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

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

@Autowiredprivate CourseRepositorysecondRepository;

...

public static void main(String[] args) {...// injected SchoolInformationSystem s;System.out.println(s.repository == s.secondRepository

);}

}

CourseRepository.java

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

}

AnotherInMemoryCourseRepository.java

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

@Component("repository")@Scope("singleton")public class AnotherInMemoryCourseRepositoryimplements CourseRepository {public String getName() { return "AnotherIn-memory course repository"; }

}

prints “true”

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 18 / 39

Page 19: Spring - cvut.cz

Dependency Injection

Dependency Injection MechanismsConstructor injection

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

@Componentpublic class SchoolInformationSystem {

private CourseRepository repository;

@AutowiredpublicSchoolInformationSystem(CourseRepositoryrepository) {

this.repository = repository;}

}

Field injection

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

@Componentpublic class SchoolInformationSystem {

@Autowiredprivate CourseRepository repository;

}

Setter injection

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

@Componentpublic class SchoolInformationSystem {

private CourseRepository repository;

@Autowiredpublic void setRepository(CourseRepositoryrepository) {

this.repository = repository;}

}

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 19 / 39

Page 20: Spring - cvut.cz

Dependency Injection

Dependency management for non-Spring objects

Sometimes Spring cannot manage bean lifecycle, but needs to injectinto it

Objects of other frameworks need not be ready for being managed bySpringJPA entities – based on OO paradigm, objects should encapsulate bothstate and operations

Annotation @Configurable denotes classes, objects of which arenot managed by Spring, yet can inject Spring-managed objects

Byte-code instrumentation (aspect weaving)

Load-time weaving (java agent)Compile-time weaving (aspect compiler)

Same mechanism used for declarative transactions (see later)

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 20 / 39

Page 21: Spring - cvut.cz

Dependency Injection

@Configurable – Example

@Configurable@Entitypublic class User {

@Column(length=40, nullable=false)private String password;

@Column(length=40, nullable=false)private String salt;

@Autowiredprivate transient HashProvider provider;...public void setPassword(String password) {this.password = provider.computeHash(password + salt + "/* long string */");

}}

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 21 / 39

Page 22: Spring - cvut.cz

Spring Container Features

Spring Container Features

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 22 / 39

Page 23: Spring - cvut.cz

Spring Container Features

Declarative Transactions@Componentpublic class UserService {

@Autowiredprivate UserDao userDao;

@Transactional(readOnly=true)public List<UserDTO> findAll() {

// implementation}

@Transactionalpublic UserDTO persist(UserDTO user, String password) {

// implementation}

@Transactional(readOnly=true)public UserDTO findByUsername(String name) {

// implementation}

// Other methods}

Transactions configurable through XML/annotations

Global/local transactions

Wraps multiple transaction APIs – JDBC, JTA, JPA, ...

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 23 / 39

Page 24: Spring - cvut.cz

Spring Container Features

Transaction Flow

Source:docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 24 / 39

Page 25: Spring - cvut.cz

Spring Container Features

Transaction Propagation

We can control, whether and how the transactional execution of themethod should be supported

@Transactional(propagation=...

MANDATORY

NESTED

NEVER

NOT SUPPORTED

REQUIRED – default

REQUIRES NEW

SUPPORTS

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 25 / 39

Page 26: Spring - cvut.cz

Spring Container Features

Other Transaction Attributes

isolation – transaction isolation level

rollbackFor (and other similar) – which exception hierarchiescause rollback (RuntimeException and Error by default)

readOnly – true/false – readonly transactions can be optimized inruntime

timeout

transactionManager

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 26 / 39

Page 27: Spring - cvut.cz

Spring Container Features

Distributed Transactions

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 27 / 39

Page 28: Spring - cvut.cz

Spring Container Features

Spring and Persistence

1 Use standard JPA configuration through persistence.xml andload it by Spring

Reuse of existing configurationTwo XML configuration types

2 Configure JPA using Spring

One type of XML configuration/annotationsOne more dependency on Spring...

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 28 / 39

Page 29: Spring - cvut.cz

Spring Container Features

JPA Configuration@Configuration@PropertySources({@PropertySource("classpath:jpa.properties"),@PropertySource("classpath:jdbc.properties")})

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

@Autowiredprivate final Environment environment;

@Beanpublic DataSource dataSource() {

final BoneCPDataSource ds = new BoneCPDataSource();ds.setDriverClass(environment.getRequiredProperty("jdbc.driverClassName"));ds.setJdbcUrl(environment.getRequiredProperty("jdbc.url"));ds.setUsername(environment.getRequiredProperty("jdbc.username"));ds.setPassword(environment.getRequiredProperty("jdbc.password"));return ds;

}

@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource ds) {

final LocalContainerEntityManagerFactoryBean emf = newLocalContainerEntityManagerFactoryBean();

emf.setDataSource(ds);emf.setJpaVendorAdapter(new EclipseLinkJpaVendorAdapter());emf.setPackagesToScan("cz.cvut.kbss.ear.eshop.model");

final Properties props = new Properties();props.setProperty("databasePlatform", environment.getRequiredProperty("jpa.platform"));emf.setJpaProperties(props);return emf;

}

@Bean(name = "txManager")JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {

JpaTransactionManager transactionManager = new JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactory);return transactionManager;

}}

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 29 / 39

Page 30: Spring - cvut.cz

Spring Container Features

Security

@Transactionalpublic class UserService {

@Autowiredprivate UserDao dao;

@Secured("ROLE_ADMIN")public void persist(UserDto user, String password, Boolean isAdmin) {

// Implementation}

@Secured("ROLE_ADMIN")public void removeById(Long id) {

// Implementation}

}

Method access control using annotations

More on this in weeks 7 and 10

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 30 / 39

Page 31: Spring - cvut.cz

Spring 5

Spring 5

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 31 / 39

Page 32: Spring - cvut.cz

Spring 5

Spring 5 Features

Built on Java SE 8, Java EE 7

@Nullable and @NotNull – compile time validation of null values

Kotlin support – functional programming (web endpoints/beanregistration).

Reactive programming – “async logic without callbacks” (WebFlux)

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 32 / 39

Page 33: Spring - cvut.cz

Spring Modules

Spring Modules

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 33 / 39

Page 34: Spring - cvut.cz

Spring Modules

Spring Landscape

source: Spring documentation,docs.spring.io/spring/docs/current/spring-framework-reference/html/overview.html

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 34 / 39

Page 35: Spring - cvut.cz

Spring Modules

Selected Spring Modules

Spring Core framework core

Spring ORM JPA integration and ORM

Spring MVC MVC web framework, REST controllers

Spring Test testing support

Spring Security application security support

Spring Data access to data – paging, filtering, map-reduce

Spring Integration enterprise integration patterns – gateways, channels,adapters

Spring Boot

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 35 / 39

Page 36: Spring - cvut.cz

Spring Boot

Spring Boot

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 36 / 39

Page 37: Spring - cvut.cz

Spring Boot

Spring Boot

Spring module for rapid standalone application development

Greatly simplifies configuration and deployment

Taking convention over configuration to the next level

Composed annotations group common annotationsSensible configuration defaultsAutomatic classpath scan for beansPackage as jar for simple startup – embedded application server(Tomcat or Jetty) for web applications

Externalized configuration – application.properties

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 37 / 39

Page 38: Spring - cvut.cz

Spring Boot

Spring Boot II

To simplify configuration even more, starter projects containingcommon dependencies are provided

spring-boot-starter-parent – parent Maven projectspring-boot-starter-data-jpaspring-boot-starter-webspring-boot-starter-security...

Test extensions allowing to isolate tested components

@DataJpaTest, @SpringBootTest

Automatic creation of default beans

@ConditionalOnMissingBeanObjectMapper, DataSource, TransactionManagerTestRestTemplate for tests

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 38 / 39

Page 39: Spring - cvut.cz

Spring Boot

Resources

Spring homehttps://spring.io/

Spring Framework – Documentationhttps://docs.spring.io/spring/docs/current/spring-framework-reference/index.html

Spring Boot – Documentationhttps://docs.spring.io/spring-boot/docs/current/reference/html/

Spring (WPA lecture)https://cw.fel.cvut.cz/wiki/_media/courses/a7b39wpa/spring1.pdf

Petr Kremen (KBSS FEL CVUT) Spring Winter Term 2020 39 / 39