57
SPRING BEANS AND WIRES WITH VAADIN 8 AUTOMATIC CONFIGURATION AND GENERICS @peter_lehto

Vaadin 8 with Spring Frameworks AutoConfiguration

Embed Size (px)

Citation preview

Page 1: Vaadin 8 with Spring Frameworks AutoConfiguration

S P R I N G B E A N S A N D W I R E SW I T H VA A D I N 8

AUTOMATIC CONFIGURATION AND GENERICS

@peter_lehto

Page 2: Vaadin 8 with Spring Frameworks AutoConfiguration

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

Page 3: Vaadin 8 with Spring Frameworks AutoConfiguration

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

Page 4: Vaadin 8 with Spring Frameworks AutoConfiguration

Dependency Injection (DI) is a runtime mechanism where dependency between the client object and the dependent object does not occur directly.

Page 5: Vaadin 8 with Spring Frameworks AutoConfiguration

Dependency Injection (DI) is a runtime mechanism where dependency between the client object and the dependent object does not occur directly.

With DI the client object does not necessarily manage the lifecycle of the dependent object.

Page 6: Vaadin 8 with Spring Frameworks AutoConfiguration

Dependency Injection (DI) is a runtime mechanism where dependency between the client object and the dependent object does not occur directly.

With DI the client object does not necessarily manage the lifecycle of the dependent object.

Instead with DI a special DI container takes care of the object lifecycle management where clients reference managed and possibly shared objects.

Page 7: Vaadin 8 with Spring Frameworks AutoConfiguration

T L ; D R

public interface MainMenu { … }

Page 8: Vaadin 8 with Spring Frameworks AutoConfiguration

T L ; D R

public interface MainMenu { … }

public class DefaultMainMenu implements MainMenu { … }

Page 9: Vaadin 8 with Spring Frameworks AutoConfiguration

T L ; D R

public interface MainMenu { … }

public class DefaultMainMenu implements MainMenu { … }

public class ResponsiveMainMenu implements MainMenu { … }

Page 10: Vaadin 8 with Spring Frameworks AutoConfiguration

T L ; D R

public interface MainMenu { … }

public class DefaultMainMenu implements MainMenu { … }

public class ResponsiveMainMenu implements MainMenu { … }

@Autowiredprivate MainMenu mainMenu;

Page 11: Vaadin 8 with Spring Frameworks AutoConfiguration

W h y ?

Page 12: Vaadin 8 with Spring Frameworks AutoConfiguration

• Loose coupling• Dependency inversion• High Abstraction • Highly cohesive modules• Deployment time config

Page 13: Vaadin 8 with Spring Frameworks AutoConfiguration

H o w ?

Page 14: Vaadin 8 with Spring Frameworks AutoConfiguration

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

Page 15: Vaadin 8 with Spring Frameworks AutoConfiguration

@SpringComponentpublic class DefaultMainMenu implements MainMenu { … }

D e f i n i n g a B e a n

Page 16: Vaadin 8 with Spring Frameworks AutoConfiguration

@Autowiredprivate MainMenu mainMenu;

@Autowiredprivate ObjectProvider<MainMenu> menuProvider;

@ A u t o w i r i n g a B e a n

Page 17: Vaadin 8 with Spring Frameworks AutoConfiguration

@Autowiredprivate ObjectProvider<MainMenu> menuProvider;

…menuProvider.getIfAvailable();menuProvider.getIfUnique();menuProvider.getObject(Object… params);

@ A u t o w i r i n g a B e a n

Page 18: Vaadin 8 with Spring Frameworks AutoConfiguration

S o ?

Page 19: Vaadin 8 with Spring Frameworks AutoConfiguration

• Ability to test if bean exists• Runtime configurability

Page 20: Vaadin 8 with Spring Frameworks AutoConfiguration

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

}

Page 21: Vaadin 8 with Spring Frameworks AutoConfiguration

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

private MainMenu mainMenu;

public AppViewDisplay() { }}

Page 22: Vaadin 8 with Spring Frameworks AutoConfiguration

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

private MainMenu mainMenu;

@Autowired public AppViewDisplay(ObjectProvider<MainMenu> mmp) { }}

Page 23: Vaadin 8 with Spring Frameworks AutoConfiguration

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

private MainMenu mainMenu;

@Autowired public AppViewDisplay(ObjectProvider<MainMenu> mmp) { Optional.ofNullable(mmp.getIfAvailable()) .ifPresent(menu -> addComponent(menu)); }}

Page 24: Vaadin 8 with Spring Frameworks AutoConfiguration

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

@Autowired(required = false) private MainMenu mainMenu;

}

Page 25: Vaadin 8 with Spring Frameworks AutoConfiguration

@SpringComponentpublic class DefaultMainMenu implements MainMenu {

public DefaultMainMenu(A a, B b, String caption) { }}

D e f i n i n g a B e a n

Page 26: Vaadin 8 with Spring Frameworks AutoConfiguration

@Autowiredprivate ObjectProvider<MainMenu> menuProvider;

menuProvider.getObject(Object… params);

@ A u t o w i r i n g a B e a n

Page 27: Vaadin 8 with Spring Frameworks AutoConfiguration

• Specify explicit ctor args• Used when creating new instance• Will overwrite (possible) defaults

