{"id":227,"date":"2024-02-05T21:08:29","date_gmt":"2024-02-05T20:08:29","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=227"},"modified":"2024-02-21T21:11:21","modified_gmt":"2024-02-21T20:11:21","slug":"die-cacheable-annotation-in-spring-webanwendungen","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=227","title":{"rendered":"Die @Cacheable-Annotation in Spring Webanwendungen"},"content":{"rendered":"\n<p>Spring, ein beliebtes Java-Framework, bietet eine breite Palette von Funktionen zur Vereinfachung der Entwicklung von Enterprise-Anwendungen. Eine dieser Funktionen ist die Cache-Unterst\u00fctzung, die mithilfe von Annotations wie <code>@Cacheable<\/code> implementiert wird. Diese Annotation erm\u00f6glicht es Entwicklern, die Leistung ihrer Anwendungen zu verbessern, indem sie bestimmte Methoden oder Funktionen cachen, um den Zugriff auf wiederholende Daten zu beschleunigen. In diesem Artikel werfen wir einen eingehenden Blick auf die <code>@Cacheable<\/code>-Annotation in Spring und verstehen, wie sie in Webanwendungen effektiv eingesetzt werden kann.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Einf\u00fchrung in die Caching-Konzepte<\/h3>\n\n\n\n<p>Bevor wir uns mit der <code>@Cacheable<\/code>-Annotation befassen, ist es wichtig, die Grundlagen des Cachings zu verstehen. Caching ist eine Technik, bei der Ergebnisse von Operationen oder Abfragen zwischengespeichert werden, um den Zugriff auf dieselben Daten zu beschleunigen. Dies ist besonders n\u00fctzlich, wenn Operationen teuer in Bezug auf Zeit oder Ressourcen sind, aber die Ergebnisse relativ konstant sind.<\/p>\n\n\n\n<p>In einer typischen Spring-Anwendung kann Caching auf verschiedene Weisen implementiert werden. Die <code>@Cacheable<\/code>-Annotation ist eine davon und erm\u00f6glicht die einfache Integration von Caching-Funktionalit\u00e4ten in den Code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verwendung der @Cacheable-Annotation<\/h3>\n\n\n\n<p>Die <code>@Cacheable<\/code>-Annotation wird auf Methoden angewendet, um die Ergebnisse dieser Methoden zwischenspeichern zu k\u00f6nnen. Wenn eine Methode mit dieser Annotation aufgerufen wird, \u00fcberpr\u00fcft Spring zuerst den Cache, um zu sehen, ob die Methode bereits mit denselben Argumenten aufgerufen wurde. Falls ja, wird das zwischengespeicherte Ergebnis zur\u00fcckgegeben, ohne die Methode tats\u00e4chlich auszuf\u00fchren. Andernfalls wird die Methode normal ausgef\u00fchrt, und das Ergebnis wird im Cache gespeichert, um zuk\u00fcnftige Aufrufe zu beschleunigen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Service\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyService<\/span> <\/span>{\n\n    @Cacheable(<span class=\"hljs-string\">\"myCache\"<\/span>)\n    public <span class=\"hljs-built_in\">String<\/span> getDataFromDatabase(<span class=\"hljs-built_in\">String<\/span> key) {\n        <span class=\"hljs-comment\">\/\/ Logik zur Datenbankabfrage<\/span>\n        <span class=\"hljs-keyword\">return<\/span> result;\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\">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 <code>getDataFromDatabase<\/code>-Methode mit der <code>@Cacheable<\/code>-Annotation markiert und dem Cache mit dem Namen &#8222;myCache&#8220; zugeordnet. Wenn die Methode mit demselben <code>key<\/code>-Argument erneut aufgerufen wird, wird das zwischengespeicherte Ergebnis zur\u00fcckgegeben, ohne die Datenbankabfrage erneut durchzuf\u00fchren.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Konfiguration des Caches<\/h3>\n\n\n\n<p>Die <code>@Cacheable<\/code>-Annotation allein reicht nicht aus; wir m\u00fcssen auch den Cache selbst konfigurieren. Spring bietet daf\u00fcr eine Vielzahl von Cache-Implementierungen, wie zum Beispiel Ehcache, Guava, oder auch einfache Memory-Caches. Die Auswahl h\u00e4ngt von den spezifischen Anforderungen und Pr\u00e4ferenzen der Anwendung ab.<\/p>\n\n\n\n<p>Hier ist ein Beispiel f\u00fcr die Konfiguration von Ehcache in einer Spring-Anwendung:<\/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\">@Configuration\n@EnableCaching\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CacheConfig<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">CachingConfigurerSupport<\/span> <\/span>{\n\n    @Bean\n    <span class=\"hljs-keyword\">public<\/span> EhCacheManagerFactoryBean ehCacheManagerFactory() {\n        EhCacheManagerFactoryBean factory = <span class=\"hljs-keyword\">new<\/span> EhCacheManagerFactoryBean();\n        factory.setConfigLocation(<span class=\"hljs-keyword\">new<\/span> ClassPathResource(<span class=\"hljs-string\">\"ehcache.xml\"<\/span>));\n        factory.setShared(<span class=\"hljs-keyword\">true<\/span>);\n        <span class=\"hljs-keyword\">return<\/span> factory;\n    }\n\n    @Override\n    @Bean\n    <span class=\"hljs-keyword\">public<\/span> CacheManager cacheManager() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> EhCacheCacheManager(ehCacheManagerFactory().getObject());\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>In diesem Beispiel wird der Ehcache als Cache-Provider verwendet. Die <code>ehcache.xml<\/code>-Datei kann genutzt werden, um detaillierte Konfigurationen vorzunehmen, wie zum Beispiel die G\u00fcltigkeitsdauer von Cache-Eintr\u00e4gen oder die maximale Anzahl der Eintr\u00e4ge im Cache.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Spezifische Parameter f\u00fcr die @Cacheable-Annotation<\/h3>\n\n\n\n<p>Die <code>@Cacheable<\/code>-Annotation bietet verschiedene Attribute, die die Feinabstimmung des Cache-Verhaltens erm\u00f6glichen. Einige der wichtigsten Attribute sind:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>value<\/strong>: Der Name des Caches, in dem das Ergebnis gespeichert wird.<\/li>\n\n\n\n<li><strong>key<\/strong>: Ein optionales Attribut, das einen benutzerdefinierten Schl\u00fcssel f\u00fcr den Cache-Eintrag festlegt. Standardm\u00e4\u00dfig wird der Hash-Wert der Methode-Parameter als Schl\u00fcssel verwendet.<\/li>\n\n\n\n<li><strong>condition<\/strong>: Eine SpEL (Spring Expression Language)-Ausdruck, der bestimmt, ob der Cache-Eintrag erstellt werden soll oder nicht.<\/li>\n\n\n\n<li><strong>unless<\/strong>: Eine weitere SpEL-Ausdruck, der verwendet wird, um zu \u00fcberpr\u00fcfen, ob der Cache-Eintrag nicht erstellt werden soll.<\/li>\n<\/ul>\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\">@Cacheable(value = <span class=\"hljs-string\">\"myCache\"<\/span>, key = <span class=\"hljs-string\">\"#id\"<\/span>, condition = <span class=\"hljs-string\">\"#result != null\"<\/span>, unless = <span class=\"hljs-string\">\"#result.length() &lt; 3\"<\/span>)\npublic <span class=\"hljs-built_in\">String<\/span> getLargeData(<span class=\"hljs-built_in\">String<\/span> id) {\n    <span class=\"hljs-comment\">\/\/ Logik zur Datenbankabfrage<\/span>\n    <span class=\"hljs-keyword\">return<\/span> result;\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>In diesem Beispiel wird die <code>getLargeData<\/code>-Methode mit einem benutzerdefinierten Schl\u00fcssel (<code>#id<\/code>) versehen, einer Bedingung (<code>#result != null<\/code>), und einer Ausnahmeregel (<code>#result.length() &lt; 3<\/code>). Dies erm\u00f6glicht eine fein abgestimmte Kontrolle dar\u00fcber, wann der Cache aktualisiert oder verwendet werden soll.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Integration mit Spring Boot<\/h3>\n\n\n\n<p>Spring Boot erleichtert die Integration von Caching-Funktionalit\u00e4ten erheblich. Durch Hinzuf\u00fcgen der entsprechenden Starter-Abh\u00e4ngigkeiten, beispielsweise <code>spring-boot-starter-cache<\/code>, kann die Anwendung schnell mit einem Standard-Cache-Provider ausgestattet werden.<\/p>\n\n\n\n<p>Die Standardkonfiguration in Spring Boot verwendet einen einfachen Memory-Cache. Wenn jedoch eine fortschrittlichere Konfiguration erforderlich ist, k\u00f6nnen zus\u00e4tzliche Abh\u00e4ngigkeiten, wie <code>spring-boot-starter-data-ehcache<\/code> f\u00fcr Ehcache, hinzugef\u00fcgt werden.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" 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>org.springframework.boot<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>spring-boot-starter-cache<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n<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>org.springframework.boot<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>spring-boot-starter-data-ehcache<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/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-4\"><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<h3 class=\"wp-block-heading\">Best Practices und \u00dcberlegungen<\/h3>\n\n\n\n<p>Beim Einsatz von Caching in Spring-Anwendungen sollten Entwickler einige bew\u00e4hrte Praktiken ber\u00fccksichtigen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Abw\u00e4gung von Performance und Speicherverbrauch<\/strong>: Caching kann die Leistung verbessern, aber es kann auch den Speicherverbrauch erh\u00f6hen. Es ist wichtig, eine ausgewogene L\u00f6sung zu finden, die den besten Kompromiss zwischen Leistung und Ressourcennutzung bietet.<\/li>\n\n\n\n<li><strong>Invalidierung des Caches<\/strong>: Es ist wichtig sicherzustellen, dass der Cache aktualisiert oder invalidiert wird, wenn die zugrunde liegenden Daten ge\u00e4ndert werden. Dies kann durch die Verwendung der <code>@CacheEvict<\/code>-Annotation oder anderer Mechanismen erfolgen.<\/li>\n\n\n\n<li><strong>Tests f\u00fcr gecachte Methoden<\/strong>: Bei der Implementierung von Caching ist es entscheidend, entsprechende Tests zu schreiben, um sicherzustellen, dass die Caching-Logik korrekt funktioniert und keine unerw\u00fcnschten Seiteneffekte verursacht.<\/li>\n\n\n\n<li><strong>Monitoring und Logging<\/strong>: Implementieren Sie ein robustes Monitoring und Logging, um das Verhalten des Caches zu \u00fcberwachen. Dies hilft dabei, potenzielle Probleme fr\u00fchzeitig zu erkennen und zu beheben.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>Die <code>@Cacheable<\/code>-Annotation in Spring bietet eine effektive M\u00f6glichkeit, Caching in Webanwendungen zu integrieren und die Leistung zu optimieren. Durch die richtige Konfiguration und Verwendung k\u00f6nnen Entwickler die Ausf\u00fchrung von wiederholten Operationen beschleunigen und die Ressourcennutzung optimieren. Bei der Integration von Caching in Spring-Anwendungen ist es jedoch wichtig, die spezifischen Anforderungen der Anwendung zu ber\u00fccksichtigen und bew\u00e4hrte Praktiken zu befolgen. Caching ist ein leistungsstarkes Werkzeug, das mit Bedacht eingesetzt werden sollte, um optimale Ergebnisse zu erzielen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spring, ein beliebtes Java-Framework, bietet eine breite Palette von Funktionen zur Vereinfachung der Entwicklung von Enterprise-Anwendungen. Eine dieser Funktionen ist die Cache-Unterst\u00fctzung, die mithilfe von Annotations wie @Cacheable implementiert wird. Diese Annotation erm\u00f6glicht es Entwicklern, die Leistung ihrer Anwendungen zu verbessern, indem sie bestimmte Methoden oder Funktionen cachen, um den Zugriff auf wiederholende Daten zu [&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-227","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\/227","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=227"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/227\/revisions"}],"predecessor-version":[{"id":228,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/227\/revisions\/228"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}