1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.grouplens.grapht;
21
22 import org.grouplens.grapht.BindingFunctionBuilder.RuleSet;
23 import org.grouplens.grapht.solver.BindingFunction;
24 import org.grouplens.grapht.solver.DefaultDesireBindingFunction;
25 import org.grouplens.grapht.solver.DefaultInjector;
26 import org.grouplens.grapht.solver.ProviderBindingFunction;
27 import org.grouplens.grapht.context.ContextPattern;
28 import org.grouplens.grapht.util.ClassLoaders;
29 import org.grouplens.grapht.util.Types;
30
31 import java.lang.annotation.Annotation;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class InjectorBuilder extends AbstractContext {
47 private final ClassLoader classLoader;
48 private final BindingFunctionBuilder builder;
49 private CachePolicy cachePolicy;
50 private boolean enableProviderInjection;
51
52
53
54
55
56 private InjectorBuilder(ClassLoader loader, BindingFunctionBuilder bld) {
57 classLoader = loader;
58 builder = bld;
59 cachePolicy = CachePolicy.MEMOIZE;
60 enableProviderInjection = false;
61 }
62
63
64
65
66
67
68
69
70
71
72 @Deprecated
73 public InjectorBuilder(Module... modules) {
74 this(Types.getDefaultClassLoader(), new BindingFunctionBuilder());
75 for (Module m: modules) {
76 applyModule(m);
77 }
78 }
79
80
81
82
83
84
85
86 public static InjectorBuilder create(ClassLoader loader, Module... modules) {
87 InjectorBuilder bld = new InjectorBuilder(loader, new BindingFunctionBuilder(true));
88 for (Module m: modules) {
89 bld.applyModule(m);
90 }
91 return bld;
92 }
93
94
95
96
97
98
99 public static InjectorBuilder create(Module... modules) {
100 return create(ClassLoaders.inferDefault(), modules);
101 }
102
103
104
105
106
107
108
109
110
111 public InjectorBuilder setDefaultCachePolicy(CachePolicy policy) {
112 if (policy.equals(CachePolicy.NO_PREFERENCE)) {
113 throw new IllegalArgumentException("Cannot be NO_PREFERENCE");
114 }
115
116 cachePolicy = policy;
117 return this;
118 }
119
120
121
122
123
124
125
126
127 public InjectorBuilder setProviderInjectionEnabled(boolean enable) {
128 enableProviderInjection = enable;
129 return this;
130 }
131
132 @Override
133 public <T> Binding<T> bind(Class<T> type) {
134 return builder.getRootContext().bind(type);
135 }
136
137 @Override
138 public <T> Binding<T> bindAny(Class<T> type) {
139 return builder.getRootContext().bindAny(type);
140 }
141
142 @Override
143 public Context within(Class<?> type) {
144 return builder.getRootContext().within(type);
145 }
146
147 @Override
148 public Context within(Class<? extends Annotation> qualifier, Class<?> type) {
149 return builder.getRootContext().within(qualifier, type);
150 }
151
152 @Override
153 public Context within(Annotation annot, Class<?> type) {
154 return builder.getRootContext().within(annot, type);
155 }
156
157 @Override
158 public Context matching(ContextPattern pattern) {
159 return builder.getRootContext().matching(pattern);
160 }
161
162 @Override
163 public Context at(Class<?> type) {
164 return builder.getRootContext().at(type);
165 }
166
167 @Override
168 public Context at(Class<? extends Annotation> qualifier, Class<?> type) {
169 return builder.getRootContext().at(qualifier, type);
170 }
171
172 @Override
173 public Context at(Annotation annot, Class<?> type) {
174 return builder.getRootContext().at(annot, type);
175 }
176
177
178
179
180
181
182
183
184 public InjectorBuilder applyModule(Module module) {
185 builder.applyModule(module);
186 return this;
187 }
188
189 public Injector build() {
190 BindingFunction[] functions;
191 if (enableProviderInjection) {
192 functions = new BindingFunction[] {
193 builder.build(RuleSet.EXPLICIT),
194 builder.build(RuleSet.INTERMEDIATE_TYPES),
195 builder.build(RuleSet.SUPER_TYPES),
196 new ProviderBindingFunction(),
197 DefaultDesireBindingFunction.create(classLoader)
198 };
199 } else {
200 functions = new BindingFunction[] {
201 builder.build(RuleSet.EXPLICIT),
202 builder.build(RuleSet.INTERMEDIATE_TYPES),
203 builder.build(RuleSet.SUPER_TYPES),
204 DefaultDesireBindingFunction.create(classLoader)
205 };
206 }
207
208 return new DefaultInjector(cachePolicy, 100, functions);
209 }
210 }