{"id":448,"date":"2024-06-15T20:25:20","date_gmt":"2024-06-15T19:25:20","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=448"},"modified":"2024-06-30T20:27:25","modified_gmt":"2024-06-30T19:27:25","slug":"einfuehrung-in-dependency-injection-mit-google-guice","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=448","title":{"rendered":"Einf\u00fchrung in Dependency-Injection mit Google Guice"},"content":{"rendered":"\n<p>Google Guice ist ein leichtgewichtiges Framework f\u00fcr die Abh\u00e4ngigkeitsinjektion (Dependency Injection, DI) in Java-Anwendungen. Es wurde von Google entwickelt und bietet eine Alternative zu anderen DI-Frameworks wie Spring. Abh\u00e4ngigkeitsinjektion ist ein Entwurfsmuster, das die Erstellung und Aufl\u00f6sung von Abh\u00e4ngigkeiten in Softwareanwendungen vereinfacht. Durch die Verwendung von DI k\u00f6nnen Entwickler lose gekoppelte und leicht testbare Codebasen erstellen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Grundlagen der Abh\u00e4ngigkeitsinjektion<\/h3>\n\n\n\n<p>Abh\u00e4ngigkeitsinjektion ist eine Form der Inversion of Control (IoC), bei der die Erstellung von Objekten und deren Abh\u00e4ngigkeiten von einem Container oder Framework verwaltet wird. Anstatt dass ein Objekt seine Abh\u00e4ngigkeiten selbst erstellt, werden diese vom DI-Container bereitgestellt. Dies erleichtert das Testen, da Abh\u00e4ngigkeiten einfach durch Mock-Objekte ersetzt werden k\u00f6nnen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Einf\u00fchrung in Google Guice<\/h3>\n\n\n\n<p>Google Guice bietet eine moderne und intuitive M\u00f6glichkeit, DI in Java zu implementieren. Es nutzt Annotations und Java-Code-Konfigurationen anstelle von XML-Konfigurationen, was die Entwicklung und Wartung von Anwendungen vereinfacht.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Hauptkomponenten von Guice<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Module:<\/strong> Ein Modul ist eine Klasse, die die Bindungen definiert, d.h. wie Abh\u00e4ngigkeiten aufgel\u00f6st werden sollen. Es implementiert das <code>com.google.inject.Module<\/code>-Interface und \u00fcberschreibt die <code>configure<\/code>-Methode.<\/li>\n\n\n\n<li><strong>Injector:<\/strong> Der Injector ist verantwortlich f\u00fcr die Erstellung von Objekten und deren Abh\u00e4ngigkeiten. Er wird verwendet, um Instanzen von Klassen zu erhalten.<\/li>\n\n\n\n<li><strong>Bindings:<\/strong> Bindungen definieren, wie eine Abh\u00e4ngigkeit aufgel\u00f6st werden soll. Zum Beispiel, welche Implementierung einer Schnittstelle verwendet werden soll.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Erste Schritte mit Google Guice<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Installation<\/h4>\n\n\n\n<p>Um Google Guice in Ihrem Projekt zu verwenden, m\u00fcssen Sie es in Ihre Build-Konfiguration aufnehmen. F\u00fcr ein Maven-Projekt f\u00fcgen Sie die folgende Abh\u00e4ngigkeit in Ihrer <code>pom.xml<\/code> hinzu:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>com.google.inject<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>guice<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>5.0.1<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>F\u00fcr ein Gradle-Projekt f\u00fcgen Sie die folgende Zeile in Ihrer <code>build.gradle<\/code> hinzu:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">implementation <span class=\"hljs-string\">'com.google.inject:guice:5.0.1'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Ein einfaches Beispiel<\/h4>\n\n\n\n<p>Betrachten wir ein einfaches Beispiel, um die Grundprinzipien von Guice zu verstehen.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Erstellen Sie eine Schnittstelle <code>Service<\/code>:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">Service<\/span> <\/span>{\n    void execute();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Implementieren Sie die Schnittstelle:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ServiceImpl<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Service<\/span> <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void execute() {\n        System.out.println(<span class=\"hljs-string\">\"Service is executing...\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Erstellen Sie ein Modul, um die Bindung zu konfigurieren:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.google.inject.AbstractModule;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AppModule<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">AbstractModule<\/span> <\/span>{\n    @Override\n    protected <span class=\"hljs-keyword\">void<\/span> configure() {\n        bind(Service.class).to(ServiceImpl.class);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Verwenden Sie Guice, um eine Instanz von <code>Service<\/code> zu erstellen:<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.google.inject.Guice;\n<span class=\"hljs-keyword\">import<\/span> com.google.inject.Injector;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Main<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        Injector injector = Guice.createInjector(<span class=\"hljs-keyword\">new<\/span> AppModule());\n        Service service = injector.getInstance(Service.class);\n        service.execute();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel wird die Implementierung <code>ServiceImpl<\/code> an die Schnittstelle <code>Service<\/code> gebunden. Wenn <code>service.execute()<\/code> aufgerufen wird, wird die Methode <code>execute<\/code> der Klasse <code>ServiceImpl<\/code> ausgef\u00fchrt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Erweiterte Funktionen von Google Guice<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Singleton-Scope<\/h4>\n\n\n\n<p>Guice unterst\u00fctzt verschiedene Scopes, wobei der Singleton-Scope einer der am h\u00e4ufigsten verwendeten ist. Um eine Singleton-Bindung zu erstellen, k\u00f6nnen Sie das <code>@Singleton<\/code>-Annotation oder die <code>Scopes.SINGLETON<\/code>-Konstante verwenden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.google.inject.Singleton;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AppModule<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">AbstractModule<\/span> <\/span>{\n    @Override\n    protected <span class=\"hljs-keyword\">void<\/span> configure() {\n        bind(Service.class).to(ServiceImpl.class).in(Singleton.class);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Oder:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">public <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AppModule<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">AbstractModule<\/span> <\/span>{\n    @Override\n    protected <span class=\"hljs-keyword\">void<\/span> configure() {\n        bind(Service.class).to(ServiceImpl.class).in(Scopes.SINGLETON);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Feld- und Methodeninjektion<\/h4>\n\n\n\n<p>Neben der Konstruktorinjektion unterst\u00fctzt Guice auch Feld- und Methodeninjektion. Dies kann n\u00fctzlich sein, wenn die Abh\u00e4ngigkeiten nach der Erstellung des Objekts gesetzt werden m\u00fcssen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Client<\/span> <\/span>{\n    @Inject\n    <span class=\"hljs-keyword\">private<\/span> Service service;\n\n    <span class=\"hljs-keyword\">public<\/span> void performTask() {\n        service.execute();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Provider<\/h4>\n\n\n\n<p>Ein Provider bietet eine M\u00f6glichkeit, komplexe Logik zur Erstellung von Abh\u00e4ngigkeiten zu kapseln. Er implementiert das <code>com.google.inject.Provider<\/code>-Interface:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> com.google.inject.Provider;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ServiceProvider<\/span> <span class=\"hljs-title\">implements<\/span> <span class=\"hljs-title\">Provider<\/span>&lt;<span class=\"hljs-title\">Service<\/span>&gt; <\/span>{\n    @Override\n    public Service <span class=\"hljs-keyword\">get<\/span>() {\n        <span class=\"hljs-comment\">\/\/ komplexe Logik zur Erstellung von Service-Instanzen<\/span>\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> ServiceImpl();\n    }\n}\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AppModule<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">AbstractModule<\/span> <\/span>{\n    @Override\n    protected <span class=\"hljs-keyword\">void<\/span> configure() {\n        bind(Service.class).toProvider(ServiceProvider.class);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Vorteile von Google Guice<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Einfachheit:<\/strong> Guice bietet eine klare und einfache API f\u00fcr die Konfiguration von DI.<\/li>\n\n\n\n<li><strong>Leichte Gewichtung:<\/strong> Im Vergleich zu anderen DI-Frameworks wie Spring ist Guice leichter und schneller.<\/li>\n\n\n\n<li><strong>Typensicherheit:<\/strong> Da Guice stark typisiert ist, treten Fehler fr\u00fchzeitig zur Kompilierzeit auf.<\/li>\n\n\n\n<li><strong>Flexibilit\u00e4t:<\/strong> Guice bietet verschiedene Optionen zur Konfiguration von Abh\u00e4ngigkeiten, wie Provider, Scopes und benutzerdefinierte Annotationen.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Nachteile von Google Guice<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Eingeschr\u00e4nkte Integration:<\/strong> Im Vergleich zu Spring bietet Guice weniger vorgefertigte Module f\u00fcr die Integration mit anderen Frameworks und Bibliotheken.<\/li>\n\n\n\n<li><strong>Weniger Funktionen:<\/strong> Spring bietet eine umfangreichere Sammlung von Funktionen und Tools, was in einigen Szenarien n\u00fctzlich sein kann.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Google Guice ist ein leistungsf\u00e4higes und flexibles DI-Framework, das Entwicklern hilft, saubere, gut strukturierte und leicht wartbare Java-Anwendungen zu erstellen. Es bietet eine moderne Alternative zu XML-basierten DI-Frameworks und ist besonders n\u00fctzlich in Szenarien, in denen Einfachheit und Leistung entscheidend sind. Trotz einiger Einschr\u00e4nkungen ist Guice eine ausgezeichnete Wahl f\u00fcr viele Projekte und bietet eine solide Grundlage f\u00fcr die Implementierung von Abh\u00e4ngigkeitsinjektion in Java-Anwendungen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Google Guice ist ein leichtgewichtiges Framework f\u00fcr die Abh\u00e4ngigkeitsinjektion (Dependency Injection, DI) in Java-Anwendungen. Es wurde von Google entwickelt und bietet eine Alternative zu anderen DI-Frameworks wie Spring. Abh\u00e4ngigkeitsinjektion ist ein Entwurfsmuster, das die Erstellung und Aufl\u00f6sung von Abh\u00e4ngigkeiten in Softwareanwendungen vereinfacht. Durch die Verwendung von DI k\u00f6nnen Entwickler lose gekoppelte und leicht testbare Codebasen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-448","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/448","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=448"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/448\/revisions"}],"predecessor-version":[{"id":449,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/448\/revisions\/449"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}