536

Click here to load reader

DI Frameworks - hidden pearls

Embed Size (px)

Citation preview

Page 1: DI Frameworks - hidden pearls

prepare for…

DI - Frameworks..some hidden pearls

Page 2: DI Frameworks - hidden pearls

@SvenRuppert has been coding java since 1996

Head of R&D / Fellow

reply

Germany - Munich

2

Page 3: DI Frameworks - hidden pearls

@SvenRuppert has been coding java since 1996

3

Page 4: DI Frameworks - hidden pearls

@SvenRuppert has been coding java since 1996

Projects in the field of:•Automobile-industry•Energy•Finance / Leasing•Space- Satellit-•Government / UN / World-bank

Where?

•Europe•Asia - from India up to Malaysia

3

Page 5: DI Frameworks - hidden pearls

4

Save harbor statement

Page 6: DI Frameworks - hidden pearls

4

Save harbor statement

The following is intended for information purposes only. Ican not be held responsible for the overuse of effects andanimations in this presentation. If any person in this roomhas a medical condition that is triggered by fast movingobjects on the screen and/or explosions, he/she shouldprobably better leave now…

(I got carried away by the topic.)

Page 7: DI Frameworks - hidden pearls

5

The Basics @SvenRuppert

targets we want to reach

Page 8: DI Frameworks - hidden pearls

5

The Basics @SvenRuppert

targets we want to reach

divide a system into modules

Page 9: DI Frameworks - hidden pearls

5

The Basics @SvenRuppert

targets we want to reach

divide a system into modulesdecouple contract and implementations

Page 10: DI Frameworks - hidden pearls

5

The Basics @SvenRuppert

targets we want to reach

divide a system into modulesdecouple contract and implementations

decrease complexity

Page 11: DI Frameworks - hidden pearls

5

The Basics @SvenRuppert

targets we want to reach

divide a system into modulesdecouple contract and implementations

decrease complexity

but… lets start with the basics

Page 12: DI Frameworks - hidden pearls

6

The Basics @SvenRuppert

Page 13: DI Frameworks - hidden pearls

6

The Basics @SvenRuppert

public List<Data> execute() { //.... return result; }

Page 14: DI Frameworks - hidden pearls

6

The Basics @SvenRuppert

public List<Data> execute() { //.... return result; }

import java.util.List;

Page 15: DI Frameworks - hidden pearls

6

The Basics @SvenRuppert

public List<Data> execute() { //.... return result; }

import java.util.List;

final List<Data> result = new ArrayList<>();

Page 16: DI Frameworks - hidden pearls

6

The Basics @SvenRuppert

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

Page 17: DI Frameworks - hidden pearls

6

The Basics @SvenRuppert

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

if we don´t need a method like trimToSize()

Page 18: DI Frameworks - hidden pearls

6

The Basics @SvenRuppert

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

if we don´t need a method like trimToSize()

we want to get rid of the dep. ArrayList

Page 19: DI Frameworks - hidden pearls

6

The Basics @SvenRuppert

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

if we don´t need a method like trimToSize()

we want to get rid of the dep. ArrayList

Page 20: DI Frameworks - hidden pearls

7

The Basics @SvenRuppert

import java.util.List;import java.util.ArrayList;if we don´t need a method like trimToSize()

we want to get rid of the dep. ArrayListthis will lead to some questions

Page 21: DI Frameworks - hidden pearls

7

The Basics @SvenRuppert

import java.util.List;import java.util.ArrayList;if we don´t need a method like trimToSize()

we want to get rid of the dep. ArrayListthis will lead to some questions

what will be the right Implementation?

Page 22: DI Frameworks - hidden pearls

7

The Basics @SvenRuppert

import java.util.List;import java.util.ArrayList;if we don´t need a method like trimToSize()

we want to get rid of the dep. ArrayListthis will lead to some questions

what will be the right Implementation?what is the right time to decide?

Page 23: DI Frameworks - hidden pearls

7

The Basics @SvenRuppert

import java.util.List;import java.util.ArrayList;if we don´t need a method like trimToSize()

we want to get rid of the dep. ArrayListthis will lead to some questions

what will be the right Implementation?what is the right time to decide?what is the right freq. to decide?

Page 24: DI Frameworks - hidden pearls

8

The Basics @SvenRuppert

import java.util.List;import java.util.ArrayList;if we don´t need a method like trimToSize()

we want to get rid of the dep. ArrayListthis will lead to some questions

what will be the right Implementation?what is the right time to decide?what is the right freq. to decide?

Page 25: DI Frameworks - hidden pearls

8

The Basics @SvenRuppert

what will be the right Implementation?

Page 26: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

Page 27: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

Page 28: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

import java.util.List;

Page 29: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }

import java.util.List;

Page 30: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }

final List arrayList = createArrayList();

import java.util.List;

Page 31: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }

final List arrayList = createArrayList();

import java.util.ArrayList;

import java.util.List;

Page 32: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }

final List arrayList = createArrayList();

import java.util.ArrayList;

import java.util.List;

Page 33: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }

final List arrayList = createArrayList();final List linkedList = createLinkedList();

import java.util.ArrayList;

import java.util.List;

Page 34: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }

final List arrayList = createArrayList();final List linkedList = createLinkedList();

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;

Page 35: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }public static List createList() { return new ArrayList(); }

final List arrayList = createArrayList();final List linkedList = createLinkedList();

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;

Page 36: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }public static List createList() { return new ArrayList(); }

final List arrayList = createArrayList();final List linkedList = createLinkedList();final List list = createList();

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;

Page 37: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }public static List createList() { return new ArrayList(); }

final List arrayList = createArrayList();final List linkedList = createLinkedList();final List list = createList();

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;

Page 38: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }public static List createList() { return new ArrayList(); }

final List arrayList = createArrayList();final List linkedList = createLinkedList();final List list = createList();

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;

Page 39: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }public static List createList() { return new ArrayList(); }

final List arrayList = createArrayList();final List linkedList = createLinkedList();final List list = createList();

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;

Page 40: DI Frameworks - hidden pearls

9

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public class ListFactory { public static void main(String[] args) { }}

public static List createArrayList() { return new ArrayList(); }public static List createLinkedList() { return new LinkedList(); }public static List createList() { return new ArrayList(); }

final List arrayList = createArrayList();final List linkedList = createLinkedList();final List list = createList();

import java.util.ArrayList;import java.util.LinkedList;import java.util.List;

What goals we

reached?

Page 41: DI Frameworks - hidden pearls

10

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

