{"id":180,"date":"2024-01-22T00:40:43","date_gmt":"2024-01-21T23:40:43","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=180"},"modified":"2024-01-24T00:42:31","modified_gmt":"2024-01-23T23:42:31","slug":"die-primary-annotation-in-spring-boot","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=180","title":{"rendered":"Die @Primary-Annotation in Spring Boot"},"content":{"rendered":"\n<p>Spring Boot ist ein leistungsstarkes Framework f\u00fcr die Entwicklung von Java-Anwendungen. Es vereinfacht die Konfiguration und den Einsatz von Anwendungen und bietet eine Vielzahl von Funktionen, um die Entwicklung effizienter und produktiver zu gestalten. Eine der n\u00fctzlichen Annotationen in Spring Boot ist die @Primary-Annotation, die dazu dient, die Standardkomponente auszuw\u00e4hlen, wenn mehrere Kandidaten f\u00fcr eine Injektion verf\u00fcgbar sind.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Warum @Primary?<\/h2>\n\n\n\n<p>In Spring Boot k\u00f6nnen Sie verschiedene Implementierungen f\u00fcr dieselbe Schnittstelle oder denselben Dienst erstellen. Wenn Sie mehrere Beans desselben Typs haben und Spring eine Injektion durchf\u00fchrt, k\u00f6nnte es zu Unsicherheiten dar\u00fcber kommen, welches Bean ausgew\u00e4hlt werden soll. Hier kommt die @Primary-Annotation ins Spiel. Sie erm\u00f6glicht es, eine prim\u00e4re Implementierung zu kennzeichnen, die standardm\u00e4\u00dfig ausgew\u00e4hlt wird, wenn mehrere Kandidaten verf\u00fcgbar sind.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Verwendung der @Primary-Annotation<\/h2>\n\n\n\n<p>Um die @Primary-Annotation zu verwenden, setzen Sie sie einfach auf die Klasse oder Methode, die Sie als bevorzugte Implementierung markieren m\u00f6chten. Hier ist ein einfaches Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" 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\">PaymentProvider<\/span> <\/span>{\n    void processPayment();\n}\n\n@Component\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CreditCardPaymentProvider<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">PaymentProvider<\/span> <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void processPayment() {\n        System.out.println(<span class=\"hljs-string\">\"Processing payment via credit card.\"<\/span>);\n    }\n}\n\n@Component\n@Primary\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PayPalPaymentProvider<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">PaymentProvider<\/span> <\/span>{\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void processPayment() {\n        System.out.println(<span class=\"hljs-string\">\"Processing payment via PayPal.\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><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<p>In diesem Beispiel haben wir zwei Implementierungen der <code>PaymentProvider<\/code>-Schnittstelle: <code>CreditCardPaymentProvider<\/code> und <code>PayPalPaymentProvider<\/code>. Durch Hinzuf\u00fcgen der @Primary-Annotation zur Klasse <code>PayPalPaymentProvider<\/code> geben wir an, dass diese Implementierung bevorzugt wird, wenn sie in eine Komponente injiziert wird.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fallstudie: Mehrere Implementierungen, @Primary und @Qualifier<\/h2>\n\n\n\n<p>Angenommen, wir haben einen Service, der eine <code>PaymentProvider<\/code>-Implementierung ben\u00f6tigt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">@Service\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PaymentService<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> PaymentProvider paymentProvider;\n\n    @Autowired\n    <span class=\"hljs-keyword\">public<\/span> PaymentService(PaymentProvider paymentProvider) {\n        this.paymentProvider = paymentProvider;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> void processPayment() {\n        paymentProvider.processPayment();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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<p>Wenn wir jetzt eine Instanz von <code>PaymentService<\/code> erstellen und sie in einen Spring-Container einf\u00fcgen, w\u00fcrde Spring versuchen, eine <code>PaymentProvider<\/code>-Implementierung zu finden. Aufgrund der @Primary-Annotation w\u00fcrde es die <code>PayPalPaymentProvider<\/code> bevorzugen, wenn es mehrere Implementierungen gibt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@SpringBootApplication\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyApplication<\/span> <span class=\"hljs-title\">implements<\/span> <span class=\"hljs-title\">CommandLineRunner<\/span> <\/span>{\n    @Autowired\n    private PaymentService paymentService;\n\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        SpringApplication.run(MyApplication.class, args);\n    }\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> run(<span class=\"hljs-built_in\">String<\/span>... args) {\n        paymentService.processPayment();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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>Dies w\u00fcrde die Ausgabe &#8222;Processing payment via PayPal.&#8220; erzeugen, da die @Primary-Annotation die Auswahl beeinflusst.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">@Primary und @Qualifier kombinieren<\/h2>\n\n\n\n<p>Es ist auch m\u00f6glich, die @Qualifier-Annotation in Verbindung mit @Primary zu verwenden, wenn Sie genau steuern m\u00f6chten, welche Implementierung in einem bestimmten Kontext verwendet wird. Hier ist ein Beispiel:<\/p>\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\">@Service\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PaymentService<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> PaymentProvider creditCardPaymentProvider;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> PaymentProvider payPalPaymentProvider;\n\n    @Autowired\n    <span class=\"hljs-keyword\">public<\/span> PaymentService(@Qualifier(<span class=\"hljs-string\">\"creditCardPaymentProvider\"<\/span>) PaymentProvider creditCardPaymentProvider,\n                          PaymentProvider payPalPaymentProvider) {\n        this.creditCardPaymentProvider = creditCardPaymentProvider;\n        this.payPalPaymentProvider = payPalPaymentProvider;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> void processCreditCardPayment() {\n        creditCardPaymentProvider.processPayment();\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> void processPayPalPayment() {\n        payPalPaymentProvider.processPayment();\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<p>In diesem Fall haben wir zwei <code>PaymentProvider<\/code>-Instanzen, eine f\u00fcr Kreditkarten und eine f\u00fcr PayPal. Durch die Verwendung von @Qualifier k\u00f6nnen wir explizit angeben, welche Implementierung in welchem Kontext verwendet werden soll.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>Die @Primary-Annotation in Spring Boot bietet eine einfache M\u00f6glichkeit, eine bevorzugte Implementierung auszuw\u00e4hlen, wenn mehrere Kandidaten desselben Typs verf\u00fcgbar sind. Dies verbessert die Klarheit des Codes und vereinfacht die Konfiguration von Anwendungen. Wenn jedoch eine feinere Steuerung erforderlich ist, kann die @Qualifier-Annotation in Kombination mit @Primary verwendet werden. Insgesamt ist die @Primary-Annotation ein leistungsstarkes Werkzeug, um die Injektion von Abh\u00e4ngigkeiten in Spring Boot-Anwendungen zu steuern.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spring Boot ist ein leistungsstarkes Framework f\u00fcr die Entwicklung von Java-Anwendungen. Es vereinfacht die Konfiguration und den Einsatz von Anwendungen und bietet eine Vielzahl von Funktionen, um die Entwicklung effizienter und produktiver zu gestalten. Eine der n\u00fctzlichen Annotationen in Spring Boot ist die @Primary-Annotation, die dazu dient, die Standardkomponente auszuw\u00e4hlen, wenn mehrere Kandidaten f\u00fcr eine [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-180","post","type-post","status-publish","format-standard","hentry","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/180","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=180"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/180\/revisions"}],"predecessor-version":[{"id":181,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/180\/revisions\/181"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}