Page 28: Vaadin 8 with Spring Frameworks AutoConfiguration

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

Page 29: Vaadin 8 with Spring Frameworks AutoConfiguration

• Say we have an interface• And NON-bean implementation• Or require custom logic to run

Page 30: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class MainMenuConfiguration {

@Bean public MainMenu provideDefaultMenu { return new DefaultMainMenu(); }

D e f i n e B e a n

Page 31: Vaadin 8 with Spring Frameworks AutoConfiguration

• Similar to CDI’s producer method• Object created with “new”• But treated as bean! :)

Page 32: Vaadin 8 with Spring Frameworks AutoConfiguration

a n d t h e A u t o - c o n f i g ?

Page 33: Vaadin 8 with Spring Frameworks AutoConfiguration

• @Configuration• Loaded @Conditionally• defined in dependency meta-inf

Page 34: Vaadin 8 with Spring Frameworks AutoConfiguration

L e t ’ s h a v e a l o o k a tVa a d i n S p r i n g B o o t I n t e g r a t i o n

vaadin-spring-boot.2.0.0.rc1.jarMETA-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.vaadin.spring.boot.VaadinAutoConfiguration

Page 35: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configuration@ConditionalOnClass(SpringUI.class)public class VaadinAutoConfiguration {

Page 36: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configuration@ConditionalOnClass(SpringUI.class)public class VaadinAutoConfiguration {

@Configuration@EnableVaadin

static class EnableVaadinConfiguration {

Page 37: Vaadin 8 with Spring Frameworks AutoConfiguration

@Import(VaadinConfiguration.class)public @Interface EnableVaadin {

Page 38: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class VaadinConfiguration {

Page 39: Vaadin 8 with Spring Frameworks AutoConfiguration

• @EnableVaadin• @Import(VaadinConfiguration)• @EnableVaadinServlet• @Import(VaadinServletConfiguration)• @EnableConfigurationProperties

Page 40: Vaadin 8 with Spring Frameworks AutoConfiguration

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

Page 41: Vaadin 8 with Spring Frameworks AutoConfiguration

@Autowiredprivate List<String> autowiredStrings;

G e n e r i c s s u p p o r t

@Autowiredprivate List<Integer> autowiredIntegers;

Page 42: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class MyConfiguration {

@Bean public List<String> provideStringList { return Arrays.asList(“a”, “b”); }

Page 43: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class MyConfiguration {

@Bean public List<String> provideStringList { return Arrays.asList(“a”, “b”); }

@Bean public List<Integer> provideStringList { return Arrays.asList(1, 2, 3); }

Page 44: Vaadin 8 with Spring Frameworks AutoConfiguration

@Autowiredprivate Grid<DTO> dataGrid;

T y p e e r a s u r e ?

Page 45: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

Page 46: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

public Grid provideDataGrid() {

Page 47: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public Grid provideDataGrid() {

Page 48: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public <DTO> Grid<DTO> provideDataGrid() {

Page 49: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public <DTO> Grid<DTO> provideDataGrid (DependencyDescriptor dd) {

Page 50: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public <DTO> Grid<DTO> provideDataGrid (DependencyDescriptor dd) { Grid<DTO> grid = new Grid<DTO>();

Page 51: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public <DTO> Grid<DTO> provideDataGrid (DependencyDescriptor dd) { Grid<DTO> grid = new Grid<DTO>();

ResolvableType rt = dd.getResolvableType();

Page 52: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public <DTO> Grid<DTO> provideDataGrid (DependencyDescriptor dd) { Grid<DTO> grid = new Grid<DTO>();

ResolvableType rt = dd.getResolvableType(); ResolvableType genericType = rt.getGeneric(0);

Page 53: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public <DTO> Grid<DTO> provideDataGrid (DependencyDescriptor dd) { Grid<DTO> grid = new Grid<DTO>();

ResolvableType rt = dd.getResolvableType(); ResolvableType genericType = rt.getGeneric(0); Class<DTO> dtoType = genericType.resolve();

Page 54: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public <DTO> Grid<DTO> provideDataGrid (DependencyDescriptor dd) { Grid<DTO> grid = new Grid<DTO>();

ResolvableType rt = dd.getResolvableType(); ResolvableType genericType = rt.getGeneric(0); Class<DTO> dtoType = genericType.resolve();

configureGrid(grid, dtoType); }

Page 55: Vaadin 8 with Spring Frameworks AutoConfiguration

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public <DTO> Grid<DTO> provideDataGrid (DependencyDescriptor dd) { Grid<DTO> grid = new Grid<DTO>();

ResolvableType rt = dd.getResolvableType(); ResolvableType genericType = rt.getGeneric(0); Class<DTO> dtoType = genericType.resolve();

configureGrid(grid, dtoType); return grid; }

Page 56: Vaadin 8 with Spring Frameworks AutoConfiguration

@Autowiredprivate Grid<Customer> customerGrid;

@Autowiredprivate Grid<Transaction> transactionGrid;

@Autowiredprivate Grid<Invoice> invoiceGrid;

Page 57: Vaadin 8 with Spring Frameworks AutoConfiguration

T H A N K Y O U !

PLEASE GIVE SOME FEEDBACK!

@peter_lehto