public List<Data> execute() { //.... return result; }

import java.util.List;import org.rapidpm.ListFactory;

final List<Data> result = ListFactory.createArrayList();

Page 42: DI Frameworks - hidden pearls

10

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

public List<Data> execute() { //.... return result; }

import java.util.List;import org.rapidpm.ListFactory;

final List<Data> result = ListFactory.createArrayList();

Page 43: DI Frameworks - hidden pearls

10

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

public List<Data> execute() { //.... return result; }

import java.util.List;import org.rapidpm.ListFactory;

final List<Data> result = ListFactory.createArrayList();

Page 44: DI Frameworks - hidden pearls

10

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

public List<Data> execute() { //.... return result; }

import java.util.List;import org.rapidpm.ListFactory;

final List<Data> result = ListFactory.createArrayList();

Page 45: DI Frameworks - hidden pearls

10

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

public List<Data> execute() { //.... return result; }

import java.util.List;import org.rapidpm.ListFactory;

final List<Data> result = ListFactory.createArrayList();

Page 46: DI Frameworks - hidden pearls

10

The Basics @SvenRuppert

what will be the right Implementation?with default Java SE

public List<Data> execute() { //.... return result; }

import java.util.List;import java.util.ArrayList;

final List<Data> result = new ArrayList<>();

public List<Data> execute() { //.... return result; }

import java.util.List;import org.rapidpm.ListFactory;

final List<Data> result = ListFactory.createArrayList();

Page 47: DI Frameworks - hidden pearls

11

The Basics @SvenRuppert

what is the right time to decide?

what is the right freq. to decide?

Scopes:

Page 48: DI Frameworks - hidden pearls

11

The Basics @SvenRuppert

what is the right time to decide?

what is the right freq. to decide?

Scopes:Application / Singleton

Page 49: DI Frameworks - hidden pearls

11

The Basics @SvenRuppert

what is the right time to decide?

what is the right freq. to decide?

Scopes:Application / Singleton

Session

Page 50: DI Frameworks - hidden pearls

11

The Basics @SvenRuppert

what is the right time to decide?

what is the right freq. to decide?

Scopes:Application / Singleton

Session

Request

Page 51: DI Frameworks - hidden pearls

11

The Basics @SvenRuppert

what is the right time to decide?

what is the right freq. to decide?

Scopes:Application / Singleton

Session

Request

Method

Page 52: DI Frameworks - hidden pearls

12

The Basics @SvenRuppert

Page 53: DI Frameworks - hidden pearls

12

The Basics @SvenRuppert

public interface Service { String doWork();}

Page 54: DI Frameworks - hidden pearls

12

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

Page 55: DI Frameworks - hidden pearls

12

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

public static class BusinessModulA { private Service service; public BusinessModulA(final Service service) { this.service = service; } public void work() { service.doWork(); }}

Page 56: DI Frameworks - hidden pearls

12

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

public static class BusinessModulA { private Service service; public BusinessModulA(final Service service) { this.service = service; } public void work() { service.doWork(); }}

constructor

Page 57: DI Frameworks - hidden pearls

13

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

Page 58: DI Frameworks - hidden pearls

13

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

public static class BusinessModulB { private Service service; public void setService(final Service service) { this.service = service; } public void work() { service.doWork(); }}

Page 59: DI Frameworks - hidden pearls

13

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

public static class BusinessModulB { private Service service; public void setService(final Service service) { this.service = service; } public void work() { service.doWork(); }}

expl. setter

Page 60: DI Frameworks - hidden pearls

14

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

Page 61: DI Frameworks - hidden pearls

14

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

public static class BusinessModulC { private Service service; public void work() { service.doWork(); }}

Page 62: DI Frameworks - hidden pearls

14

The Basics @SvenRuppert

public interface Service { String doWork();} public static class Service2Inject implements Service {

public String doWork() { return null; }}

public static class BusinessModulC { private Service service; public void work() { service.doWork(); }} reflection

Page 63: DI Frameworks - hidden pearls

15

The Basics @SvenRuppert

BusinessModulA businessModulA = new BusinessModulA(new Service2Inject());businessModulA.work();

Page 64: DI Frameworks - hidden pearls

15

The Basics @SvenRuppert

BusinessModulA businessModulA = new BusinessModulA(new Service2Inject());businessModulA.work();

T1: create the instance of the Service

Page 65: DI Frameworks - hidden pearls

15

The Basics @SvenRuppert

BusinessModulA businessModulA = new BusinessModulA(new Service2Inject());businessModulA.work();

T1: create the instance of the ServiceT2: create the instance of the BusinessModul

Page 66: DI Frameworks - hidden pearls

15

The Basics @SvenRuppert

BusinessModulA businessModulA = new BusinessModulA(new Service2Inject());businessModulA.work();

T1: create the instance of the ServiceT2: create the instance of the BusinessModulT3: method invoke

Page 67: DI Frameworks - hidden pearls

16

The Basics @SvenRuppert

final BusinessModulB businessModulB = new BusinessModulB();businessModulB.setService(new Service2Inject());businessModulB.work();

Page 68: DI Frameworks - hidden pearls

16

The Basics @SvenRuppert

final BusinessModulB businessModulB = new BusinessModulB();businessModulB.setService(new Service2Inject());businessModulB.work();

T1: create the instance of the BusinessModul

Page 69: DI Frameworks - hidden pearls

16

The Basics @SvenRuppert

final BusinessModulB businessModulB = new BusinessModulB();businessModulB.setService(new Service2Inject());businessModulB.work();

T1: create the instance of the BusinessModulT2: create the instance of the Service

Page 70: DI Frameworks - hidden pearls

16

The Basics @SvenRuppert

final BusinessModulB businessModulB = new BusinessModulB();businessModulB.setService(new Service2Inject());businessModulB.work();

T1: create the instance of the BusinessModulT2: create the instance of the Service

T3: set the Service

Page 71: DI Frameworks - hidden pearls

16

The Basics @SvenRuppert

final BusinessModulB businessModulB = new BusinessModulB();businessModulB.setService(new Service2Inject());businessModulB.work();

T1: create the instance of the BusinessModulT2: create the instance of the Service

T3: set the ServiceT4: invoke method

Page 72: DI Frameworks - hidden pearls

17

The Basics @SvenRuppert

final BusinessModulC businessModulC = new BusinessModulC();try { final Field serviceField = BusinessModulC.class .getDeclaredField("service"); serviceField.set(businessModulC, new Service2Inject());} catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace();}businessModulC.work();

Page 73: DI Frameworks - hidden pearls

17

The Basics @SvenRuppert

final BusinessModulC businessModulC = new BusinessModulC();try { final Field serviceField = BusinessModulC.class .getDeclaredField("service"); serviceField.set(businessModulC, new Service2Inject());} catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace();}businessModulC.work();

T1: create the instance of the BusinessModule

Page 74: DI Frameworks - hidden pearls

17

The Basics @SvenRuppert

final BusinessModulC businessModulC = new BusinessModulC();try { final Field serviceField = BusinessModulC.class .getDeclaredField("service"); serviceField.set(businessModulC, new Service2Inject());} catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace();}businessModulC.work();

T1: create the instance of the BusinessModuleT2: create the instance of the Service

Page 75: DI Frameworks - hidden pearls

17

The Basics @SvenRuppert

final BusinessModulC businessModulC = new BusinessModulC();try { final Field serviceField = BusinessModulC.class .getDeclaredField("service"); serviceField.set(businessModulC, new Service2Inject());} catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace();}businessModulC.work();

T1: create the instance of the BusinessModuleT2: create the instance of the Service

T3: set the Service

Page 76: DI Frameworks - hidden pearls

17

The Basics @SvenRuppert

final BusinessModulC businessModulC = new BusinessModulC();try { final Field serviceField = BusinessModulC.class .getDeclaredField("service"); serviceField.set(businessModulC, new Service2Inject());} catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace();}businessModulC.work();

T1: create the instance of the BusinessModuleT2: create the instance of the Service

T3: set the ServiceT4: invoke method

Page 77: DI Frameworks - hidden pearls

Dependency Injection

18

@SvenRuppert

every framework will have a strategy how to

Page 78: DI Frameworks - hidden pearls

Dependency Injection

18

@SvenRuppert

every framework will have a strategy how to

resolve the Implementation

Page 79: DI Frameworks - hidden pearls

Dependency Injection

18

@SvenRuppert

every framework will have a strategy how to

resolve the Implementationcreate/set the instance

Page 80: DI Frameworks - hidden pearls

Dependency Injection

18

@SvenRuppert

every framework will have a strategy how to

resolve the Implementationcreate/set the instance

manage the timeline

Page 81: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

Page 82: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

@PostConstruct and @PreDestroy lifecycle callbacks

Page 83: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

Page 84: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Page 85: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Interceptors and decorators

Page 86: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Interceptors and decoratorsStereotypes - combined Qualifier

Page 87: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Interceptors and decoratorsStereotypes - combined Qualifier

Events

Page 88: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

Portable extension support

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Interceptors and decoratorsStereotypes - combined Qualifier

Events

Page 89: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

Portable extension support

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Interceptors and decoratorsStereotypes - combined Qualifier

Events

Page 90: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

Portable extension support

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Interceptors and decoratorsStereotypes - combined Qualifier

Events

Page 91: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

Portable extension support

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Interceptors and decoratorsStereotypes - combined Qualifier

Events

Page 92: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

19

@SvenRuppert

website : http://weld.cdi-spec.org/

the following features are available ( SE )

Portable extension support

@PostConstruct and @PreDestroy lifecycle callbacks

Dependency injection with qualifiers and alternatives

@Application, @Dependent and @Singleton scopes

Interceptors and decoratorsStereotypes - combined Qualifier

Events

Page 93: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Page 94: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternatives

Page 95: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

Page 96: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

Page 97: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceDefault;

Page 98: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceDefault; OK

Page 99: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceDefault;

public class Service_A implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

OK

Page 100: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceDefault;

public class Service_A implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

WELD-001409: Ambiguous dependencies

Page 101: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceDefault;

public class Service_A implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Prod

WELD-001409: Ambiguous dependencies

Page 102: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceDefault;

public class Service_A implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Prod

OK

Page 103: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceDefault;

public class Service_A implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Prod

@Inject @Prod Service serviceProd;OK

Page 104: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

20

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); } public class ServiceDefault implements Service {

public String doWork(final String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceDefault;

public class Service_A implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Prod

@Inject @Prod Service serviceProd;OK

Page 105: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

21

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

Page 106: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

21

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

public static class ServiceProducer{ @Produces @WithProducer public Service create(){ return txt -> Service.class.getSimpleName() + " " + txt; }}

Page 107: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

21

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

public static class ServiceProducer{ @Produces @WithProducer public Service create(){ return txt -> Service.class.getSimpleName() + " " + txt; }}

@Inject @WithProducer Service serviceProd;

Page 108: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

21

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

public static class ServiceProducer{ @Produces @WithProducer public Service create(){ return txt -> Service.class.getSimpleName() + " " + txt; }}

@Inject @WithProducer Service serviceProd;

Page 109: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

21

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

public static class ServiceProducer{ @Produces @WithProducer public Service create(){ return txt -> Service.class.getSimpleName() + " " + txt; }}

@Inject @WithProducer Service serviceProd;

Page 110: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

22

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

Page 111: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

22

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

@Alternativepublic class ServiceAlternative implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

Page 112: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

22

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

@Alternativepublic class ServiceAlternative implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceProd;

Page 113: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

22

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

@Alternativepublic class ServiceAlternative implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceProd;

<beans ... > <alternatives> <class>org.rapidpm.ServiceAlternative</class> </alternatives></beans>

Page 114: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

22

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

@Alternativepublic class ServiceAlternative implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceProd;

<beans ... > <alternatives> <class>org.rapidpm.ServiceAlternative</class> </alternatives></beans>

Page 115: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

22

@SvenRuppert

Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }

@Alternativepublic class ServiceAlternative implements Service { @Override public String doWork(String txt) { return this.getClass().getSimpleName() + " " + txt; }}

@Inject Service serviceProd;

<beans ... > <alternatives> <class>org.rapidpm.ServiceAlternative</class> </alternatives></beans>

Page 116: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

23

@SvenRuppert

Dependency injection with qualifiers and alternatives

Page 117: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

23

@SvenRuppert

Dependency injection with qualifiers and alternatives

@Inject Service service;

Page 118: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

23

@SvenRuppert

Dependency injection with qualifiers and alternatives

@Inject Service service;Service service = container.select(Service.class).get();

Page 119: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

23

@SvenRuppert

Dependency injection with qualifiers and alternatives

@Inject Service service;Service service = container.select(Service.class).get();

@Inject Instance<Service> serviceDefaultProxy;

Page 120: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

23

@SvenRuppert

Dependency injection with qualifiers and alternatives

@Inject Service service;Service service = container.select(Service.class).get();

@Inject Instance<Service> serviceDefaultProxy;Service serviceDevProxy = container .instance() .select(Service.class) .select(new AnnotationLiteral<DEV>(){}) .get();

Page 121: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

23

@SvenRuppert

Dependency injection with qualifiers and alternatives

@Inject Service service;

@Inject @WithProducer Service serviceProd;

Service service = container.select(Service.class).get();

@Inject Instance<Service> serviceDefaultProxy;Service serviceDevProxy = container .instance() .select(Service.class) .select(new AnnotationLiteral<DEV>(){}) .get();

Page 122: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

Page 123: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service;

Page 124: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

Page 125: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

Page 126: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

Page 127: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {

Page 128: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {

Page 129: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {final Class aClass = t.getClass();

Page 130: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {final Class aClass = t.getClass();final BeanManager beanManager = CDI.current().getBeanManager();

Page 131: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {final Class aClass = t.getClass();final BeanManager beanManager = CDI.current().getBeanManager();final AnnotatedType annotationType = beanManager.createAnnotatedType(aClass);

Page 132: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {final Class aClass = t.getClass();final BeanManager beanManager = CDI.current().getBeanManager();final AnnotatedType annotationType = beanManager.createAnnotatedType(aClass);final InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotationType);

Page 133: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {final Class aClass = t.getClass();final BeanManager beanManager = CDI.current().getBeanManager();final AnnotatedType annotationType = beanManager.createAnnotatedType(aClass);final InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotationType);final CreationalContext creationalContext = beanManager.createCreationalContext(null);

Page 134: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {final Class aClass = t.getClass();final BeanManager beanManager = CDI.current().getBeanManager();final AnnotatedType annotationType = beanManager.createAnnotatedType(aClass);final InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotationType);final CreationalContext creationalContext = beanManager.createCreationalContext(null);injectionTarget.inject(t, creationalContext);

Page 135: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

public <T> T activateCDI(T t) {final Class aClass = t.getClass();final BeanManager beanManager = CDI.current().getBeanManager();final AnnotatedType annotationType = beanManager.createAnnotatedType(aClass);final InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotationType);final CreationalContext creationalContext = beanManager.createCreationalContext(null);injectionTarget.inject(t, creationalContext);injectionTarget.postConstruct(t);

Page 136: DI Frameworks - hidden pearls

A short view on WELD-SE - CDI

24

@SvenRuppert

programmatically injection

@Inject Service service; Service service = container.select(Service.class).get();

return t;}

public <T> T activateCDI(T t) {final Class aClass = t.getClass();final BeanManager beanManager = CDI.current().getBeanManager();final AnnotatedType annotationType = beanManager.createAnnotatedType(aClass);final InjectionTarget injectionTarget = beanManager.createInjectionTarget(annotationType);final CreationalContext creationalContext = beanManager.createCreationalContext(null);injectionTarget.inject(t, creationalContext);injectionTarget.postConstruct(t);

Page 137: DI Frameworks - hidden pearls

BoonDI - Project bootstrapping

25

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

Page 138: DI Frameworks - hidden pearls

BoonDI - Project bootstrapping

25

@SvenRuppert

<dependency> <groupId>io.fastjson</groupId> <artifactId>boon</artifactId> <version>0.33</version> </dependency>

website : https://github.com/boonproject/boon/wiki/Boon-DI

Page 139: DI Frameworks - hidden pearls

BoonDI - Project bootstrapping

25

@SvenRuppert

<dependency> <groupId>javax.enterprise</groupId> <artifactId>cdi-api</artifactId> <version>1.2</version></dependency>

<dependency> <groupId>io.fastjson</groupId> <artifactId>boon</artifactId> <version>0.33</version> </dependency>

website : https://github.com/boonproject/boon/wiki/Boon-DI

Page 140: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

Page 141: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

@In (old from Seam)

Page 142: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

@PostConstruct @In (old from Seam)

Page 143: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

@PostConstruct @In (old from Seam)@Autowired (from Spring)

Page 144: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

@PostConstruct@Inject

@In (old from Seam)@Autowired (from Spring)

Page 145: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

@PostConstruct@Inject@Named

@In (old from Seam)@Autowired (from Spring)

Page 146: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

@PostConstruct@Inject@Named

@In (old from Seam)@Autowired (from Spring)

@Required (from Spring)

Page 147: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

@PostConstruct@Inject@Named

@In (old from Seam)@Autowired (from Spring)

@Required (from Spring)@Qualifier (from Spring)

Page 148: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

26

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

@PostConstruct@Inject@Named

@In (old from Seam)@Autowired (from Spring)

@Required (from Spring)@Qualifier (from Spring)

no Scopes

Page 149: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

27

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

Boon is not using - AnnotationProcessing - ByteCode - Manipulation

Page 150: DI Frameworks - hidden pearls

BoonDI - not a replacement for …..

27

@SvenRuppert

website : https://github.com/boonproject/boon/wiki/Boon-DI

Boon is not using - AnnotationProcessing - ByteCode - Manipulation

OK, this will lead

to Reflection or?

Page 151: DI Frameworks - hidden pearls

28

BoonDI - Hello World @SvenRuppert

Page 152: DI Frameworks - hidden pearls

28

BoonDI - Hello World @SvenRuppert

public class Service { @Inject SubService subService; @PostConstruct public void printInfoPostconstruct() { System.out.println("printInfoPostconstruct() " + this.getClass().getSimpleName()); }}

Page 153: DI Frameworks - hidden pearls

28

BoonDI - Hello World @SvenRuppert

public class Service { @Inject SubService subService; @PostConstruct public void printInfoPostconstruct() { System.out.println("printInfoPostconstruct() " + this.getClass().getSimpleName()); }}

public class SubService { @PostConstruct public void printInfoPostconstruct() { System.out.println("printInfoPostconstruct() " + this.getClass().getSimpleName()); }}

Page 154: DI Frameworks - hidden pearls

29

BoonDI - Hello World @SvenRuppert

Page 155: DI Frameworks - hidden pearls

29

BoonDI - Hello World @SvenRuppert

Page 156: DI Frameworks - hidden pearls

29

BoonDI - Hello World @SvenRuppert

Page 157: DI Frameworks - hidden pearls

29

BoonDI - Hello World @SvenRuppert

Page 158: DI Frameworks - hidden pearls

29

BoonDI - Hello World @SvenRuppert

final Module module = DependencyInjection.classes(Service.class);

Page 159: DI Frameworks - hidden pearls

29

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

Page 160: DI Frameworks - hidden pearls

30

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

Page 161: DI Frameworks - hidden pearls

30

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

SubService == null

Page 162: DI Frameworks - hidden pearls

30

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

SubService == null

final Module module = DependencyInjection .classes(Service.class, SubService.class);

Page 163: DI Frameworks - hidden pearls

30

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

SubService == null

final Module module = DependencyInjection .classes(Service.class, SubService.class);

final Context context = DependencyInjection.context(module);

Page 164: DI Frameworks - hidden pearls

30

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

SubService == null

final Module module = DependencyInjection .classes(Service.class, SubService.class);

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

Page 165: DI Frameworks - hidden pearls

30

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

SubService == null

SubService != null

final Module module = DependencyInjection .classes(Service.class, SubService.class);

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

Page 166: DI Frameworks - hidden pearls

30

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

SubService == null

SubService != null

final Module module = DependencyInjection .classes(Service.class, SubService.class);

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

Page 167: DI Frameworks - hidden pearls

30

BoonDI - Hello World @SvenRuppert

final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);

SubService == null

SubService != null

final Module module = DependencyInjection .classes(Service.class, SubService.class);

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

Page 168: DI Frameworks - hidden pearls

31

BoonDI - Hello World @SvenRuppert

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

final Module module = DependencyInjection .classes(Service.class, SubService.class);

Page 169: DI Frameworks - hidden pearls

31

BoonDI - Hello World @SvenRuppert

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

public class ServiceModule { }

final Module module = DependencyInjection .classes(Service.class, SubService.class);

Page 170: DI Frameworks - hidden pearls

31

BoonDI - Hello World @SvenRuppert

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

public class ServiceModule { }

final Module module = DependencyInjection .classes(Service.class, SubService.class);

public Service provideService(){ return new Service(); }

Page 171: DI Frameworks - hidden pearls

31

BoonDI - Hello World @SvenRuppert

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

public class ServiceModule { }

final Module module = DependencyInjection .classes(Service.class, SubService.class);

public Service provideService(){ return new Service(); }public SubService provideSubService() { return new SubService(); }

Page 172: DI Frameworks - hidden pearls

31

BoonDI - Hello World @SvenRuppert

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

public class ServiceModule { }

final Module module = DependencyInjection .classes(Service.class, SubService.class);

final Module module = DependencyInjection .module(new ServiceModule());

public Service provideService(){ return new Service(); }public SubService provideSubService() { return new SubService(); }

Page 173: DI Frameworks - hidden pearls

31

BoonDI - Hello World @SvenRuppert

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

public class ServiceModule { }

final Module module = DependencyInjection .classes(Service.class, SubService.class);

final Context context = DependencyInjection.context(module);

final Module module = DependencyInjection .module(new ServiceModule());

public Service provideService(){ return new Service(); }public SubService provideSubService() { return new SubService(); }

Page 174: DI Frameworks - hidden pearls

31

BoonDI - Hello World @SvenRuppert

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

public class ServiceModule { }

final Module module = DependencyInjection .classes(Service.class, SubService.class);

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

final Module module = DependencyInjection .module(new ServiceModule());

public Service provideService(){ return new Service(); }public SubService provideSubService() { return new SubService(); }

Page 175: DI Frameworks - hidden pearls

32

BoonDI - Hello World @SvenRuppert

public class ServiceModule {

}

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

final Module module = DependencyInjection .module(new ServiceModule());

public Service provideService(){ return new Service(); }

public SubService provideSubService() { return new SubService(); }

Page 176: DI Frameworks - hidden pearls

32

BoonDI - Hello World @SvenRuppert

public class ServiceModule {

}

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

final Module module = DependencyInjection .module(new ServiceModule());

public Service provideService(){ return new Service(); }

public SubService provideSubService() { return new SubService(); }

Page 177: DI Frameworks - hidden pearls

32

BoonDI - Hello World @SvenRuppert

public class ServiceModule {

}

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

final Module module = DependencyInjection .module(new ServiceModule());

public Service provideService(){ return new Service(); }

public SubService provideSubService() { return new SubService(); }

Page 178: DI Frameworks - hidden pearls

32

BoonDI - Hello World @SvenRuppert

public class ServiceModule {

}

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

final Module module = DependencyInjection .module(new ServiceModule());

public Service provideService(){ return new Service(); }

public SubService provideSubService() { return new SubService(); }

naming conventions

Page 179: DI Frameworks - hidden pearls

32

BoonDI - Hello World @SvenRuppert

public class ServiceModule {

}

final Context context = DependencyInjection.context(module);final Service service2 = context.get(Service.class);

final Module module = DependencyInjection .module(new ServiceModule());

public Service provideService(){ return new Service(); }

public SubService provideSubService() { return new SubService(); }

naming conventionsnot refactoring safe

Page 180: DI Frameworks - hidden pearls

33

BoonDI - Modules @SvenRuppert

at runtime you can

addModule() removeModule()

Page 181: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

Page 182: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {

Page 183: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");

Page 184: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");

Page 185: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

Page 186: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {

Page 187: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {public Service provideServiceA() { out.println("provideServiceBA ...");

Page 188: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {public Service provideServiceA() { out.println("provideServiceBA ...");public Service provideServiceB() { out.println("provideServiceBB ...");

Page 189: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {public Service provideServiceA() { out.println("provideServiceBA ...");public Service provideServiceB() { out.println("provideServiceBB ...");public Service provideServiceC() { out.println("provideServiceBC ...");

Page 190: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {public Service provideServiceA() { out.println("provideServiceBA ...");public Service provideServiceB() { out.println("provideServiceBB ...");public Service provideServiceC() { out.println("provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

Page 191: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {public Service provideServiceA() { out.println("provideServiceBA ...");public Service provideServiceB() { out.println("provideServiceBB ...");public Service provideServiceC() { out.println("provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

Page 192: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {public Service provideServiceA() { out.println("provideServiceBA ...");public Service provideServiceB() { out.println("provideServiceBB ...");public Service provideServiceC() { out.println("provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

Page 193: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {public Service provideServiceA() { out.println("provideServiceBA ...");public Service provideServiceB() { out.println("provideServiceBB ...");public Service provideServiceC() { out.println("provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

Page 194: DI Frameworks - hidden pearls

34

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");public Service provideServiceC() { out.println("provideServiceAC ...");

public class ServiceModuleB {public Service provideServiceA() { out.println("provideServiceBA ...");public Service provideServiceB() { out.println("provideServiceBB ...");public Service provideServiceC() { out.println("provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

Page 195: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

Page 196: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);

Page 197: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class);

Page 198: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceAB

Page 199: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceABfinal Context add = context.add(moduleB);

Page 200: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceABfinal Context add = context.add(moduleB);context.get(Service.class);

Page 201: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceABfinal Context add = context.add(moduleB);context.get(Service.class); provideServiceAB

Page 202: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceABfinal Context add = context.add(moduleB);context.get(Service.class);add.get(Service.class);

provideServiceAB

Page 203: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceABfinal Context add = context.add(moduleB);context.get(Service.class);add.get(Service.class);

provideServiceABprovideServiceAB

Page 204: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceABfinal Context add = context.add(moduleB);context.get(Service.class);add.get(Service.class);

provideServiceABprovideServiceAB

final Context context = DependencyInjection.context(moduleA,moduleB);

Page 205: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceABfinal Context add = context.add(moduleB);context.get(Service.class);add.get(Service.class);

provideServiceABprovideServiceAB

final Context context = DependencyInjection.context(moduleA,moduleB);

context.get(Service.class);

Page 206: DI Frameworks - hidden pearls

35

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleA);context.get(Service.class); provideServiceABfinal Context add = context.add(moduleB);context.get(Service.class);add.get(Service.class);

provideServiceABprovideServiceAB

final Context context = DependencyInjection.context(moduleA,moduleB);

context.get(Service.class); provideServiceAB

Page 207: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

Page 208: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);

Page 209: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class);

Page 210: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBB

Page 211: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);

Page 212: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);context.get(Service.class);

Page 213: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);context.get(Service.class); provideServiceBB

Page 214: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);context.get(Service.class);add.get(Service.class);

provideServiceBB

Page 215: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);context.get(Service.class);add.get(Service.class);

provideServiceBBprovideServiceBB

Page 216: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);context.get(Service.class);add.get(Service.class);

provideServiceBBprovideServiceBB

final Context context = DependencyInjection.context(moduleB,moduleA);

Page 217: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);context.get(Service.class);add.get(Service.class);

provideServiceBBprovideServiceBB

final Context context = DependencyInjection.context(moduleB,moduleA);

context.get(Service.class);

Page 218: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);context.get(Service.class);add.get(Service.class);

provideServiceBBprovideServiceBB

final Context context = DependencyInjection.context(moduleB,moduleA);

context.get(Service.class); provideServiceBB

Page 219: DI Frameworks - hidden pearls

36

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceA() { "provideServiceAA ...");public Service provideServiceB() {"provideServiceAB ...");public Service provideServiceC() {"provideServiceAC ...");

public class ServiceModuleB { public Service provideServiceA() { "provideServiceBA ...");public Service provideServiceB() { "provideServiceBB ...");public Service provideServiceC() { "provideServiceBC ...");

final Module moduleA = DependencyInjection.module(new ServiceModuleA()); final Module moduleB = DependencyInjection.module(new ServiceModuleB());

final Context context = DependencyInjection.context(moduleB);context.get(Service.class); provideServiceBBfinal Context add = context.add(moduleA);context.get(Service.class);add.get(Service.class);

provideServiceBBprovideServiceBB

final Context context = DependencyInjection.context(moduleB,moduleA);

context.get(Service.class); provideServiceBB

So far so good….

but what could

happen??

Page 220: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

Page 221: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());

Page 222: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());

Page 223: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());

Page 224: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());

Page 225: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

Page 226: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1)

Page 227: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

Page 228: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2)

Page 229: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

Page 230: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

Page 231: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class); provideServiceAB

Page 232: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1);

provideServiceAB

Page 233: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);

provideServiceAB

Page 234: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);

provideServiceAB

provideServiceBB

Page 235: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1);

provideServiceAB

provideServiceBB

Page 236: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1); context.get(Service.class);

provideServiceAB

provideServiceBB

Page 237: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1); context.get(Service.class);

provideServiceAB

provideServiceBBprovideServiceAB

Page 238: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1); context.get(Service.class);context.remove(moduleA2);

provideServiceAB

provideServiceBBprovideServiceAB

Page 239: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1); context.get(Service.class);context.remove(moduleA2); context.get(Service.class);

provideServiceAB

provideServiceBBprovideServiceAB

Page 240: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1); context.get(Service.class);context.remove(moduleA2); context.get(Service.class);

provideServiceAB

provideServiceBBprovideServiceABprovideServiceBB

Page 241: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1); context.get(Service.class);context.remove(moduleA2); context.get(Service.class);context.remove(moduleB2);

provideServiceAB

provideServiceBBprovideServiceABprovideServiceBB

Page 242: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1); context.get(Service.class);context.remove(moduleA2); context.get(Service.class);context.remove(moduleB2); context.get(Service.class);

provideServiceAB

provideServiceBBprovideServiceABprovideServiceBB

Page 243: DI Frameworks - hidden pearls

37

BoonDI - Modules - be careful :-) @SvenRuppert

public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");

public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");

final Module moduleA1 = DependencyInjection.module(new ServiceModuleA());final Module moduleA2 = DependencyInjection.module(new ServiceModuleA());final Module moduleB1 = DependencyInjection.module(new ServiceModuleB());final Module moduleB2 = DependencyInjection.module(new ServiceModuleB());final Context context = DependencyInjection

.context(moduleA1).context(moduleB1)

.context(moduleA2).context(moduleB2);

context.get(Service.class);

context.remove(moduleA1); context.get(Service.class);context.remove(moduleB1); context.get(Service.class);context.remove(moduleA2); context.get(Service.class);context.remove(moduleB2); context.get(Service.class);

provideServiceAB

provideServiceBBprovideServiceABprovideServiceBB

null

Page 244: DI Frameworks - hidden pearls

38

BoonDI - Modules - internal view @SvenRuppert

public InstanceModule( Object object ) { module = object; ClassMeta classMeta = ClassMeta.classMeta(object.getClass()); Iterable<MethodAccess> methods = (Iterable<MethodAccess>)classMeta.methods(); for ( MethodAccess method : methods) { if ( !method.isStatic() && method.name().startsWith( "provide" ) ) { addCreationMethod( method, false ); } else if (!method.isStatic() && method.name().startsWith( "create" )) { addCreationMethod( method, true ); } }}

add Modules…

Page 245: DI Frameworks - hidden pearls

38

BoonDI - Modules - internal view @SvenRuppert

public InstanceModule( Object object ) { module = object; ClassMeta classMeta = ClassMeta.classMeta(object.getClass()); Iterable<MethodAccess> methods = (Iterable<MethodAccess>)classMeta.methods(); for ( MethodAccess method : methods) { if ( !method.isStatic() && method.name().startsWith( "provide" ) ) { addCreationMethod( method, false ); } else if (!method.isStatic() && method.name().startsWith( "create" )) { addCreationMethod( method, true ); } }}

add Modules…

Page 246: DI Frameworks - hidden pearls

38

BoonDI - Modules - internal view @SvenRuppert

public InstanceModule( Object object ) { module = object; ClassMeta classMeta = ClassMeta.classMeta(object.getClass()); Iterable<MethodAccess> methods = (Iterable<MethodAccess>)classMeta.methods(); for ( MethodAccess method : methods) { if ( !method.isStatic() && method.name().startsWith( "provide" ) ) { addCreationMethod( method, false ); } else if (!method.isStatic() && method.name().startsWith( "create" )) { addCreationMethod( method, true ); } }}

Method[] methods_ = clasz.getDeclaredMethods();

add Modules…

Page 247: DI Frameworks - hidden pearls

38

BoonDI - Modules - internal view @SvenRuppert

public InstanceModule( Object object ) { module = object; ClassMeta classMeta = ClassMeta.classMeta(object.getClass()); Iterable<MethodAccess> methods = (Iterable<MethodAccess>)classMeta.methods(); for ( MethodAccess method : methods) { if ( !method.isStatic() && method.name().startsWith( "provide" ) ) { addCreationMethod( method, false ); } else if (!method.isStatic() && method.name().startsWith( "create" )) { addCreationMethod( method, true ); } }}

Method[] methods_ = clasz.getDeclaredMethods(); not sorted,

add Modules…

Page 248: DI Frameworks - hidden pearls

38

BoonDI - Modules - internal view @SvenRuppert

public InstanceModule( Object object ) { module = object; ClassMeta classMeta = ClassMeta.classMeta(object.getClass()); Iterable<MethodAccess> methods = (Iterable<MethodAccess>)classMeta.methods(); for ( MethodAccess method : methods) { if ( !method.isStatic() && method.name().startsWith( "provide" ) ) { addCreationMethod( method, false ); } else if (!method.isStatic() && method.name().startsWith( "create" )) { addCreationMethod( method, true ); } }}

Method[] methods_ = clasz.getDeclaredMethods();methodMap = new ConcurrentHashMap<>( );

not sorted,

add Modules…

Page 249: DI Frameworks - hidden pearls

38

BoonDI - Modules - internal view @SvenRuppert

public InstanceModule( Object object ) { module = object; ClassMeta classMeta = ClassMeta.classMeta(object.getClass()); Iterable<MethodAccess> methods = (Iterable<MethodAccess>)classMeta.methods(); for ( MethodAccess method : methods) { if ( !method.isStatic() && method.name().startsWith( "provide" ) ) { addCreationMethod( method, false ); } else if (!method.isStatic() && method.name().startsWith( "create" )) { addCreationMethod( method, true ); } }}

Method[] methods_ = clasz.getDeclaredMethods();methodMap = new ConcurrentHashMap<>( ); keys (String) will be sorted

not sorted,

add Modules…

Page 250: DI Frameworks - hidden pearls

38

BoonDI - Modules - internal view @SvenRuppert

public InstanceModule( Object object ) { module = object; ClassMeta classMeta = ClassMeta.classMeta(object.getClass()); Iterable<MethodAccess> methods = (Iterable<MethodAccess>)classMeta.methods(); for ( MethodAccess method : methods) { if ( !method.isStatic() && method.name().startsWith( "provide" ) ) { addCreationMethod( method, false ); } else if (!method.isStatic() && method.name().startsWith( "create" )) { addCreationMethod( method, true ); } }}

Method[] methods_ = clasz.getDeclaredMethods();methodMap = new ConcurrentHashMap<>( ); keys (String) will be sorted

not sorted,

but why will be the sort-order?

add Modules…

Page 251: DI Frameworks - hidden pearls

39

BoonDI - Modules @SvenRuppert

add Modules…methodMap = new ConcurrentHashMap<>( ); keys (String) will be sorted

but what will be the sort-order?

Page 252: DI Frameworks - hidden pearls

39

BoonDI - Modules @SvenRuppert

add Modules…methodMap = new ConcurrentHashMap<>( ); keys (String) will be sorted

but what will be the sort-order?final ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();concurrentHashMap.put("provideServiceA", "provideServiceA");concurrentHashMap.put("provideServiceC", "provideServiceC");concurrentHashMap.put("provideServiceD", "provideServiceD");concurrentHashMap.put("provideServiceB", "provideServiceB");for (Object o : concurrentHashMap.keySet()) { System.out.println("o = " + o + " hash - " + o.hashCode());}

Page 253: DI Frameworks - hidden pearls

39

BoonDI - Modules @SvenRuppert

add Modules…methodMap = new ConcurrentHashMap<>( ); keys (String) will be sorted

but what will be the sort-order?final ConcurrentHashMap<String, String> concurrentHashMap = new ConcurrentHashMap<>();concurrentHashMap.put("provideServiceA", "provideServiceA");concurrentHashMap.put("provideServiceC", "provideServiceC");concurrentHashMap.put("provideServiceD", "provideServiceD");concurrentHashMap.put("provideServiceB", "provideServiceB");for (Object o : concurrentHashMap.keySet()) { System.out.println("o = " + o + " hash - " + o.hashCode());}

o = provideServiceD hash - 788599280 o = provideServiceA hash - 788599277 o = provideServiceC hash - 788599279 o = provideServiceB hash - 788599278

Page 254: DI Frameworks - hidden pearls

40

BoonDI - Prototypes @SvenRuppert

Page 255: DI Frameworks - hidden pearls

40

BoonDI - Prototypes @SvenRuppert

You will create a Prototyp

Page 256: DI Frameworks - hidden pearls

40

BoonDI - Prototypes @SvenRuppert

You will create a Prototyp

this will be registered inside a Module

Page 257: DI Frameworks - hidden pearls

40

BoonDI - Prototypes @SvenRuppert

You will create a Prototyp

this will be registered inside a Module

if you ask of an instance - you will get a deep copy

Page 258: DI Frameworks - hidden pearls

40

BoonDI - Prototypes @SvenRuppert

You will create a Prototyp

this will be registered inside a Module

if you ask of an instance - you will get a deep copyreally a deep copy ?

Page 259: DI Frameworks - hidden pearls

41

BoonDI - Prototypes @SvenRuppert

Page 260: DI Frameworks - hidden pearls

41

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

Page 261: DI Frameworks - hidden pearls

41

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public interface SubDemo { }

Page 262: DI Frameworks - hidden pearls

41

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

Page 263: DI Frameworks - hidden pearls

41

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

Page 264: DI Frameworks - hidden pearls

41

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();demo.setName("DemoClass");demo.setNummer(1);final SubDemoClass subDemo = new SubDemoClass(); subDemo.setName("SubDemoClass");subDemo.setNummer(2);demo.setSubDemo(subDemo);

Page 265: DI Frameworks - hidden pearls

42

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

Page 266: DI Frameworks - hidden pearls

42

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

Page 267: DI Frameworks - hidden pearls

42

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);

Page 268: DI Frameworks - hidden pearls

42

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

Page 269: DI Frameworks - hidden pearls

42

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

Page 270: DI Frameworks - hidden pearls

42

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

demo

Page 271: DI Frameworks - hidden pearls

42

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

demo nextDemo

Page 272: DI Frameworks - hidden pearls

42

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

demo != nextDemo

Page 273: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

Page 274: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();

Page 275: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final DemoClass demo = new DemoClass();create a Module and register it

Page 276: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

create a Module and register it

Page 277: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

create a Module and register it

final DemoKlasse demo = ctx.get(DemoKlasse.class);

Page 278: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

create a Module and register it

final DemoKlasse demo = ctx.get(DemoKlasse.class);

Page 279: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final Module module = DependencyInjection.prototypes(demo);

create a Module and register it

final DemoKlasse demo = ctx.get(DemoKlasse.class);

Page 280: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

create a Module and register it

final DemoKlasse demo = ctx.get(DemoKlasse.class);

Page 281: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

create a Module and register it

final DemoKlasse demo = ctx.get(DemoKlasse.class);

Page 282: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

demo

create a Module and register it

final DemoKlasse demo = ctx.get(DemoKlasse.class);

Page 283: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

demo nextDemo

create a Module and register it

final DemoKlasse demo = ctx.get(DemoKlasse.class);

Page 284: DI Frameworks - hidden pearls

43

BoonDI - Prototypes with @Inject @SvenRuppert

public class DemoClass { private String name; private int nummer; @Inject SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer;}

public interface SubDemo { }

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

demo != nextDemo

create a Module and register it

final DemoKlasse demo = ctx.get(DemoKlasse.class);

Page 285: DI Frameworks - hidden pearls

44

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer; }

public interface SubDemo { }

final DemoClass demo = new DemoClass();

Page 286: DI Frameworks - hidden pearls

44

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer; }

public interface SubDemo { }

final DemoClass demo = new DemoClass();

private LocalDateTime localDateTime;

Page 287: DI Frameworks - hidden pearls

44

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer; }

public interface SubDemo { }

final DemoClass demo = new DemoClass();

private LocalDateTime localDateTime;

Page 288: DI Frameworks - hidden pearls

44

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer; }

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);

private LocalDateTime localDateTime;

Page 289: DI Frameworks - hidden pearls

44

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer; }

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

private LocalDateTime localDateTime;

Page 290: DI Frameworks - hidden pearls

44

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer; }

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

final DemoClass nextDemo = context.get(DemoClass.class);

private LocalDateTime localDateTime;

Page 291: DI Frameworks - hidden pearls

44

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer; }

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

org.boon.Exceptions$SoftenedException

private LocalDateTime localDateTime;

Page 292: DI Frameworks - hidden pearls

44

BoonDI - Prototypes @SvenRuppert

public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}

