*/
public abstract class Injectable {
- private static final SimpleInjector INJECTOR = new SimpleInjector(
- InjectorFactoryBuilder.getInjectorFactory());
+ private final SimpleInjector injector =
+ InjectorFactoryBuilder.getInjector();
/**
* Inheritance style constructor.
*/
protected Injectable() {
- INJECTOR.inject(this);
+ injector.inject(this);
}
+
+ /**
+ * Gets the default injector.
+ * @return Injector.
+ */
+ public SimpleInjector getInjector() {
+ return injector;
+ }
}
/**
* Utility for obtaining an implementation of the {@link InjectorFactory} using
- * {@link ServiceLoader}.
+ * {@link ServiceLoader} and for obtaining a {@link SimpleInjector}.
+ *
+ * The builder takes care that the factory and simple injector are built only once.
+ * For test code, make sure to call {@link #setInjectorFactory(InjectorFactory)}
+ * before each test case to force the retrieval of a new factory and injector. This
+ * is important because if the simple injector is not created again it will use
+ * cached {@link Injector} instances from other tests.
*
* @author Erik Brakkee
*/
public class InjectorFactoryBuilder {
private static InjectorFactory FACTORY;
+
+ private static SimpleInjector INJECTOR;
/**
* Sets the injector factory. This is useful for testing.
*/
public static void setInjectorFactory(InjectorFactory aFactory) {
FACTORY = aFactory;
+ INJECTOR = new SimpleInjector(aFactory);
}
/**
public static InjectorFactory getInjectorFactory() {
if (FACTORY == null) {
FACTORY = findInjectorFactory();
+ INJECTOR = new SimpleInjector(FACTORY);
}
return FACTORY;
}
+
+ public static SimpleInjector getInjector() {
+ getInjectorFactory();
+ return INJECTOR;
+ }
/**
* Finds the injector factory musing <code>ServiceLoader</code>