vaadin 8 with spring frameworks autoconfiguration

Post on 22-Jan-2018

797 Views

Category:

Software

7 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

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

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.

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.

T L ; D R

public interface MainMenu { … }

T L ; D R

public interface MainMenu { … }

public class DefaultMainMenu implements MainMenu { … }

T L ; D R

public interface MainMenu { … }

public class DefaultMainMenu implements MainMenu { … }

public class ResponsiveMainMenu implements MainMenu { … }

T L ; D R

public interface MainMenu { … }

public class DefaultMainMenu implements MainMenu { … }

public class ResponsiveMainMenu implements MainMenu { … }

@Autowiredprivate MainMenu mainMenu;

W h y ?

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

H o w ?

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

@SpringComponentpublic class DefaultMainMenu implements MainMenu { … }

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

@Autowiredprivate MainMenu mainMenu;

@Autowiredprivate ObjectProvider<MainMenu> menuProvider;

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

@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

S o ?

• Ability to test if bean exists• Runtime configurability

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

}

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

private MainMenu mainMenu;

public AppViewDisplay() { }}

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

private MainMenu mainMenu;

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

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

private MainMenu mainMenu;

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

@SpringViewDisplaypublic class AppViewDisplay implements ViewDisplay {

@Autowired(required = false) private MainMenu mainMenu;

}

@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

@Autowiredprivate ObjectProvider<MainMenu> menuProvider;

menuProvider.getObject(Object… params);

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

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

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

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

@Configurationpublic class MainMenuConfiguration {

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

D e f i n e B e a n

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

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

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

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

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

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

@Configuration@EnableVaadin

static class EnableVaadinConfiguration {

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

@Configurationpublic class VaadinConfiguration {

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

Session’s content

• Super brief DI recap

• Defining and @Autowiring a Bean

• @Configuration Bean and auto-configuration

• Generics support

@Autowiredprivate List<String> autowiredStrings;

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

@Autowiredprivate List<Integer> autowiredIntegers;

@Configurationpublic class MyConfiguration {

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

@Configurationpublic class MyConfiguration {

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

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

@Autowiredprivate Grid<DTO> dataGrid;

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

@Configurationpublic class GridConfiguration {

@Configurationpublic class GridConfiguration {

public Grid provideDataGrid() {

@Configurationpublic class GridConfiguration {

@Bean @PrototypeScope public Grid provideDataGrid() {

@Configurationpublic class GridConfiguration {

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

@Configurationpublic class GridConfiguration {

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

@Configurationpublic class GridConfiguration {

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

@Configurationpublic class GridConfiguration {

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

ResolvableType rt = dd.getResolvableType();

@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);

@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();

@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); }

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

@Autowiredprivate Grid<Customer> customerGrid;

@Autowiredprivate Grid<Transaction> transactionGrid;

@Autowiredprivate Grid<Invoice> invoiceGrid;

T H A N K Y O U !

PLEASE GIVE SOME FEEDBACK!

@peter_lehto

top related