public class SubDemoClass implements SubDemo { private String name; private int nummer; }

public interface SubDemo { }

final DemoClass demo = new DemoClass();

final Module module = DependencyInjection.prototypes(demo);final Context context = DependencyInjection.context(module);

org.boon.Exceptions$SoftenedException

private LocalDateTime localDateTime;

Prototype is not working with

all new JDK8 classes

reflection usage BUG

Page 293: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

Page 294: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

Page 295: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//default

Page 296: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),

Page 297: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

Page 298: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

Page 299: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

Page 300: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

Page 301: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

Page 302: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Context context = DependencyInjection.context(suppliers);

Page 303: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Context context = DependencyInjection.context(suppliers);context.get(ServiceImpl.class)

Page 304: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Context context = DependencyInjection.context(suppliers);context.get(ServiceImpl.class)context.get(ServiceImpl.class, "ImplA")

Page 305: DI Frameworks - hidden pearls

45

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

context.get(ServiceImpl.class, "ImplB");

final Context context = DependencyInjection.context(suppliers);context.get(ServiceImpl.class)context.get(ServiceImpl.class, "ImplA")

Page 306: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

Page 307: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

Page 308: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

no interface possible

Page 309: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

no interface possiblethe BoonDI impl. needs a SuperType, otherwise NullPointerException

