Lecture 04 Spring S
Lecture 04 Spring S
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 1 / 39
Contents
1 Business Logic
2 Dependency Injection
4 Spring 5
5 Spring Modules
6 Spring Boot
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 2 / 39
Business Logic
Business Logic
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 3 / 39
Business Logic
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 4 / 39
Business Logic
pros cons
Dependency Injection Not part of the Java EE stack
Convention over Configuration
Examples
Many Components for desk-
top/web/enterprise Examples from this lecture can
application be found at
development https://gitlab.fel.cvut.
cz/ear/spring-example.
Modular , i.e., individual
Spring components
can be used and
combined with
other frameworks
Open-Source, POJO-Based
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 5 / 39
Business Logic
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 6 / 39
Dependency Injection
Dependency Injection
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 7 / 39
Dependency Injection
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 8 / 39
Dependency Injection
DI using XML
SchoolInformationSystem.java InMemoryCourseRepository.java
package cz.cvut.kbss.ear.spring_example; package cz.cvut.kbss.ear.spring_example;
import ... import ...
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 Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 9 / 39
Dependency Injection
DI using Annotations
SchoolInformationSystem.java InMemoryCourseRepository.java
package cz.cvut.kbss.ear.spring_example; package cz.cvut.kbss.ear.spring_example;
import ... import ...
@Component @Component
public class SchoolInformationSystem { public class InMemoryCourseRepository
@Autowired implements CourseRepository {
private CourseRepository repository; public String getName() { return
} "In-memory course repository"; }
}
CourseRepository.java
package cz.cvut.kbss.ear.spring_example;
public interface CourseRepository {
public String getName() { return name; }
}
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 10 / 39
Dependency Injection
Dependency Injection
Component lifecycle is controlled by the container which is responsible for
delivering correct implementation of the given bean.
Inversion of Control
The programmed application is a “library” for the generic framework that
controls the application lifecycle.
Hollywood Principle
Don’t call us, we’ll call you.
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 11 / 39
Dependency Injection
Dependency Injection
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 12 / 39
Dependency Injection
Inversion of Control
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 13 / 39
Dependency Injection
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 14 / 39
Dependency Injection
SchoolInformationSystem.java InMemoryCourseRepository.java
package cz.cvut.kbss.ear.spring_example; package cz.cvut.kbss.ear.spring_example;
import ... import ...
@Named @Named
public class SchoolInformationSystem { public class InMemoryCourseRepository
@Inject implements CourseRepository {
private CourseRepository repository; public String getName() { return "In-memory
course repository"; }
... }
}
AnotherInMemoryCourseRepository.java
CourseRepository.java
package cz.cvut.kbss.ear.spring_example;
package cz.cvut.kbss.ear.spring_example; import ...
public interface CourseRepository {
public String getName() { return name; } @Named("repository")
} public class AnotherInMemoryCourseRepository
implements CourseRepository {
public String getName() { return "Another
In-memory course repository"; }
}
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 15 / 39
Dependency Injection
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 16 / 39
Dependency Injection
prints “false”
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 17 / 39
Dependency Injection
prints “true”
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 18 / 39
Dependency Injection
@Component @Component
public class SchoolInformationSystem { public class SchoolInformationSystem {
@Autowired @Autowired
public public void setRepository(CourseRepository
SchoolInformationSystem(CourseRepository repository) {
repository) { this.repository = repository;
this.repository = repository; }
} }
}
Field injection
package cz.cvut.kbss.ear.spring_example;
import ...
@Component
public class SchoolInformationSystem {
@Autowired
private CourseRepository repository;
}
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 19 / 39
Dependency Injection
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 20 / 39
Dependency Injection
@Configurable – Example
@Configurable
@Entity
public class User {
@Column(length=40, nullable=false)
private String password;
@Column(length=40, nullable=false)
private String salt;
@Autowired
private transient HashProvider provider;
...
public void setPassword(String password) {
this.password = provider.computeHash(
password + salt + "/* long string */");
}
}
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 21 / 39
Spring Container Features
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 22 / 39
Spring Container Features
Declarative Transactions
@Component
public class UserService {
@Autowired
private UserDao userDao;
@Transactional(readOnly=true)
public List<UserDTO> findAll() {
// implementation
}
@Transactional
public UserDTO persist(UserDTO user, String password) {
// implementation
}
@Transactional(readOnly=true)
public UserDTO findByUsername(String name) {
// implementation
}
// Other methods
}
Transaction Flow
Source:
docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/html/transaction.html
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 24 / 39
Spring Container Features
Transaction Propagation
MANDATORY
NESTED
NEVER
NOT SUPPORTED
REQUIRED – default
REQUIRES NEW
SUPPORTS
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 25 / 39
Spring Container Features
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 26 / 39
Spring Container Features
Distributed Transactions
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 27 / 39
Spring Container Features
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 28 / 39
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 {
@Autowired
private final Environment environment;
@Bean
public 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;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource ds) {
final LocalContainerEntityManagerFactoryBean emf = new
LocalContainerEntityManagerFactoryBean();
emf.setDataSource(ds);
emf.setJpaVendorAdapter(new EclipseLinkJpaVendorAdapter());
emf.setPackagesToScan("cz.cvut.kbss.ear.eshop.model");
Security
@Transactional
public class UserService {
@Autowired
private UserDao dao;
@Secured("ROLE_ADMIN")
public void persist(UserDto user, String password, Boolean isAdmin) {
// Implementation
}
@Secured("ROLE_ADMIN")
public void removeById(Long id) {
// Implementation
}
}
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 30 / 39
Spring 5
Spring 5
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 31 / 39
Spring 5
Spring 5 Features
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 32 / 39
Spring Modules
Spring Modules
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 33 / 39
Spring Modules
Spring Landscape
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 34 / 39
Spring Modules
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 35 / 39
Spring Boot
Spring Boot
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 36 / 39
Spring Boot
Spring Boot
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 37 / 39
Spring Boot
Spring Boot II
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 38 / 39
Spring Boot
Resources
Spring home
https://spring.io/
Spring Framework – Documentation
https://docs.spring.io/spring/docs/current/
spring-framework-reference/index.html
Spring Boot – Documentation
https://docs.spring.io/spring-boot/docs/current/
reference/html/
Spring (WPA lecture)
https://cw.fel.cvut.cz/wiki/_media/courses/
a7b39wpa/spring1.pdf
Petr Křemen, Martin Ledvinka (KBSS FEL ČVUT) Spring Winter Term 2019 39 / 39