Click here to load reader
Upload
sven-ruppert
View
1.196
Download
0
Embed Size (px)
Citation preview
prepare for…
DI - Frameworks..some hidden pearls
@SvenRuppert has been coding java since 1996
Head of R&D / Fellow
reply
Germany - Munich
2
@SvenRuppert has been coding java since 1996
3
@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
4
Save harbor statement
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.)
5
The Basics @SvenRuppert
targets we want to reach
5
The Basics @SvenRuppert
targets we want to reach
divide a system into modules
5
The Basics @SvenRuppert
targets we want to reach
divide a system into modulesdecouple contract and implementations
5
The Basics @SvenRuppert
targets we want to reach
divide a system into modulesdecouple contract and implementations
decrease complexity
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
6
The Basics @SvenRuppert
6
The Basics @SvenRuppert
public List<Data> execute() { //.... return result; }
6
The Basics @SvenRuppert
public List<Data> execute() { //.... return result; }
import java.util.List;
6
The Basics @SvenRuppert
public List<Data> execute() { //.... return result; }
import java.util.List;
final List<Data> result = new ArrayList<>();
6
The Basics @SvenRuppert
public List<Data> execute() { //.... return result; }
import java.util.List;import java.util.ArrayList;
final List<Data> result = new ArrayList<>();
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()
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
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
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
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?
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?
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?
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?
8
The Basics @SvenRuppert
what will be the right Implementation?
9
The Basics @SvenRuppert
what will be the right Implementation?with default Java SE
9
The Basics @SvenRuppert
what will be the right Implementation?with default Java SE
public class ListFactory { public static void main(String[] args) { }}
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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?
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();
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();
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();
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();
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();
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();
11
The Basics @SvenRuppert
what is the right time to decide?
what is the right freq. to decide?
Scopes:
11
The Basics @SvenRuppert
what is the right time to decide?
what is the right freq. to decide?
Scopes:Application / Singleton
11
The Basics @SvenRuppert
what is the right time to decide?
what is the right freq. to decide?
Scopes:Application / Singleton
Session
11
The Basics @SvenRuppert
what is the right time to decide?
what is the right freq. to decide?
Scopes:Application / Singleton
Session
Request
11
The Basics @SvenRuppert
what is the right time to decide?
what is the right freq. to decide?
Scopes:Application / Singleton
Session
Request
Method
12
The Basics @SvenRuppert
12
The Basics @SvenRuppert
public interface Service { String doWork();}
12
The Basics @SvenRuppert
public interface Service { String doWork();} public static class Service2Inject implements Service {
public String doWork() { return null; }}
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(); }}
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
13
The Basics @SvenRuppert
public interface Service { String doWork();} public static class Service2Inject implements Service {
public String doWork() { return null; }}
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(); }}
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
14
The Basics @SvenRuppert
public interface Service { String doWork();} public static class Service2Inject implements Service {
public String doWork() { return null; }}
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(); }}
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
15
The Basics @SvenRuppert
BusinessModulA businessModulA = new BusinessModulA(new Service2Inject());businessModulA.work();
15
The Basics @SvenRuppert
BusinessModulA businessModulA = new BusinessModulA(new Service2Inject());businessModulA.work();
T1: create the instance of the Service
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
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
16
The Basics @SvenRuppert
final BusinessModulB businessModulB = new BusinessModulB();businessModulB.setService(new Service2Inject());businessModulB.work();
16
The Basics @SvenRuppert
final BusinessModulB businessModulB = new BusinessModulB();businessModulB.setService(new Service2Inject());businessModulB.work();
T1: create the instance of the BusinessModul
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
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
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
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();
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
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
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
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
Dependency Injection
18
@SvenRuppert
every framework will have a strategy how to
Dependency Injection
18
@SvenRuppert
every framework will have a strategy how to
resolve the Implementation
Dependency Injection
18
@SvenRuppert
every framework will have a strategy how to
resolve the Implementationcreate/set the instance
Dependency Injection
18
@SvenRuppert
every framework will have a strategy how to
resolve the Implementationcreate/set the instance
manage the timeline
A short view on WELD-SE - CDI
19
@SvenRuppert
website : http://weld.cdi-spec.org/
the following features are available ( SE )
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
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
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
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
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
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
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
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
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
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
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
A short view on WELD-SE - CDI
20
@SvenRuppert
A short view on WELD-SE - CDI
20
@SvenRuppert
Dependency injection with qualifiers and alternatives
A short view on WELD-SE - CDI
20
@SvenRuppert
Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }
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; }}
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;
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
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
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
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
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
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
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
A short view on WELD-SE - CDI
21
@SvenRuppert
Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }
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; }}
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;
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;
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;
A short view on WELD-SE - CDI
22
@SvenRuppert
Dependency injection with qualifiers and alternativespublic interface Service { String doWork(String txt); }
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; }}
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;
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>
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>
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>
A short view on WELD-SE - CDI
23
@SvenRuppert
Dependency injection with qualifiers and alternatives
A short view on WELD-SE - CDI
23
@SvenRuppert
Dependency injection with qualifiers and alternatives
@Inject Service service;
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();
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;
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();
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();
A short view on WELD-SE - CDI
24
@SvenRuppert
programmatically injection
A short view on WELD-SE - CDI
24
@SvenRuppert
programmatically injection
@Inject Service service;
A short view on WELD-SE - CDI
24
@SvenRuppert
programmatically injection
@Inject Service service; Service service = container.select(Service.class).get();
A short view on WELD-SE - CDI
24
@SvenRuppert
programmatically injection
@Inject Service service; Service service = container.select(Service.class).get();
A short view on WELD-SE - CDI
24
@SvenRuppert
programmatically injection
@Inject Service service; Service service = container.select(Service.class).get();
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) {
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) {
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();
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();
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);
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);
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);
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);
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);
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);
BoonDI - Project bootstrapping
25
@SvenRuppert
website : https://github.com/boonproject/boon/wiki/Boon-DI
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
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
BoonDI - not a replacement for …..
26
@SvenRuppert
website : https://github.com/boonproject/boon/wiki/Boon-DI
BoonDI - not a replacement for …..
26
@SvenRuppert
website : https://github.com/boonproject/boon/wiki/Boon-DI
@In (old from Seam)
BoonDI - not a replacement for …..
26
@SvenRuppert
website : https://github.com/boonproject/boon/wiki/Boon-DI
@PostConstruct @In (old from Seam)
BoonDI - not a replacement for …..
26
@SvenRuppert
website : https://github.com/boonproject/boon/wiki/Boon-DI
@PostConstruct @In (old from Seam)@Autowired (from Spring)
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)
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)
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)
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)
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
BoonDI - not a replacement for …..
27
@SvenRuppert
website : https://github.com/boonproject/boon/wiki/Boon-DI
Boon is not using - AnnotationProcessing - ByteCode - Manipulation
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?
28
BoonDI - Hello World @SvenRuppert
28
BoonDI - Hello World @SvenRuppert
public class Service { @Inject SubService subService; @PostConstruct public void printInfoPostconstruct() { System.out.println("printInfoPostconstruct() " + this.getClass().getSimpleName()); }}
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()); }}
29
BoonDI - Hello World @SvenRuppert
29
BoonDI - Hello World @SvenRuppert
29
BoonDI - Hello World @SvenRuppert
29
BoonDI - Hello World @SvenRuppert
29
BoonDI - Hello World @SvenRuppert
final Module module = DependencyInjection.classes(Service.class);
29
BoonDI - Hello World @SvenRuppert
final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);
30
BoonDI - Hello World @SvenRuppert
final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);
30
BoonDI - Hello World @SvenRuppert
final Service service1 = module.get(Service.class);final Module module = DependencyInjection.classes(Service.class);
SubService == null
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);
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);
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);
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);
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);
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);
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);
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);
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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(); }
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
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
33
BoonDI - Modules @SvenRuppert
at runtime you can
addModule() removeModule()
34
BoonDI - Modules - be careful :-) @SvenRuppert
34
BoonDI - Modules - be careful :-) @SvenRuppert
public class ServiceModuleA {
34
BoonDI - Modules - be careful :-) @SvenRuppert
public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");
34
BoonDI - Modules - be careful :-) @SvenRuppert
public class ServiceModuleA {public Service provideServiceA() { out.println("provideServiceAA ...");public Service provideServiceB() { out.println("provideServiceAB ...");
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 ...");
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 {
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 ...");
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 ...");
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 ...");
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());
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());
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());
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());
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());
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());
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);
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);
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
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);
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);
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
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
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
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);
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);
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
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());
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);
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);
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
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);
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);
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
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
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
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);
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);
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
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??
37
BoonDI - Modules - be careful :-) @SvenRuppert
public class ServiceModuleA { public Service provideServiceB() {"provideServiceAB ...");
public class ServiceModuleB { public Service provideServiceB() {"provideServiceBB ...");
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());
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());
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());
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());
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
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)
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)
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)
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);
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);
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
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
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
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
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
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
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
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
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
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
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
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
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
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…
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…
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…
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…
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…
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…
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…
39
BoonDI - Modules @SvenRuppert
add Modules…methodMap = new ConcurrentHashMap<>( ); keys (String) will be sorted
but what will be the sort-order?
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());}
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
40
BoonDI - Prototypes @SvenRuppert
40
BoonDI - Prototypes @SvenRuppert
You will create a Prototyp
40
BoonDI - Prototypes @SvenRuppert
You will create a Prototyp
this will be registered inside a Module
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
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 ?
41
BoonDI - Prototypes @SvenRuppert
41
BoonDI - Prototypes @SvenRuppert
public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}
41
BoonDI - Prototypes @SvenRuppert
public class DemoClass { private String name; private int nummer; private SubDemo subDemo;}
public interface SubDemo { }
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 { }
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 { }
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);
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();
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();
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);
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);
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);
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
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
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
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();
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();
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
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
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);
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);
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);
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);
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);
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);
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);
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);
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();
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;
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;
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;
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;
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;
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;
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
45
BoonDI - Suppliers / @Named @SvenRuppert
45
BoonDI - Suppliers / @Named @SvenRuppert
final Module suppliers = DependencyInjection.suppliers( );
45
BoonDI - Suppliers / @Named @SvenRuppert
final Module suppliers = DependencyInjection.suppliers( );
ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//default
45
BoonDI - Suppliers / @Named @SvenRuppert
final Module suppliers = DependencyInjection.suppliers( );
ProviderInfo.providerOf(ServiceImpl.class, ServiceImplA::new),//defaultProviderInfo.providerOf("ImplA", ServiceImpl.class, ServiceImplA::new),
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)
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)
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)
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)
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)
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);
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)
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")
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")
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)
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)
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
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
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
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
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
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
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
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
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
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(); }
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);
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);
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..")
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..")
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..")
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..")
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..")
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
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
48
Dagger - bootstrapping @SvenRuppert
http://square.github.io/dagger/
48
Dagger - bootstrapping @SvenRuppert
<dependency> <groupId>com.squareup.dagger</groupId> <artifactId>dagger</artifactId> <version>1.2.2</version> </dependency>
http://square.github.io/dagger/
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/
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/
49
Dagger - bootstrapping @SvenRuppert
//bootstrapping final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());
49
Dagger - bootstrapping @SvenRuppert
//bootstrapping final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());
final Main main = objectGraph.get(Main.class);
49
Dagger - bootstrapping @SvenRuppert
//bootstrapping final ObjectGraph objectGraph = ObjectGraph.create(new BusinessModule());
objectGraph.inject(new Main());
final Main main = objectGraph.get(Main.class);
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?
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?
50
Dagger - bootstrapping @SvenRuppert
50
Dagger - bootstrapping @SvenRuppert
public interface MainService { String execute(String txt); }
50
Dagger - bootstrapping @SvenRuppert
public class MainServiceImpl implements MainService { public String execute(String txt){ return "MainServiceImpl _ " + txt; }}
public interface MainService { String execute(String txt); }
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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
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
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
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
52
Dagger - work with Context @SvenRuppert
52
Dagger - work with Context @SvenRuppert
@ProvidesSubSubService provideSubSubService() { return new SubSubServiceImpl(); }
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; }
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; }}
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; }}
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; }}
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
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
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
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
54
Dagger - work with Context @SvenRuppert
Context must be self-
implemented
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(); }}
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(); }}
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
55
Dagger - Module - Composition @SvenRuppert
55
Dagger - Module - Composition @SvenRuppert
@Module(library = true, complete = true)public class SubSubServiceModule { @Provides SubSubService provideSubSubService() { return new SubSubServiceImpl(); }}
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; } }
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; } }
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; } }
56
Dagger - Module - Composition @SvenRuppert
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(); } }}
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(); } }}
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
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
57
Dagger - Module - Composition @SvenRuppert
57
Dagger - Module - Composition @SvenRuppert
final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());
57
Dagger - Module - Composition @SvenRuppert
final ObjectGraph objectGraphA = ObjectGraph.create(new BusinessModule());final ObjectGraph objectGraphB = ObjectGraph.create(new BusinessModule());
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);
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);
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);
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);
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);
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);
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 ;-)
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;}
59
Dagger2 - a fork from Google @SvenRuppert
Targets for Dagger2 are
59
Dagger2 - a fork from Google @SvenRuppert
Targets for Dagger2 areremove all runtime reflection
59
Dagger2 - a fork from Google @SvenRuppert
Targets for Dagger2 areremove all runtime reflection
reduce Module - complexity
59
Dagger2 - a fork from Google @SvenRuppert
Targets for Dagger2 areremove all runtime reflection
reduce Module - complexityintroduce an interface for
Module-Composite
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
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
60
Dagger2 - a fork from Google @SvenRuppert
to migrate to Dagger2 (from Dagger1)
60
Dagger2 - a fork from Google @SvenRuppert
to migrate to Dagger2 (from Dagger1)
you will „hold“ the Modules
60
Dagger2 - a fork from Google @SvenRuppert
to migrate to Dagger2 (from Dagger1)
you will „hold“ the Modules
ObjectGraph is removed
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
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
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)
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
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
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
62
Dagger2 - a fork from Google @SvenRuppert
@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }
62
Dagger2 - a fork from Google @SvenRuppert
Module - Composite
@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }
62
Dagger2 - a fork from Google @SvenRuppert
Module - Composite
@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }
62
Dagger2 - a fork from Google @SvenRuppert
Module - Composite
@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }
Factory-Method
62
Dagger2 - a fork from Google @SvenRuppert
Module - Composite
@Component(modules = BusinessModule.class)public interface BusinessService { MainService makeMainService(); }
Factory-Method
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);
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);
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);
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();
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
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
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
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
64
HK2 @SvenRuppert
HK2 is an implementation of JSR-330 in a JavaSE environment
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
65
HK2 - bootstrap @SvenRuppert
65
HK2 - bootstrap @SvenRuppert
minimal Setup
65
HK2 - bootstrap @SvenRuppert
minimal Setup
65
HK2 - bootstrap @SvenRuppert
<dependency> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-locator</artifactId> <version>${hk2.version}</version></dependency>
minimal Setup
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>
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
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
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
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
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; }}
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; }}
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
67
HK2 - main diffs @SvenRuppert
67
HK2 - main diffs @SvenRuppert
@Inject public BusinessService service;
67
HK2 - main diffs @SvenRuppert
@Inject public BusinessService service;
@Inject public Provider<BusinessService> serviceProvider;
67
HK2 - main diffs @SvenRuppert
@Inject public BusinessServiceImplB serviceProxy;
@Inject public BusinessService service;
@Inject public Provider<BusinessService> serviceProvider;
67
HK2 - main diffs @SvenRuppert
@Inject public BusinessServiceImplB serviceProxy;
@Inject public BusinessService service;
@Inject public Provider<BusinessService> serviceProvider;
@Inject public IterableProvider<BusinessService> servicesProvider;
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
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
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
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
minimum Binding Code
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
minimum Binding Code customizing
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
minimum Binding Code customizing
Model-Validating
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
minimum Binding Code customizing
clear Lifecycle Model-Validating
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
minimum Binding Code customizing
clear Lifecycleclear ErrorMessages
Model-Validating
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
minimum Binding Code customizing
clear Lifecycle
easy debuggingclear ErrorMessages
Model-Validating
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
minimum Binding Code customizing
clear Lifecycle
easy debuggingclear ErrorMessages
Model-Validating
Dynamic Context
68
RapidPM - Dynamic CDI @SvenRuppert
Design Goals:
minimum Binding Code customizing
clear Lifecycle
easy Mocking
easy debuggingclear ErrorMessages
Model-Validating
Dynamic Context
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
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
RapidPM - Dynamic CDI @SvenRuppert
minimum Binding Code
RapidPM - Dynamic CDI @SvenRuppert
@Inject
minimum Binding Code
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
public interface Service { String doWork(String txt); }
minimum Binding Code
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; }}
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; }}
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
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
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; }}
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; }}
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; }}
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?
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
producer
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
producer
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
producerproducer
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
producer resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
producer resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
producer
producer resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
producer
producer resolver
RapidPM - Dynamic CDI @SvenRuppert
@Inject like in JSR 299
minimum Binding Code
interface impl. class impl. class class resolver
producerproducer
producer resolver
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,
add DropWizard Metrics
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,
add DropWizard Metrics
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,
add DropWizard Metrics
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,
add DropWizard Metricsadd Logging, (log4j?)
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,
add DropWizard Metricsadd Logging, (log4j?)
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,virtual=true,
add DropWizard Metricsadd Logging, (log4j?)
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,virtual=true,
add DropWizard Metricsadd Logging, (log4j?)VirtualProxy
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,virtual=true,
add DropWizard Metricsadd Logging, (log4j?)VirtualProxy
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,
add DropWizard Metricsadd Logging, (log4j?)VirtualProxy
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,
add DropWizard Metricsadd Logging, (log4j?)VirtualProxy
generate Static-Impl
RapidPM - Dynamic CDI @SvenRuppert
@Injectcustomizing
@Proxy(metrics=true,logging=true,virtual=true,type=ProxyType.Static,
add DropWizard Metricsadd Logging, (log4j?)VirtualProxy
generate Static-Impl
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
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
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
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
RapidPM - Dynamic CDI @SvenRuppert
clear Lifecyclemultiple @Postconstruct
annotated Methods are supported
Instances are created from Top to bottom
RapidPM - Dynamic CDI @SvenRuppert
Model-Validating
DI.checkActiveModel()
Model and BusinessModelRules?
what is the right time?how often is needed?
RapidPM - Dynamic CDI @SvenRuppert
Scopes
what is the right place to define?what is the right Scope?
how often do you need Scopes?
RapidPM - Dynamic CDI @SvenRuppert
Scopes how often do you need Scopes?
RapidPM - Dynamic CDI @SvenRuppert
Scopes how often do you need Scopes?
per Request - create every time new
RapidPM - Dynamic CDI @SvenRuppert
Scopes how often do you need Scopes?
per Request - create every time new
per JVM - Singleton
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
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
?
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?
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right Scope?
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right Scope?
Business-Scope ?
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right Scope?
Business-Scope ?
Wizard - Scope ?
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right Scope?
Business-Scope ?
Wizard - Scope ?
user - defined Scopes
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right Scope?
Business-Scope ?
Wizard - Scope ?
user - defined Scopes
what is the right place to define?
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?@Inject
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?@Inject @Scope
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?@Inject @Scope Service
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?@Inject @Scope Service ServiceImpl
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?@Inject @Scope Service ServiceImpl
public interface Service { String doWork(String txt); }
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?@Inject @Scope Service ServiceImpl
public interface Service { String doWork(String txt); }
@Scope
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?@Inject @Scope Service ServiceImpl
public interface Service { String doWork(String txt); }
@Scope
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?@Inject @Scope Service ServiceImpl
public interface Service { String doWork(String txt); }
@ScopeServiceImpl
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); }
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); }
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);}
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
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?
RapidPM - Dynamic CDI @SvenRuppert
Scopes what is the right place to define?
activate Singleton for Service
activate Singleton for ServiceImplB
DI.activateScope( ScopeName, Class );
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 );
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 );
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 );
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 );
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 );
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 );
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
82
What could fit for ? @SvenRuppert
Webserver
Desktop
MicroserviceIoT
83
Summary @SvenRuppert
BasicsWeld
DaggerDagger2
HK2RapidPM - DDI
BoonDI
Summary
84
@SvenRuppert
If you are interested…
have a look at GITHUB
ProxyBuilder
Dynamic-Dependency-Injection
Java-Microservice
or contact me ;-) @SvenRuppert
Summary
84
@SvenRuppert
If you are interested…
have a look at GITHUB
ProxyBuilder
Dynamic-Dependency-Injection
Java-Microservice
or contact me ;-) @SvenRuppert
Thank You !!!