Page 310: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

no interface possible

but you could write the following

the BoonDI impl. needs a SuperType, otherwise NullPointerException

Page 311: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Module module = DependencyInjection.module( new Object() { });

no interface possible

but you could write the following

the BoonDI impl. needs a SuperType, otherwise NullPointerException

Page 312: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }

no interface possible

but you could write the following

the BoonDI impl. needs a SuperType, otherwise NullPointerException

Page 313: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }

no interface possible

but you could write the following

the BoonDI impl. needs a SuperType, otherwise NullPointerException

Page 314: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

no interface possible

but you could write the following

the BoonDI impl. needs a SuperType, otherwise NullPointerException

Page 315: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

no interface possible

but you could write the following

the BoonDI impl. needs a SuperType, otherwise NullPointerException

Page 316: DI Frameworks - hidden pearls

46

BoonDI - Suppliers / @Named @SvenRuppert

final Module suppliers = DependencyInjection.suppliers( );

ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),ProviderInfo.providerOf("ImplB", ServiceImpl.class, ServiceImplB::new)

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

no interface possible

but you could write the following

the BoonDI impl. needs a SuperType, otherwise NullPointerException

same effect as a ProviderInfo

Page 317: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

Page 318: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

final Context ctx = DependencyInjection.context(module);

Page 319: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

