BeanRepository - eine Art Dependency Injection

Hallo zusammen,

ich möchte euch mein BeanRepositoryvorstellen. Es ist ein Framework um die Abhängigkeit einer Klasse aufzulösen. “Dependency Injection” passt von der Bezeichnung her nicht ganz, da die Abhängigkeiten nicht injiziert werden. Die Klasse muss sich ihre Abhängigkeiten selbst mit Hilfe des BeanRepositories besorgen. Dennoch ergeben sich einige Vorteile “echter” DI mit Construktorinjection, wie z.B. final Attribute.

Es gibt schon eine Menge anderer selbstgeschriebener DI Frameworks, und es wird mit Sicherheit auch nicht das letzte sein :wink: Hier im Forum habe ich z.B. eins von Fancy gefunden: net.nanojl:injector

Für mich gab es tatsächlich einen mehr oder weniger guten Grund sich etwas eigenes zu schreiben. Ich hab eine Anwendung die in einer Java Sandbox laufen soll. Dabei wollte ich nicht auf DI verzichten. Dummerweise nutzt Spring die Reflection API (ist in der Sandbox nicht erlaubt) und Guice greift auf bestimmte System Properties zu, die in der Sandbox ebenfalls nicht erlaubt sind (alles ohne Codesignierung). Bevor ich da noch weitersuche, dachte ich mir, ist es eine schöne Übung sich mal selbst darüber Gedanken zu machen wie so etwas funktionieren könnte.

Selbst gesteckte Restriktionen und Anforderungen waren also:
[ul]
[li]Keine Reflection / Annotation Magie
[/li][li]Einfache Java Konfiguration
[/li][li]Singleton und Instance Scope
[/li][li]Fail Fast: möglichst früh nicht erlaubte Konfigurationen erkennen (zirkuläre Abhängigkeiten)
[/li][li]Code ausführen, nachdem eine Bean fertig initialisiert wurde
[/li][/ul]

Seit dem sind noch einige Erweiterungen dazu gekommen, auch wenn sie für die ursprüngliche Anwendung nicht mehr gebraucht wurden. Es hat Spaß gemacht sich Techniken zu überlegen wie so etwas implementiert werden kann und auch interessant zu sehen über welche Probleme man stolpert.

Hier nun endlich etwas Code:


        public void print(final String value) {
            System.out.println(value);
        }
    }

        private final PrintService printService;

        public MailService(final BeanAccessor beans) {
            this.printService = beans.getBean(PrintService.class);
        }

        public void sendMail(final String to, final String text) {
            printService.print("Message for " + to + ": " + text);
        }
    }
            .singleton(MailService.class, MailService::new)
            .singleton(PrintService.class, PrintService::new)
            .build();

    final MailService mailService = repo.getBean(MailService.class);
    mailService.sendMail("Donnie", "Hi!");

Wer das BeanRepository mal ausprobieren möchte, kann es sich in sein Maven Projekt einbinden:
[XML]
com.github.tinosteinort
beanrepository
1.1
[/XML]

Wer Lust hat noch etwas mehr über das BeanRepository zu erfahren, findet hier weitere Informationen.

Viele Grüße, TingelTangel