W poprzedniej notce pisałem o swojej implementacji Dependency Injection, którą użyłem w swojej aplikacji. Po chwili dopiero zauważyłem pewną wadę mojego podejścia. Wszystkie instancje są tworzone przy inicjalizacji obiektu ApplicationModule. Ponieważ bez sensu byłoby tworzenie zawsze wszystkich instancji, nawet tych, które nie będą potrzebne podczas konkretnego uruchomienia aplikacji postanowiłem to zmienić.
Wszystkie zmiany, które zrobiłem w modyfikacji mojej wersji DI dokonałem we wcześniej wspomnianym obiekcie ApplicationModule.
Poniżej przedstawiam listing tego obiektu.
object ApplicationModule { private val instances = collection.mutable.Map[Class[_], (()=>Any, Any)]() { instances.put(classOf[DocumentDao], (documentDAO(), null)) } def wire[T](clazz: Class[T]): T = { val tuple: Option[(() => Any, Any)] = instances.get(clazz) if (tuple.get._2 == null) { instances.put(clazz, tuple.get.copy(_2 = tuple.get._1.apply())) } instances.get(clazz).get._2.asInstanceOf[T] } private def documentDAO(): () => DocumentDao = { () => new DocumentDaoBean(ApplicationContext.getAppContext) } }
Zmiany, których dokonałem to:
- Mapa
Wcześniej mapa przechowywała pary Klasa-Instancja. W obecnej implementacji mapa zawiera pary Klasa na krotkę zawierającą funkcje oraz instancje. Dokładniej mówiąc krotka zawiera funkcje tworzącą daną instancje na konkretną instancje klasy. - Metoda tworząca instancje wstrzykiwanej klasy
Wcześniej metoda zwracała nową instancje danej klasy. W chwili obecnej zwraca funkcje bezparametrową, która po wywołaniu stworzy instancje klasy. - Blok inicjalizacyjny
Do mapy wsadzamy wszystkie pary Klasa-Krotka, których będizemy chcieli używać. Jako drugą wartość krotki ustawiamy null, ponieważ nie chcemy jeszcze tworzyć instancji klasy. - Metoda wire
We wcześniejszym podejściu metoda ta pobierała z mapy instancje żądanej klasy i ją zwracała. W chwili obecnej sprawdzamy czy druga wartość krotki dla żądanej klasy jest null’em. Jeżeli jest to tworzymy nową instancje żądanej klasy i ja zapisujemy w mapie, a następnie zwracamy stworzoną instancje. W przypadku gdy druga wartość krotki nie jest null’em to oczywiście oznacza, że instancja została stworzona wcześniej i właśnie ona zostanie zwrócona.
Dodaj komentarz