public interface Service { public String work(String txt); }

final Context ctx = DependencyInjection.context(module);

Page 320: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

public interface Service { public String work(String txt); }

final Context ctx = DependencyInjection.context(module);

ctx.invoke("ImplA", "work", "combine invoked..")

Page 321: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

public interface Service { public String work(String txt); }

final Context ctx = DependencyInjection.context(module);

ctx.invoke("ImplA", "work", "combine invoked..")

Page 322: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

public interface Service { public String work(String txt); }

final Context ctx = DependencyInjection.context(module);

ctx.invoke("ImplA", "work", "combine invoked..")

Page 323: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

public interface Service { public String work(String txt); }

final Context ctx = DependencyInjection.context(module);

ctx.invoke("ImplA", "work", "combine invoked..")

Page 324: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

public interface Service { public String work(String txt); }

final Context ctx = DependencyInjection.context(module);

ctx.invoke("ImplA", "work", "combine invoked..")

Page 325: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

public interface Service { public String work(String txt); }

final Context ctx = DependencyInjection.context(module);

ctx.invoke("ImplA", "work", "combine invoked..")

reflection overhead

Page 326: DI Frameworks - hidden pearls

47

BoonDI - invoke @SvenRuppert

final Module module = DependencyInjection.module( new Object() { });

public Service provide() { return new ServiceA(); }@Named(„ImplA") public Service provideA() { return new ServiceA(); }@Named("ImplB") public Service provideB() { return new ServiceB(); }

public interface Service { public String work(String txt); }

final Context ctx = DependencyInjection.context(module);

ctx.invoke("ImplA", "work", "combine invoked..")

reflection overheadnot refactoring safe

Page 327: DI Frameworks - hidden pearls

48

Dagger - bootstrapping @SvenRuppert

http://square.github.io/dagger/

Page 328: DI Frameworks - hidden pearls

48

Dagger - bootstrapping @SvenRuppert

<dependency> <groupId>com.squareup.dagger</groupId> <artifactId>dagger</artifactId> <version>1.2.2</version> </dependency>

http://square.github.io/dagger/

Page 329: DI Frameworks - hidden pearls

48

Dagger - bootstrapping @SvenRuppert

<dependency> <groupId>com.squareup.dagger</groupId> <artifactId>dagger</artifactId> <version>1.2.2</version> </dependency>

<dependency> <groupId>com.squareup.dagger</groupId> <artifactId>dagger-compiler</artifactId> <version>1.2.2</version> <optional>true</optional></dependency>

http://square.github.io/dagger/

Page 330: DI Frameworks - hidden pearls

48

Dagger - bootstrapping @SvenRuppert

<dependency> <groupId>com.squareup.dagger</groupId> <artifactId>dagger</artifactId> <version>1.2.2</version> </dependency>

<dependency> <groupId>com.squareup.dagger</groupId> <artifactId>dagger-compiler</artifactId> <version>1.2.2</version> <optional>true</optional></dependency>

available for Java and Android

http://square.github.io/dagger/

Page 331: DI Frameworks - hidden pearls

49

Dagger - bootstrapping @SvenRuppert

//bootstrapping final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());

Page 332: DI Frameworks - hidden pearls

49

Dagger - bootstrapping @SvenRuppert

//bootstrapping final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());

final Main main = objectGraph.get(Main.class);

Page 333: DI Frameworks - hidden pearls

49

Dagger - bootstrapping @SvenRuppert

//bootstrapping final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());

objectGraph.inject(new Main());

final Main main = objectGraph.get(Main.class);

Page 334: DI Frameworks - hidden pearls

49

Dagger - bootstrapping @SvenRuppert

//bootstrapping final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());

objectGraph.inject(new Main());

final Main main = objectGraph.get(Main.class);

How to wire all together?

Page 335: DI Frameworks - hidden pearls

49

Dagger - bootstrapping @SvenRuppert

//bootstrapping final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());

objectGraph.inject(new Main());

final Main main = objectGraph.get(Main.class);

How to wire all together?

Page 336: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

Page 337: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public interface MainService { String execute(String txt); }

Page 338: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

Page 339: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }}

) {new MainServiceImpl();

Page 340: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }}

) {new MainServiceImpl();

Page 341: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managed

) {new MainServiceImpl();

Page 342: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managed

) {new MainServiceImpl();

Page 343: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

) {new MainServiceImpl();

Page 344: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

) {new MainServiceImpl();

Page 345: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

define a Module) {

new MainServiceImpl();

Page 346: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

define a Module) {

new MainServiceImpl();

Page 347: DI Frameworks - hidden pearls

50

Dagger - bootstrapping @SvenRuppert

public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}

public interface MainService { String execute(String txt); }

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

define a Module

possible targets

) {new MainServiceImpl();

Page 348: DI Frameworks - hidden pearls

51

Dagger - bootstrapping @SvenRuppert

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

define a Module

possible targets

){new MainServiceImpl();

Page 349: DI Frameworks - hidden pearls

51

Dagger - bootstrapping @SvenRuppert

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

define a Module

possible targets

){new MainServiceImpl();

Page 350: DI Frameworks - hidden pearls

51

Dagger - bootstrapping @SvenRuppert

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

define a Module

possible targets

){MainServiceImpl xnew MainServiceImpl();

Page 351: DI Frameworks - hidden pearls

51

Dagger - bootstrapping @SvenRuppert

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

define a Module

possible targets

){MainServiceImpl x

Page 352: DI Frameworks - hidden pearls

51

Dagger - bootstrapping @SvenRuppert

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }} not managedmust marked

define a Module

possible targets

){MainServiceImpl xx

Page 353: DI Frameworks - hidden pearls

51

Dagger - bootstrapping @SvenRuppert

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }}must marked

define a Module

possible targets

){MainServiceImpl xx

Page 354: DI Frameworks - hidden pearls

51

Dagger - bootstrapping @SvenRuppert

@Module(library = false, injects = {Main.class}, complete = true)public class BusinessModule { @Provides MainService provideMainService( return }}must marked

define a Module

possible targets

){MainServiceImpl xx

managed

Page 355: DI Frameworks - hidden pearls

52

Dagger - work with Context @SvenRuppert

Page 356: DI Frameworks - hidden pearls

52

Dagger - work with Context @SvenRuppert

@ProvidesSubSubService provideSubSubService() { return new SubSubServiceImpl(); }

Page 357: DI Frameworks - hidden pearls

52

Dagger - work with Context @SvenRuppert

@ProvidesSubSubService provideSubSubService() { return new SubSubServiceImpl(); }@Provides @Named("A")SubService provideSubServiceA(SubServiceA subService) { return subService; } @Provides @Named("B")SubService provideSubServiceB(SubServiceB subService) { return subService; }

Page 358: DI Frameworks - hidden pearls

52

Dagger - work with Context @SvenRuppert

@ProvidesSubSubService provideSubSubService() { return new SubSubServiceImpl(); }@Provides @Named("A")SubService provideSubServiceA(SubServiceA subService) { return subService; } @Provides @Named("B")SubService provideSubServiceB(SubServiceB subService) { return subService; }

@ProvidesSubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl){ return subServiceA; } else{ return subServiceB; }}

Page 359: DI Frameworks - hidden pearls

53

Dagger - work with Context @SvenRuppert

@ProvidesSubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl){ return subServiceA; } else{ return subServiceB; }}

Page 360: DI Frameworks - hidden pearls

53

Dagger - work with Context @SvenRuppert

@ProvidesSubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl){ return subServiceA; } else{ return subServiceB; }}

Page 361: DI Frameworks - hidden pearls

53

Dagger - work with Context @SvenRuppert

@ProvidesSubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl){ return subServiceA; } else{ return subServiceB; }}

Context must be self-

implemented

Page 362: DI Frameworks - hidden pearls

53

Dagger - work with Context @SvenRuppert

@ProvidesSubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl){ return subServiceA; } else{ return subServiceB; }}

Context must be self-

implemented

Page 363: DI Frameworks - hidden pearls

53

Dagger - work with Context @SvenRuppert

@ProvidesSubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl){ return subServiceA; } else{ return subServiceB; }}

Context must be self-

implemented

all instances are created

Page 364: DI Frameworks - hidden pearls

54

Dagger - work with Context @SvenRuppert

@ProvidesSubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl){ return subServiceA; } else{ return subServiceB; }}

Context must be self-

implemented

all instances are created

Page 365: DI Frameworks - hidden pearls

54

Dagger - work with Context @SvenRuppert

Context must be self-

implemented

Page 366: DI Frameworks - hidden pearls

54

Dagger - work with Context @SvenRuppert

Context must be self-

implemented

@ProvidesSubService provideSubService(@Named("A") Lazy<SubService> subServiceA, @Named("B") Lazy<SubService> subServiceB) { if (Context.getInstance().defaultImpl) { return subServiceA.get(); } else { return subServiceB.get(); }}

Page 367: DI Frameworks - hidden pearls

54

Dagger - work with Context @SvenRuppert

Context must be self-

implemented

@ProvidesSubService provideSubService(@Named("A") Lazy<SubService> subServiceA, @Named("B") Lazy<SubService> subServiceB) { if (Context.getInstance().defaultImpl) { return subServiceA.get(); } else { return subServiceB.get(); }}

Page 368: DI Frameworks - hidden pearls

54

Dagger - work with Context @SvenRuppert

Context must be self-

implemented

@ProvidesSubService provideSubService(@Named("A") Lazy<SubService> subServiceA, @Named("B") Lazy<SubService> subServiceB) { if (Context.getInstance().defaultImpl) { return subServiceA.get(); } else { return subServiceB.get(); }}

Virtual Proxy

Page 369: DI Frameworks - hidden pearls

55

Dagger - Module - Composition @SvenRuppert

Page 370: DI Frameworks - hidden pearls

55

Dagger - Module - Composition @SvenRuppert

@Module(library = true, complete = true)public class SubSubServiceModule { @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); }}

Page 371: DI Frameworks - hidden pearls

55

Dagger - Module - Composition @SvenRuppert

@Module(library = true, complete = true)public class SubSubServiceModule { @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); }}

@Module(library = true, includes = SubSubServiceModule.class, complete = true)public class SubService_A_Module { @Provides @Named("A") SubService provideSubServiceA(SubServiceA subService) { return subService; } }

Page 372: DI Frameworks - hidden pearls

55

Dagger - Module - Composition @SvenRuppert

@Module(library = true, complete = true)public class SubSubServiceModule { @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); }}

@Module(library = true, includes = SubSubServiceModule.class, complete = true)public class SubService_A_Module { @Provides @Named("A") SubService provideSubServiceA(SubServiceA subService) { return subService; } }

Page 373: DI Frameworks - hidden pearls

55

Dagger - Module - Composition @SvenRuppert

@Module(library = true, complete = true)public class SubSubServiceModule { @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); }}

@Module(library = true, includes = SubSubServiceModule.class, complete = true)public class SubService_A_Module { @Provides @Named("A") SubService provideSubServiceA(SubServiceA subService) { return subService; } }

@Module(library = true, includes = SubSubServiceModule.class, complete = true)public class SubService_B_Module { @Provides @Named("B") SubService provideSubServiceB(SubServiceB subService) { return subService; } }

Page 374: DI Frameworks - hidden pearls

56

Dagger - Module - Composition @SvenRuppert

Page 375: DI Frameworks - hidden pearls

56

Dagger - Module - Composition @SvenRuppert

@Module(library = true, includes = {SubService_A_Module.class, SubService_B_Module.class}, complete = true)public class SubServiceModule { @Provides SubService provideSubService( @Named("A") Provider<SubService> subServiceA, @Named("B") Provider<SubService> subServiceB) { if (Context.getInstance().defaultImpl) { return subServiceA.get(); } else { return subServiceB.get(); } }}

Page 376: DI Frameworks - hidden pearls

56

Dagger - Module - Composition @SvenRuppert

@Module(library = true, includes = {SubService_A_Module.class, SubService_B_Module.class}, complete = true)public class SubServiceModule { @Provides SubService provideSubService( @Named("A") Provider<SubService> subServiceA, @Named("B") Provider<SubService> subServiceB) { if (Context.getInstance().defaultImpl) { return subServiceA.get(); } else { return subServiceB.get(); } }}

Page 377: DI Frameworks - hidden pearls

56

Dagger - Module - Composition @SvenRuppert

@Module(library = true, includes = {SubService_A_Module.class, SubService_B_Module.class}, complete = true)public class SubServiceModule { @Provides SubService provideSubService( @Named("A") Provider<SubService> subServiceA, @Named("B") Provider<SubService> subServiceB) { if (Context.getInstance().defaultImpl) { return subServiceA.get(); } else { return subServiceB.get(); } }}

all possible includes

Page 378: DI Frameworks - hidden pearls

56

Dagger - Module - Composition @SvenRuppert

@Module(library = true, includes = {SubService_A_Module.class, SubService_B_Module.class}, complete = true)public class SubServiceModule { @Provides SubService provideSubService( @Named("A") Provider<SubService> subServiceA, @Named("B") Provider<SubService> subServiceB) { if (Context.getInstance().defaultImpl) { return subServiceA.get(); } else { return subServiceB.get(); } }}

all possible includes

if @Named("B") is not available - compile will break

Page 379: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

Page 380: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());

Page 381: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());

Page 382: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());final Main mainA = objectGraphA.get(Main.class);

Page 383: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

final Main mainB = objectGraphB.get(Main.class);

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());final Main mainA = objectGraphA.get(Main.class);

Page 384: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

final Main mainB = objectGraphB.get(Main.class);

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());final Main mainA = objectGraphA.get(Main.class);

objectGraphA.inject(main);

Page 385: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

final Main mainB = objectGraphB.get(Main.class);

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());final Main mainA = objectGraphA.get(Main.class);

objectGraphA.inject(main);

objectGraphB.inject(main);

Page 386: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

final Main mainB = objectGraphB.get(Main.class);

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());final Main mainA = objectGraphA.get(Main.class);

objectGraphA.inject(main);

objectGraphB.inject(main);

Page 387: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

be careful, Singletons are only Singletons

inside a Module instance

final Main mainB = objectGraphB.get(Main.class);

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());final Main mainA = objectGraphA.get(Main.class);

objectGraphA.inject(main);

objectGraphB.inject(main);

Page 388: DI Frameworks - hidden pearls

57

Dagger - Module - Composition @SvenRuppert

be careful, Singletons are only Singletons

inside a Module instance

final Main mainB = objectGraphB.get(Main.class);

final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());final Main mainA = objectGraphA.get(Main.class);

objectGraphA.inject(main);

objectGraphB.inject(main);

could be chaos ;-)

Page 389: DI Frameworks - hidden pearls

58

Dagger - internals @SvenRuppert

Dagger is using Reflection at Compile Timeduring compile -> creating dot-files

SubSubSevice-Module

digraph G1 { concentrate = true;}

SubService - Module

digraph G1 { concentrate = true; n2 [label="@Named SubService"]; n2 -> SubServiceA; SubServiceA -> SubSubService;}

Page 390: DI Frameworks - hidden pearls

59

Dagger2 - a fork from Google @SvenRuppert

Targets for Dagger2 are

Page 391: DI Frameworks - hidden pearls

59

Dagger2 - a fork from Google @SvenRuppert

Targets for Dagger2 areremove all runtime reflection

Page 392: DI Frameworks - hidden pearls

59

Dagger2 - a fork from Google @SvenRuppert

Targets for Dagger2 areremove all runtime reflection

reduce Module - complexity

Page 393: DI Frameworks - hidden pearls

59

Dagger2 - a fork from Google @SvenRuppert

Targets for Dagger2 areremove all runtime reflection

reduce Module - complexityintroduce an interface for

Module-Composite

Page 394: DI Frameworks - hidden pearls

59

Dagger2 - a fork from Google @SvenRuppert

Targets for Dagger2 areremove all runtime reflection

reduce Module - complexityintroduce an interface for

Module-Composite

generate as much as possible from the boilerplate (binding) code

Page 395: DI Frameworks - hidden pearls

59

Dagger2 - a fork from Google @SvenRuppert

Targets for Dagger2 areremove all runtime reflection

reduce Module - complexityintroduce an interface for

Module-Composite

generate as much as possible from the boilerplate (binding) code

changes in Modules will lead to clean / compile

Page 396: DI Frameworks - hidden pearls

60

Dagger2 - a fork from Google @SvenRuppert

to migrate to Dagger2 (from Dagger1)

Page 397: DI Frameworks - hidden pearls

60

Dagger2 - a fork from Google @SvenRuppert

to migrate to Dagger2 (from Dagger1)

you will „hold“ the Modules

Page 398: DI Frameworks - hidden pearls

60

Dagger2 - a fork from Google @SvenRuppert

to migrate to Dagger2 (from Dagger1)

you will „hold“ the Modules

ObjectGraph is removed

Page 399: DI Frameworks - hidden pearls

60

Dagger2 - a fork from Google @SvenRuppert

to migrate to Dagger2 (from Dagger1)

you will „hold“ the Modules

ObjectGraph is removed

DaggerXYZ - Builder is introduced

Page 400: DI Frameworks - hidden pearls

60

Dagger2 - a fork from Google @SvenRuppert

to migrate to Dagger2 (from Dagger1)

you will „hold“ the Modules

ObjectGraph is removed

DaggerXYZ - Builder is introduced

Now—— Step by Step

Page 401: DI Frameworks - hidden pearls

61

Dagger2 - a fork from Google @SvenRuppert

@Modulepublic class BusinessModule { @Provides MainService provideMainService(MainServiceImpl mainService) { return mainService; } @Provides @Named(„A") SubService provideSubServiceA(SubServiceA subService) { return subService; } @Provides @Named(„B") SubService provideSubServiceB(SubServiceB subService) { return subService; } @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); } @Provides SubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl) { return subServiceA; } else { return subServiceB; } }}

(library = false injects = {Main.class} complete = true)

Page 402: DI Frameworks - hidden pearls

61

Dagger2 - a fork from Google @SvenRuppert

@Modulepublic class BusinessModule { @Provides MainService provideMainService(MainServiceImpl mainService) { return mainService; } @Provides @Named(„A") SubService provideSubServiceA(SubServiceA subService) { return subService; } @Provides @Named(„B") SubService provideSubServiceB(SubServiceB subService) { return subService; } @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); } @Provides SubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl) { return subServiceA; } else { return subServiceB; } }}

(library = false injects = {Main.class} complete = true)

Module Migration - remove attributes

Page 403: DI Frameworks - hidden pearls

61

Dagger2 - a fork from Google @SvenRuppert

@Modulepublic class BusinessModule { @Provides MainService provideMainService(MainServiceImpl mainService) { return mainService; } @Provides @Named(„A") SubService provideSubServiceA(SubServiceA subService) { return subService; } @Provides @Named(„B") SubService provideSubServiceB(SubServiceB subService) { return subService; } @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); } @Provides SubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl) { return subServiceA; } else { return subServiceB; } }}

(library = false injects = {Main.class} complete = true)

Module Migration - remove attributes

Page 404: DI Frameworks - hidden pearls

61

Dagger2 - a fork from Google @SvenRuppert

@Modulepublic class BusinessModule { @Provides MainService provideMainService(MainServiceImpl mainService) { return mainService; } @Provides @Named(„A") SubService provideSubServiceA(SubServiceA subService) { return subService; } @Provides @Named(„B") SubService provideSubServiceB(SubServiceB subService) { return subService; } @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); } @Provides SubService provideSubService(@Named("A") SubService subServiceA, @Named("B") SubService subServiceB) { if(Context.getInstance().defaultImpl) { return subServiceA; } else { return subServiceB; } }}

Module Migration - remove attributes

Page 405: DI Frameworks - hidden pearls

62

Dagger2 - a fork from Google @SvenRuppert

@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }

Page 406: DI Frameworks - hidden pearls

62

Dagger2 - a fork from Google @SvenRuppert

Module - Composite

@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }

Page 407: DI Frameworks - hidden pearls

62

Dagger2 - a fork from Google @SvenRuppert

Module - Composite

@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }

Page 408: DI Frameworks - hidden pearls

62

Dagger2 - a fork from Google @SvenRuppert

Module - Composite

@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }

Factory-Method

Page 409: DI Frameworks - hidden pearls

62

Dagger2 - a fork from Google @SvenRuppert

Module - Composite

@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }

Factory-Method

Page 410: DI Frameworks - hidden pearls

63

Dagger2 - a fork from Google @SvenRuppert

MainService main = new MainService();final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());final MainService main = objectGraph.get(MainService.class);

Page 411: DI Frameworks - hidden pearls

63

Dagger2 - a fork from Google @SvenRuppert

Dagger1 Bootstrap

MainService main = new MainService();final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());final MainService main = objectGraph.get(MainService.class);

Page 412: DI Frameworks - hidden pearls

63

Dagger2 - a fork from Google @SvenRuppert

Dagger1 Bootstrap

MainService main = new MainService();final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());final MainService main = objectGraph.get(MainService.class);

Page 413: DI Frameworks - hidden pearls

63

Dagger2 - a fork from Google @SvenRuppert

Dagger1 Bootstrap

MainService main = new MainService();final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());final MainService main = objectGraph.get(MainService.class);

final BusinessService businessService = DaggerBusinessService.builder() .businessModule(new BusinessModule()) .build();final MainService mainService = businessService.makeMainService();

Page 414: DI Frameworks - hidden pearls

63

Dagger2 - a fork from Google @SvenRuppert

Dagger1 Bootstrap

MainService main = new MainService();final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());final MainService main = objectGraph.get(MainService.class);

final BusinessService businessService = DaggerBusinessService.builder() .businessModule(new BusinessModule()) .build();final MainService mainService = businessService.makeMainService();

generated Builder

Page 415: DI Frameworks - hidden pearls

63

Dagger2 - a fork from Google @SvenRuppert

Dagger1 Bootstrap

MainService main = new MainService();final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());final MainService main = objectGraph.get(MainService.class);

final BusinessService businessService = DaggerBusinessService.builder() .businessModule(new BusinessModule()) .build();final MainService mainService = businessService.makeMainService();

generated Builder

Page 416: DI Frameworks - hidden pearls

63

Dagger2 - a fork from Google @SvenRuppert

Dagger1 Bootstrap

MainService main = new MainService();final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());final MainService main = objectGraph.get(MainService.class);

Factory-Method

final BusinessService businessService = DaggerBusinessService.builder() .businessModule(new BusinessModule()) .build();final MainService mainService = businessService.makeMainService();

generated Builder

Page 417: DI Frameworks - hidden pearls

63

Dagger2 - a fork from Google @SvenRuppert

Dagger1 Bootstrap

MainService main = new MainService();final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());final MainService main = objectGraph.get(MainService.class);

Factory-Method

final BusinessService businessService = DaggerBusinessService.builder() .businessModule(new BusinessModule()) .build();final MainService mainService = businessService.makeMainService();

generated Builder

Page 418: DI Frameworks - hidden pearls

64

HK2 @SvenRuppert

HK2 is an implementation of JSR-330 in a JavaSE environment

Page 419: DI Frameworks - hidden pearls

64

HK2 @SvenRuppert

HK2 is an implementation of JSR-330 in a JavaSE environment

Run Level Services

Custom lifecycles and scopes

Events

AOP and other proxies

Custom injection resolutionAssisted injection

Just In Time injection resolutionCustom validation and security

Page 420: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

Page 421: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

minimal Setup

Page 422: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

minimal Setup

Page 423: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>${hk2.version}</version></dependency>

minimal Setup

Page 424: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>${hk2.version}</version></dependency>

minimal Setup

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-runlevel</artifactId> <version>${hk2.version}</version></dependency>

Page 425: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>${hk2.version}</version></dependency>

minimal Setup

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-runlevel</artifactId> <version>${hk2.version}</version></dependency>

META-INF/hk2-locator

Page 426: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>${hk2.version}</version></dependency>

minimal Setup

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-runlevel</artifactId> <version>${hk2.version}</version></dependency>

automatic Service Propagation

META-INF/hk2-locator

Page 427: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>${hk2.version}</version></dependency>

minimal Setup

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-runlevel</artifactId> <version>${hk2.version}</version></dependency>

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-metadata-generator</artifactId> <version>${hk2.version}</version></dependency>

automatic Service Propagation

META-INF/hk2-locator

Page 428: DI Frameworks - hidden pearls

65

HK2 - bootstrap @SvenRuppert

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>${hk2.version}</version></dependency>

<plugin> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-inhabitant-generator</artifactId> <version>${hk2.version}</version> <executions> <execution> <goals> <goal>generate-inhabitants</goal> </goals> </execution> </executions></plugin>

minimal Setup

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-runlevel</artifactId> <version>${hk2.version}</version></dependency>

<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-metadata-generator</artifactId> <version>${hk2.version}</version></dependency>

automatic Service Propagation

META-INF/hk2-locator

Page 429: DI Frameworks - hidden pearls

66

HK2 - main diffs @SvenRuppert

@Contractpublic interface BusinessService { String doWork(String txt); }

@Service public class BusinessServiceImplA implements BusinessService { @Override public String doWork(final String txt) { return this.getClass().getSimpleName() + "-" + txt; }}

Page 430: DI Frameworks - hidden pearls

66

HK2 - main diffs @SvenRuppert

@Contractpublic interface BusinessService { String doWork(String txt); }

@Service public class BusinessServiceImplA implements BusinessService { @Override public String doWork(final String txt) { return this.getClass().getSimpleName() + "-" + txt; }}

Page 431: DI Frameworks - hidden pearls

66

HK2 - main diffs @SvenRuppert

@Contractpublic interface BusinessService { String doWork(String txt); }

@Service public class BusinessServiceImplA implements BusinessService { @Override public String doWork(final String txt) { return this.getClass().getSimpleName() + "-" + txt; }}

must fit together

Page 432: DI Frameworks - hidden pearls

67

HK2 - main diffs @SvenRuppert

Page 433: DI Frameworks - hidden pearls

67

HK2 - main diffs @SvenRuppert

@Inject public BusinessService service;

Page 434: DI Frameworks - hidden pearls

67

HK2 - main diffs @SvenRuppert

@Inject public BusinessService service;

@Inject public Provider<BusinessService> serviceProvider;

Page 435: DI Frameworks - hidden pearls

67

HK2 - main diffs @SvenRuppert

@Inject public BusinessServiceImplB serviceProxy;

@Inject public BusinessService service;

@Inject public Provider<BusinessService> serviceProvider;

Page 436: DI Frameworks - hidden pearls

67

HK2 - main diffs @SvenRuppert

@Inject public BusinessServiceImplB serviceProxy;

@Inject public BusinessService service;

@Inject public Provider<BusinessService> serviceProvider;

@Inject public IterableProvider<BusinessService> servicesProvider;

Page 437: DI Frameworks - hidden pearls

67

HK2 - main diffs @SvenRuppert

@Inject public BusinessServiceImplB serviceProxy;

@Inject public BusinessService service;

@Inject public Provider<BusinessService> serviceProvider;

@Inject public IterableProvider<BusinessService> servicesProvider;

custom injection resolver

Page 438: DI Frameworks - hidden pearls

67

HK2 - main diffs @SvenRuppert

@Inject public BusinessServiceImplB serviceProxy;

@Inject public BusinessService service;

@Inject public Provider<BusinessService> serviceProvider;

@Inject public IterableProvider<BusinessService> servicesProvider;

@Retention(RUNTIME) @Target( { METHOD })@InjectionPointIndicator public @interface AlternateInject {}

custom injection resolver

Page 439: DI Frameworks - hidden pearls

67

HK2 - main diffs @SvenRuppert

@Inject public BusinessServiceImplB serviceProxy;

@Inject public BusinessService service;

@Inject public Provider<BusinessService> serviceProvider;

@Inject public IterableProvider<BusinessService> servicesProvider;

public class MyInjectResolver implements InjectionResolver<AlternateInject>

@Retention(RUNTIME) @Target( { METHOD })@InjectionPointIndicator public @interface AlternateInject {}

custom injection resolver

Page 440: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

Page 441: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code

Page 442: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

Page 443: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

Model-Validating

Page 444: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

clear Lifecycle Model-Validating

Page 445: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

clear Lifecycleclear ErrorMessages

Model-Validating

Page 446: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

clear Lifecycle

easy debuggingclear ErrorMessages

Model-Validating

Page 447: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

clear Lifecycle

easy debuggingclear ErrorMessages

Model-Validating

Dynamic Context

Page 448: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

clear Lifecycle

easy Mocking

easy debuggingclear ErrorMessages

Model-Validating

Dynamic Context

Page 449: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

clear Lifecycle

easy Mocking

easy debuggingclear ErrorMessages

Model-Validating

Dynamic Context

lead to functional aspects

Page 450: DI Frameworks - hidden pearls

68

RapidPM - Dynamic CDI @SvenRuppert

Design Goals:

minimum Binding Code customizing

clear Lifecycle

easy Mocking

easy debuggingclear ErrorMessages

Model-Validating

Dynamic Context

lead to functional aspectseasy plugin development

Page 451: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

minimum Binding Code

Page 452: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject

minimum Binding Code

Page 453: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

Page 454: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

Page 455: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

public class ServiceImpl_A implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_A“ + txt; }}

Page 456: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

public class ServiceImpl_A implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_A“ + txt; }}

Page 457: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

public class ServiceImpl_A implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_A“ + txt; }}

easy relationship

Page 458: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

public class ServiceImpl_A implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_A " + txt; }}

easy relationship

Page 459: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

public class ServiceImpl_A implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_A " + txt; }}

easy relationship

public class ServiceImpl_B implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_B“ + txt; }}

Page 460: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

public class ServiceImpl_A implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_A " + txt; }}

easy relationship

public class ServiceImpl_B implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_B“ + txt; }}

Page 461: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

public class ServiceImpl_A implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_A " + txt; }}

public class ServiceImpl_B implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_B“ + txt; }}

Page 462: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

public interface Service { String doWork(String txt); }

minimum Binding Code

public class ServiceImpl_A implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_A " + txt; }}

public class ServiceImpl_B implements Service { @Override public String doWork(final String txt) { return “ServiceImpl_B“ + txt; }}

how to decide?

Page 463: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

Page 464: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

Page 465: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

Page 466: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

Page 467: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

Page 468: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

Page 469: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

producer

Page 470: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

producer

Page 471: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

producerproducer

Page 472: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

Page 473: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

Page 474: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

producer resolver

Page 475: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

producer resolver

Page 476: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

producer

producer resolver

Page 477: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

producer

producer resolver

Page 478: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Inject like in JSR 299

minimum Binding Code

interface impl. class impl. class class resolver

producerproducer

producer resolver

Page 479: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

Page 480: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(

Page 481: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,

Page 482: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,

add DropWizard Metrics

Page 483: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,

add DropWizard Metrics

Page 484: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,

add DropWizard Metrics

Page 485: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,

add DropWizard Metricsadd Logging, (log4j?)

Page 486: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,

add DropWizard Metricsadd Logging, (log4j?)

Page 487: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,

add DropWizard Metricsadd Logging, (log4j?)

Page 488: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

Page 489: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

Page 490: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

Page 491: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

generate Static-Impl

Page 492: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

generate Static-Impl

Page 493: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,concurrent=CreationStrategy.METHOD_SCOPED

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

generate Static-Impl

Page 494: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,concurrent=CreationStrategy.METHOD_SCOPED

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

generate Static-Impl

for VirtualProxy

Page 495: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,concurrent=CreationStrategy.METHOD_SCOPED

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

generate Static-Impl

for VirtualProxy

Page 496: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

@Injectcustomizing

@Proxy(metrics=true,logging=true,virtual=true,

);type=ProxyType.Static,concurrent=CreationStrategy.METHOD_SCOPED

add DropWizard Metricsadd Logging, (log4j?)VirtualProxy

generate Static-Impl

for VirtualProxy

Page 497: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

clear Lifecyclemultiple @Postconstruct

annotated Methods are supported

Instances are created from Top to bottom

Page 498: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Model-Validating

DI.checkActiveModel()

Model and BusinessModelRules?

what is the right time?how often is needed?

Page 499: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes

what is the right place to define?what is the right Scope?

how often do you need Scopes?

Page 500: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes how often do you need Scopes?

Page 501: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes how often do you need Scopes?

per Request - create every time new

Page 502: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes how often do you need Scopes?

per Request - create every time new

per JVM - Singleton

Page 503: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes how often do you need Scopes?

per Request - create every time new

per JVM - Singleton

per Session - Proxy redirected to Session

Page 504: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes how often do you need Scopes?

per Request - create every time new

per JVM - Singleton

per Session - Proxy redirected to Session

?

Page 505: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes how often do you need Scopes?

per Request - create every time new

per JVM - Singleton

per Session - Proxy redirected to Session

?what is the right Scope?

Page 506: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right Scope?

Page 507: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right Scope?

Business-Scope ?

Page 508: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right Scope?

Business-Scope ?

Wizard - Scope ?

Page 509: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right Scope?

Business-Scope ?

Wizard - Scope ?

user - defined Scopes

Page 510: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right Scope?

Business-Scope ?

Wizard - Scope ?

user - defined Scopes

what is the right place to define?

Page 511: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?

Page 512: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject

Page 513: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope

Page 514: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service

Page 515: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

Page 516: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

public interface Service { String doWork(String txt); }

Page 517: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

public interface Service { String doWork(String txt); }

@Scope

Page 518: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

public interface Service { String doWork(String txt); }

@Scope

Page 519: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

public interface Service { String doWork(String txt); }

@ScopeServiceImpl

Page 520: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

public interface Service { String doWork(String txt); }

@ScopeServiceImpl

public interface Service { String doWork(String txt); }

Page 521: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

public interface Service { String doWork(String txt); }

@ScopeServiceImpl

public interface Service { String doWork(String txt); }

Page 522: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

public interface Service { String doWork(String txt); }

@ScopeServiceImpl

public interface Service { String doWork(String txt); }

public class ServiceImpl { String doWork(String txt);}

Page 523: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject @Scope Service ServiceImpl

public interface Service { String doWork(String txt); }

@ScopeServiceImpl

public interface Service { String doWork(String txt); }

public class ServiceImpl { String doWork(String txt);}

@Scope

Page 524: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?

Page 525: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?

activate Singleton for Service

activate Singleton for ServiceImplB

DI.activateScope( ScopeName, Class );

Page 526: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject

activate Singleton for Service

activate Singleton for ServiceImplB

DI.activateScope( ScopeName, Class );

Page 527: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject Service

activate Singleton for Service

activate Singleton for ServiceImplB

DI.activateScope( ScopeName, Class );

Page 528: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject Service

activate Singleton for Service

activate Singleton for ServiceImplB

DI.activateScope( ScopeName, Class );

Page 529: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject Service ServiceImpl A

activate Singleton for Service

activate Singleton for ServiceImplB

DI.activateScope( ScopeName, Class );

Page 530: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject Service ServiceImpl A

activate Singleton for Service

activate Singleton for ServiceImplB

DI.activateScope( ScopeName, Class );

Page 531: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject Service ServiceImpl A

ServiceImpl B

activate Singleton for Service

activate Singleton for ServiceImplB

DI.activateScope( ScopeName, Class );

Page 532: DI Frameworks - hidden pearls

RapidPM - Dynamic CDI @SvenRuppert

Scopes what is the right place to define?@Inject Service ServiceImpl A

ServiceImpl B

activate Singleton for Service

activate Singleton for ServiceImplB

DI.activateScope( ScopeName, Class );

this could change during Runtime

Page 533: DI Frameworks - hidden pearls

82

What could fit for ? @SvenRuppert

Webserver

Desktop

MicroserviceIoT

Page 534: DI Frameworks - hidden pearls

83

Summary @SvenRuppert

BasicsWeld

DaggerDagger2

HK2RapidPM - DDI

BoonDI

Page 535: DI Frameworks - hidden pearls

Summary

84

@SvenRuppert

If you are interested…

have a look at GITHUB

ProxyBuilder

Dynamic-Dependency-Injection

Java-Microservice

or contact me ;-) @SvenRuppert

Page 536: DI Frameworks - hidden pearls

Summary

84

@SvenRuppert

If you are interested…

have a look at GITHUB

ProxyBuilder

Dynamic-Dependency-Injection

Java-Microservice

or contact me ;-) @SvenRuppert

Thank You !!!