{"id":31178,"date":"2025-10-06T22:02:24","date_gmt":"2025-10-06T19:02:24","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/"},"modified":"2025-10-06T22:02:24","modified_gmt":"2025-10-06T19:02:24","slug":"spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/","title":{"rendered":"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz"},"content":{"rendered":"<p><body><\/p>\n<p>Modern Java uygulamalar\u0131 geli\u015ftirirken, karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131n\u0131n labirentinde kaybolmak yerine, kodunuzu daha okunabilir, y\u00f6netilebilir ve g\u00fc\u00e7l\u00fc hale getiren sihirli bir dokunu\u015f ar\u0131yor musunuz? Spring Framework&#8217;\u00fcn kalbinde yer alan anotasyonlar, i\u015fte tam da bu noktada devreye giriyor. Bu kapsaml\u0131 rehberde, Spring anotasyonlar\u0131n\u0131n g\u00fcc\u00fcn\u00fc ve yeni ba\u015flayanlar i\u00e7in ad\u0131m ad\u0131m nas\u0131l ustala\u015f\u0131laca\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Art\u0131k Spring uygulamalar\u0131 geli\u015ftirmek sadece bir yap\u0131land\u0131rma kabusu olmaktan \u00e7\u0131k\u0131p, keyifli bir deneyime d\u00f6n\u00fc\u015febilir!<\/p>\n<p>Spring Framework, Java ekosistemindeki en pop\u00fcler uygulama geli\u015ftirme platformlar\u0131ndan biridir. Bunun temel nedenlerinden biri, geli\u015ftiricilere sundu\u011fu esneklik, mod\u00fclerlik ve y\u00fcksek verimliliktir. Bu \u00f6zelliklerin arkas\u0131ndaki en b\u00fcy\u00fck g\u00fc\u00e7lerden biri ise \u015f\u00fcphesiz Spring anotasyonlar\u0131d\u0131r. Peki, anotasyonlar tam olarak nedir ve Spring&#8217;deki rol\u00fc nedir?<\/p>\n<p>Java&#8217;da anotasyonlar, kodumuza metadata (veri hakk\u0131nda veri) eklemenin bir yoludur. Derleyiciye veya \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131na kod hakk\u0131nda ek bilgi sa\u011flar ancak do\u011frudan program\u0131n mant\u0131\u011f\u0131n\u0131 etkilemezler. \u00d6rne\u011fin, bir metodun test metodu oldu\u011funu belirtmek i\u00e7in <code>@Test<\/code> anotasyonunu kullan\u0131r\u0131z. Spring Framework, bu mekanizmay\u0131 bir ad\u0131m \u00f6teye ta\u015f\u0131yarak, uygulamam\u0131z\u0131n bile\u015fenlerini tan\u0131mlamak, ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek ve davran\u0131\u015flar\u0131n\u0131 yap\u0131land\u0131rmak i\u00e7in yo\u011fun bir \u015fekilde kullan\u0131r.<\/p>\n<p>Spring&#8217;in temel felsefesi olan &#8220;Kontrol\u00fcn Tersine \u00c7evrilmesi&#8221; (Inversion of Control &#8211; IoC) ve &#8220;Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu&#8221; (Dependency Injection &#8211; DI) prensipleri, anotasyonlar arac\u0131l\u0131\u011f\u0131yla hayat bulur. Geleneksel olarak, bir s\u0131n\u0131f kendi ihtiya\u00e7 duydu\u011fu ba\u011f\u0131ml\u0131l\u0131klar\u0131 (\u00f6rne\u011fin, ba\u015fka bir s\u0131n\u0131f\u0131n \u00f6rne\u011fi) kendisi olu\u015fturur veya bulurdu. Ancak IoC ile bu sorumluluk, Spring konteynerine devredilir. Yani, &#8220;Sen bana neye ihtiyac\u0131n oldu\u011funu s\u00f6yle, ben sana onu vereyim&#8221; yakla\u015f\u0131m\u0131 benimsenir. Anotasyonlar, Spring konteynerine hangi s\u0131n\u0131flar\u0131n bile\u015fen oldu\u011funu, hangi ba\u011f\u0131ml\u0131l\u0131klar\u0131n enjekte edilmesi gerekti\u011fini ve bu bile\u015fenlerin nas\u0131l davranmas\u0131 gerekti\u011fini a\u00e7\u0131k\u00e7a belirtmemizi sa\u011flar.<\/p>\n<p>Bu yakla\u015f\u0131m\u0131n getirdi\u011fi faydalar saymakla bitmez: Kod karma\u015f\u0131kl\u0131\u011f\u0131 azal\u0131r, okunabilirlik artar, test edilebilirlik kolayla\u015f\u0131r ve uygulaman\u0131n bak\u0131m\u0131 basitle\u015fir. \u00d6rne\u011fin, bir s\u0131n\u0131f\u0131n bir servis oldu\u011funu belirtmek i\u00e7in uzun XML konfig\u00fcrasyonlar\u0131 yazmak yerine, s\u0131n\u0131f tan\u0131m\u0131n\u0131n \u00fczerine sadece <code>@Service<\/code> anotasyonunu eklemek yeterlidir. Spring, bu anotasyonu g\u00f6rd\u00fc\u011f\u00fcnde ilgili s\u0131n\u0131f\u0131 otomatik olarak tan\u0131r ve y\u00f6netmeye ba\u015flar. Bu sayede, geli\u015ftiriciler i\u015f mant\u0131\u011f\u0131na odaklanabilirken, altyap\u0131sal endi\u015felerden kurtulurlar. Spring anotasyonlar\u0131, kod-yap\u0131land\u0131rma dengesini m\u00fckemmel bir \u015fekilde kurarak, modern Java geli\u015ftirme s\u00fcre\u00e7lerinin vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir.<\/p>\n<div class=\"expert-tip\">\n        <strong>Uzman \u0130pucu:<\/strong> Spring anotasyonlar\u0131, uygulaman\u0131z\u0131n farkl\u0131 katmanlar\u0131n\u0131 net bir \u015fekilde ay\u0131rman\u0131za yard\u0131mc\u0131 olur (\u00f6rne\u011fin, web katman\u0131 i\u00e7in <code>@Controller<\/code>, i\u015f mant\u0131\u011f\u0131 i\u00e7in <code>@Service<\/code>, veri eri\u015fimi i\u00e7in <code>@Repository<\/code>). Bu katmanl\u0131 mimari, uygulaman\u0131n mod\u00fclerli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r.\n    <\/div>\n<h3 id=\"spring-boot-ile-hizli-baslangic-temel-yapilandirma-nasil-yapilir\">Spring Boot ile H\u0131zl\u0131 Ba\u015flang\u0131\u00e7: Temel Yap\u0131land\u0131rma Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Spring Boot, Spring Framework&#8217;\u00fc kullanarak ba\u011f\u0131ms\u0131z, \u00fcretime haz\u0131r Spring uygulamalar\u0131n\u0131 kolayca olu\u015fturmam\u0131z\u0131 sa\u011flayan bir projedir. Spring Boot&#8217;un en b\u00fcy\u00fck avantaj\u0131, &#8220;konfig\u00fcrasyon \u00fczerinde konvansiyon&#8221; yakla\u015f\u0131m\u0131 sayesinde geli\u015ftiricilerin h\u0131zl\u0131 bir \u015fekilde aya\u011fa kalkmas\u0131n\u0131 sa\u011flamas\u0131d\u0131r. Bu h\u0131z\u0131n arkas\u0131nda yatan temel mekanizma ise yine anotasyonlard\u0131r. Yeni bir Spring Boot projesi olu\u015fturdu\u011funuzda kar\u015f\u0131la\u015faca\u011f\u0131n\u0131z ilk ve en \u00f6nemli anotasyonlardan biri <code>@SpringBootApplication<\/code>&#8216;d\u0131r. Peki, bu anotasyonun arkas\u0131nda neler var ve Spring Boot ile temel bir uygulamay\u0131 nas\u0131l yap\u0131land\u0131r\u0131r\u0131z?<\/p>\n<p><code>@SpringBootApplication<\/code>, asl\u0131nda \u00fc\u00e7 temel anotasyonun birle\u015fimidir:<\/p>\n<ul>\n<li><code>@Configuration<\/code>: Bu s\u0131n\u0131f\u0131n bir Spring yap\u0131land\u0131rma s\u0131n\u0131f\u0131 oldu\u011funu belirtir. Spring konteyneri, bu s\u0131n\u0131ftan <code>@Bean<\/code> anotasyonu ile i\u015faretlenmi\u015f metodlar\u0131 tarayarak Spring bean&#8217;lerini olu\u015fturur.<\/li>\n<li><code>@EnableAutoConfiguration<\/code>: Spring Boot&#8217;un &#8220;otomatik yap\u0131land\u0131rma&#8221; yetene\u011fini etkinle\u015ftirir. Bu sayede, projenizin classpath&#8217;ine ekledi\u011finiz ba\u011f\u0131ml\u0131l\u0131klara (\u00f6rne\u011fin, H2 veritaban\u0131, Spring Web MVC) g\u00f6re Spring Boot, uygulama i\u00e7in gerekli olan varsay\u0131lan konfig\u00fcrasyonlar\u0131 otomatik olarak sa\u011flar. Bu, sizin elle yapman\u0131z gereken XML veya Java tabanl\u0131 yap\u0131land\u0131rmay\u0131 ortadan kald\u0131r\u0131r.<\/li>\n<li><code>@ComponentScan<\/code>: Spring&#8217;in bile\u015fen taramas\u0131n\u0131 etkinle\u015ftirir. Bu anotasyon, belirtilen paketlerde (genellikle uygulama s\u0131n\u0131f\u0131n\u0131n bulundu\u011fu paket ve alt paketleri) <code>@Component<\/code>, <code>@Service<\/code>, <code>@Repository<\/code>, <code>@Controller<\/code> gibi anotasyonlarla i\u015faretlenmi\u015f s\u0131n\u0131flar\u0131 bulmas\u0131n\u0131 ve bunlar\u0131 Spring konteynerinde y\u00f6netilen &#8220;bean&#8221;ler olarak kaydetmesini sa\u011flar.<\/li>\n<\/ul>\n<p>Bu \u00fc\u00e7 anotasyonun birle\u015fimi sayesinde, bir Spring Boot uygulamas\u0131 sadece tek bir anotasyonla hem yap\u0131land\u0131r\u0131labilir, hem otomatik olarak yap\u0131land\u0131r\u0131labilir, hem de bile\u015fenlerini tarayabilir hale gelir. A\u015fa\u011f\u0131da, basit bir &#8220;Merhaba D\u00fcnya&#8221; REST API&#8217;si olu\u015fturan bir Spring Boot uygulamas\u0131n\u0131n temel yap\u0131s\u0131n\u0131 g\u00f6receksiniz:<\/p>\n<pre><code>\npackage com.example.ilkuygulama;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@SpringBootApplication\npublic class IlkUygulamaApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(IlkUygulamaApplication.class, args);\n    }\n}\n\n@RestController\nclass MerhabaController {\n\n    @GetMapping(\"\/merhaba\")\n    public String merhabaDunya() {\n        return \"Merhaba, Spring Boot D\u00fcnyas\u0131!\";\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>IlkUygulamaApplication<\/code> s\u0131n\u0131f\u0131 <code>@SpringBootApplication<\/code> ile i\u015faretlenerek uygulaman\u0131n giri\u015f noktas\u0131 olarak tan\u0131mlanm\u0131\u015ft\u0131r. <code>MerhabaController<\/code> s\u0131n\u0131f\u0131 ise <code>@RestController<\/code> ile i\u015faretlenerek RESTful web servislerini sunan bir bile\u015fen oldu\u011funu belirtir. <code>@GetMapping(\"\/merhaba\")<\/code> anotasyonu ise, <code>\/merhaba<\/code> adresine yap\u0131lan HTTP GET isteklerinin <code>merhabaDunya()<\/code> metoduna y\u00f6nlendirilece\u011fini ifade eder. G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, hi\u00e7bir XML dosyas\u0131 veya karma\u015f\u0131k Java konfig\u00fcrasyonu olmadan, sadece anotasyonlar kullanarak tamamen i\u015flevsel bir web uygulamas\u0131 olu\u015fturmak m\u00fcmk\u00fcnd\u00fcr. Bu basit yap\u0131land\u0131rma, Spring Boot'un yeni ba\u015flayanlar i\u00e7in ne kadar eri\u015filebilir oldu\u011funun en g\u00fczel kan\u0131t\u0131d\u0131r.<\/p>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda (\u00f6rne\u011fin Maven ile <code>mvn spring-boot:run<\/code> veya IntelliJ\/Eclipse \u00fczerinden), otomatik olarak bir Tomcat sunucusu ba\u015flat\u0131lacak ve <code>http:\/\/localhost:8080\/merhaba<\/code> adresine gidildi\u011finde \"Merhaba, Spring Boot D\u00fcnyas\u0131!\" mesaj\u0131n\u0131 g\u00f6receksiniz. Bu, Spring Boot'un geli\u015ftirme s\u00fcrecini ne kadar h\u0131zland\u0131rd\u0131\u011f\u0131n\u0131 g\u00f6steren \u00e7arp\u0131c\u0131 bir \u00f6rnektir.<\/p>\n<h2 id=\"bagimlilik-enjeksiyonu-ve-yasam-dongusu-autowired-ve-bean-nasil-kullanilir\">Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu ve Ya\u015fam D\u00f6ng\u00fcs\u00fc: <code>@Autowired<\/code> ve <code>@Bean<\/code> Nas\u0131l Kullan\u0131l\u0131r?<\/h2>\n<p>Spring Framework'\u00fcn kalbinde yatan iki temel kavram, Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (DI) ve IoC konteyneridir. Bu kavramlar sayesinde, uygulamalar\u0131m\u0131z daha esnek, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir hale gelir. Spring, bu prensipleri ger\u00e7ekle\u015ftirmek i\u00e7in \u00e7e\u015fitli anotasyonlar sunar; bunlar\u0131n en \u00f6nemlileri <code>@Autowired<\/code> ve <code>@Bean<\/code>'dir. Bu b\u00f6l\u00fcmde, bu anotasyonlar\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 ve Spring bile\u015fenlerinin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc nas\u0131l y\u00f6nettiklerini ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3 id=\"autowired-ile-bagimlilik-enjeksiyonu-nedir-ve-nasil-yapilir\"><code>@Autowired<\/code> ile Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu Nedir ve Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p><code>@Autowired<\/code> anotasyonu, Spring'in IoC konteynerine, bir s\u0131n\u0131f\u0131n ba\u015fka bir s\u0131n\u0131fa olan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 otomatik olarak sa\u011flamas\u0131 gerekti\u011fini s\u00f6yler. Geleneksel olarak, bir s\u0131n\u0131f\u0131n ba\u015fka bir s\u0131n\u0131f\u0131n \u00f6rne\u011fine ihtiyac\u0131 oldu\u011funda, bu \u00f6rne\u011fi kendisi olu\u015fturmas\u0131 gerekirdi (<code>new MyService()<\/code> gibi). Bu durum, ba\u011f\u0131ml\u0131l\u0131klar\u0131 s\u0131k\u0131 bir \u015fekilde ba\u011flar ve \u00f6zellikle bir s\u0131n\u0131f\u0131n bir\u00e7ok ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 oldu\u011funda y\u00f6netimi zorla\u015ft\u0131r\u0131r.<\/p>\n<p><code>@Autowired<\/code> sayesinde, Spring konteyneri, ilgili tipte bir bean'i bulur ve onu enjekte eder. Enjeksiyon \u00fc\u00e7 farkl\u0131 \u015fekilde yap\u0131labilir:<\/p>\n<ol>\n<li><strong>Field Injection (Alan Enjeksiyonu):<\/strong> En pop\u00fcler ama baz\u0131 durumlarda \u00f6nerilmeyen y\u00f6ntemdir. Ba\u011f\u0131ml\u0131l\u0131k do\u011frudan s\u0131n\u0131f\u0131n bir alan\u0131na enjekte edilir.<\/li>\n<pre><code>\n@Service\npublic class SiparisService {\n    @Autowired\n    private UrunRepository urunRepository; \/\/ Field Injection\n\n    public void siparisVer() {\n        \/\/ ... urunRepository kullanimi ...\n    }\n}\n        <\/pre>\n<p><\/code><\/p>\n<li><strong>Setter Injection (Setter Metodu Enjeksiyonu):<\/strong> Ba\u011f\u0131ml\u0131l\u0131k, ilgili ba\u011f\u0131ml\u0131l\u0131k i\u00e7in bir setter metodu arac\u0131l\u0131\u011f\u0131yla enjekte edilir. Daha esnek olabilir, \u00e7\u00fcnk\u00fc ba\u011f\u0131ml\u0131l\u0131k \u00e7al\u0131\u015fma zaman\u0131nda de\u011fi\u015ftirilebilir.<\/li>\n<pre><code>\n@Service\npublic class SiparisService {\n    private UrunRepository urunRepository;\n\n    @Autowired\n    public void setUrunRepository(UrunRepository urunRepository) { \/\/ Setter Injection\n        this.urunRepository = urunRepository;\n    }\n\n    public void siparisVer() {\n        \/\/ ... urunRepository kullanimi ...\n    }\n}\n        <\/pre>\n<p><\/code><\/p>\n<li><strong>Constructor Injection (Yap\u0131c\u0131 Metot Enjeksiyonu):<\/strong> Spring'in \u00f6nerdi\u011fi ve en iyi uygulama olarak kabul edilen y\u00f6ntemdir. Ba\u011f\u0131ml\u0131l\u0131klar, s\u0131n\u0131f\u0131n yap\u0131c\u0131 metodu arac\u0131l\u0131\u011f\u0131yla enjekte edilir. Bu, s\u0131n\u0131f\u0131n olu\u015fturuldu\u011funda t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n haz\u0131r olmas\u0131n\u0131 garanti eder ve daha test edilebilir kod yazmaya te\u015fvik eder. E\u011fer yap\u0131c\u0131 metotta tek bir ba\u011f\u0131ml\u0131l\u0131k varsa, <code>@Autowired<\/code> anotasyonuna bile gerek kalmayabilir (Spring Boot 2.3+).<\/li>\n<pre><code>\n@Service\npublic class SiparisService {\n    private final UrunRepository urunRepository;\n\n    \/\/ @Autowired burada opsiyoneldir (tek constructor varsa)\n    public SiparisService(UrunRepository urunRepository) { \/\/ Constructor Injection\n        this.urunRepository = urunRepository;\n    }\n\n    public void siparisVer() {\n        \/\/ ... urunRepository kullanimi ...\n    }\n}\n        <\/pre>\n<p><\/code>\n    <\/ol>\n<p>Birden fazla ayn\u0131 tipte bean oldu\u011funda, <code>@Qualifier(\"beanAdi\")<\/code> veya <code>@Primary<\/code> anotasyonlar\u0131 ile hangi bean'in enjekte edilece\u011fini belirtebilirsiniz. \u00d6rne\u011fin: <code>@Autowired @Qualifier(\"anaUrunRepository\")<\/code>.<\/p>\n<h3 id=\"bean-ile-ozel-nesnelerin-tanimlanmasi-ve-yonetimi\"><code>@Bean<\/code> ile \u00d6zel Nesnelerin Tan\u0131mlanmas\u0131 ve Y\u00f6netimi<\/h3>\n<p><code>@Component<\/code>, <code>@Service<\/code> vb. anotasyonlar genellikle kendi kontrol\u00fcm\u00fczdeki s\u0131n\u0131flar\u0131 Spring bean'i olarak tan\u0131mlamak i\u00e7in kullan\u0131l\u0131rken, bazen \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphanelerden gelen nesneleri veya karma\u015f\u0131k yap\u0131land\u0131rma gerektiren nesneleri Spring konteynerinde y\u00f6netmek isteyebiliriz. \u0130\u015fte bu noktada <code>@Bean<\/code> anotasyonu devreye girer. Bir metot \u00fczerine yerle\u015ftirilen <code>@Bean<\/code>, Spring'e bu metodun d\u00f6nd\u00fcrd\u00fc\u011f\u00fc nesnenin bir Spring bean'i olarak kaydedilmesi gerekti\u011fini s\u00f6yler. Bu metotlar genellikle <code>@Configuration<\/code> anotasyonu ile i\u015faretlenmi\u015f s\u0131n\u0131flar i\u00e7inde yer al\u0131r.<\/p>\n<pre><code>\n@Configuration\npublic class AppConfig {\n\n    @Bean\n    public MyCustomBean myCustomBean() {\n        \/\/ Karma\u015f\u0131k bir nesne olu\u015fturma mant\u0131\u011f\u0131 olabilir\n        MyCustomBean bean = new MyCustomBean();\n        bean.init(); \/\/ Baz\u0131 ba\u015flatma i\u015flemleri\n        return bean;\n    }\n\n    @Bean\n    public String uygulamaAdi() {\n        return \"Online Sipari\u015f Sistemi\";\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Art\u0131k <code>myCustomBean<\/code> ve <code>uygulamaAdi<\/code> string'i, di\u011fer Spring bean'leri gibi <code>@Autowired<\/code> ile enjekte edilebilir. Bu sayede, Spring konteyneri uygulaman\u0131n t\u00fcm bile\u015fenlerini merkezi bir \u015fekilde y\u00f6netebilir.<\/p>\n<h3 id=\"spring-beanlerinin-yasam-dongusu-postconstruct-ve-predestroy\">Spring Bean'lerinin Ya\u015fam D\u00f6ng\u00fcs\u00fc: <code>@PostConstruct<\/code> ve <code>@PreDestroy<\/code><\/h3>\n<p>Spring, y\u00f6netti\u011fi bean'lerin ya\u015fam d\u00f6ng\u00fcs\u00fc \u00fczerinde tam kontrol sa\u011flar. Bir bean olu\u015fturuldu\u011funda veya yok edildi\u011finde belirli i\u015flemlerin yap\u0131lmas\u0131n\u0131 sa\u011flamak i\u00e7in ya\u015fam d\u00f6ng\u00fcs\u00fc anotasyonlar\u0131n\u0131 kullan\u0131r\u0131z:<\/p>\n<ul>\n<li><code>@PostConstruct<\/code>: Bir bean olu\u015fturulup t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 enjekte edildikten sonra \u00e7al\u0131\u015ft\u0131r\u0131lacak metotlar\u0131 i\u015faretler. Ba\u015flatma (initialization) mant\u0131\u011f\u0131 i\u00e7in idealdir.<\/li>\n<li><code>@PreDestroy<\/code>: Bir bean yok edilmeden (konteyner kapat\u0131l\u0131rken) \u00f6nce \u00e7al\u0131\u015ft\u0131r\u0131lacak metotlar\u0131 i\u015faretler. Kaynaklar\u0131 serbest b\u0131rakmak veya kapatma (cleanup) i\u015flemleri i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<pre><code>\nimport jakarta.annotation.PostConstruct;\nimport jakarta.annotation.PreDestroy;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class VeritabaniBaglantiYoneticisi {\n\n    public VeritabaniBaglantiYoneticisi() {\n        System.out.println(\"Veritaban\u0131BaglantiYoneticisi olu\u015fturuldu.\");\n    }\n\n    @PostConstruct\n    public void baglantiyiAc() {\n        System.out.println(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 a\u00e7\u0131l\u0131yor...\");\n        \/\/ Veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kurma mant\u0131\u011f\u0131\n    }\n\n    @PreDestroy\n    public void baglantiyiKapat() {\n        System.out.println(\"Veritaban\u0131 ba\u011flant\u0131s\u0131 kapat\u0131l\u0131yor...\");\n        \/\/ Veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kapatma mant\u0131\u011f\u0131\n    }\n\n    public void veriCek() {\n        System.out.println(\"Veritaban\u0131ndan veri \u00e7ekiliyor.\");\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu anotasyonlar sayesinde, Spring bean'lerinizin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc kolayca kontrol edebilir, kaynak y\u00f6netimini ve uygulama ba\u015flang\u0131\u00e7\/kapan\u0131\u015f s\u00fcre\u00e7lerini daha d\u00fczenli hale getirebilirsiniz. Unutmay\u0131n, <code>@Autowired<\/code> ve <code>@Bean<\/code>, Spring ile geli\u015ftirme yaparken en s\u0131k kullanaca\u011f\u0131n\u0131z anotasyonlar aras\u0131nda yer al\u0131r ve onlar\u0131 do\u011fru anlamak, g\u00fc\u00e7l\u00fc ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar in\u015fa etmenin anahtar\u0131d\u0131r.<\/p>\n<h2 id=\"veritabani-etkilesimleri-transactional-ve-spring-data-jpa-anotasyonlari\">Veritaban\u0131 Etkile\u015fimleri: <code>@Transactional<\/code> ve Spring Data JPA Anotasyonlar\u0131<\/h2>\n<p>Modern uygulamalar\u0131n \u00e7o\u011fu, verileri kal\u0131c\u0131 olarak depolamak i\u00e7in bir veritaban\u0131na ihtiya\u00e7 duyar. Spring Framework, veritaban\u0131 etkile\u015fimlerini kolayla\u015ft\u0131rmak ve y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Bu ara\u00e7lar\u0131n merkezinde ise Spring Data JPA ve <code>@Transactional<\/code> gibi anotasyonlar yer al\u0131r. Bu b\u00f6l\u00fcmde, veritaban\u0131 i\u015flemlerini Spring ile nas\u0131l y\u00f6netece\u011fimizi, temel Spring Data JPA anotasyonlar\u0131n\u0131 ve i\u015flemlerin (transactions) \u00f6nemini ele alaca\u011f\u0131z.<\/p>\n<h3 id=\"spring-data-jpa-ile-veri-erisimini-basitlestirme\">Spring Data JPA ile Veri Eri\u015fimini Basitle\u015ftirme<\/h3>\n<p>Spring Data JPA, Java Persistence API (JPA) kullan\u0131m\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftiren bir Spring alt projesidir. Temel CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 ve daha karma\u015f\u0131k sorgular\u0131, neredeyse hi\u00e7 kod yazmadan yapmam\u0131z\u0131 sa\u011flar. Bunun i\u00e7in, entity s\u0131n\u0131flar\u0131m\u0131z\u0131 ve repository aray\u00fczlerimizi Spring'e do\u011fru anotasyonlarla tan\u0131tmak yeterlidir.<\/p>\n<p>\u00d6ncelikle, veritaban\u0131ndaki bir tabloyu temsil eden bir entity (varl\u0131k) s\u0131n\u0131f\u0131 olu\u015ftural\u0131m. Bu s\u0131n\u0131f\u0131 JPA standartlar\u0131na uygun hale getirmek i\u00e7in baz\u0131 anotasyonlar kullanaca\u011f\u0131z:<\/p>\n<pre><code>\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.Id;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Column;\n\n@Entity \/\/ Bu s\u0131n\u0131f\u0131n bir JPA varl\u0131\u011f\u0131 oldu\u011funu belirtir\npublic class Kullanici {\n\n    @Id \/\/ Bu alan\u0131n birincil anahtar oldu\u011funu belirtir\n    @GeneratedValue(strategy = GenerationType.IDENTITY) \/\/ Birincil anahtar\u0131n otomatik \u00fcretilece\u011fini belirtir\n    private Long id;\n\n    @Column(nullable = false, unique = true) \/\/ Bu alan\u0131n veritaban\u0131 s\u00fctunu oldu\u011funu ve null olamayaca\u011f\u0131n\u0131, tekil olaca\u011f\u0131n\u0131 belirtir\n    private String email;\n\n    @Column(nullable = false)\n    private String adSoyad;\n\n    \/\/ Getter ve Setter metotlar\u0131\n    \/\/ ...\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, bu <code>Kullanici<\/code> varl\u0131\u011f\u0131 i\u00e7in veritaban\u0131 i\u015flemlerini y\u00f6netecek bir repository aray\u00fcz\u00fc tan\u0131mlar\u0131z. Spring Data JPA, bu aray\u00fczden otomatik olarak bir implementasyon olu\u015fturacakt\u0131r:<\/p>\n<pre><code>\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.stereotype.Repository;\n\n@Repository \/\/ Bu aray\u00fcz\u00fcn bir veri eri\u015fim katman\u0131 bile\u015feni oldu\u011funu belirtir\npublic interface KullaniciRepository extends JpaRepository<Kullanici, Long> {\n    \/\/ \u00d6zel sorgular buraya eklenebilir. \u00d6rne\u011fin:\n    \/\/ Optional<Kullanici> findByEmail(String email);\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><code>@Repository<\/code> anotasyonu, bu aray\u00fcz\u00fcn bir veri eri\u015fim katman\u0131 bile\u015feni oldu\u011funu Spring'e bildirir ve onu IoC konteynerine kaydeder. <code>JpaRepository<Kullanici, Long><\/code> aray\u00fcz\u00fcn\u00fc geni\u015fleterek, <code>save()<\/code>, <code>findById()<\/code>, <code>findAll()<\/code>, <code>delete()<\/code> gibi temel CRUD metotlar\u0131na otomatik olarak sahip oluruz. Art\u0131k bu <code>KullaniciRepository<\/code> bean'ini servis katman\u0131m\u0131zda <code>@Autowired<\/code> ile enjekte edebilir ve veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<h3 id=\"transactional-ile-islem-yonetimi-neden-kritiktir\"><code>@Transactional<\/code> ile \u0130\u015flem Y\u00f6netimi Neden Kritiktir?<\/h3>\n<p>Veritaban\u0131 i\u015flemlerinde atomiklik, tutarl\u0131l\u0131k, izolasyon ve dayan\u0131kl\u0131l\u0131k (ACID) \u00f6zelliklerini sa\u011flamak hayati \u00f6neme sahiptir. Bir i\u015flem (transaction), tek bir mant\u0131ksal i\u015f birimi olarak kabul edilen bir dizi veritaban\u0131 operasyonudur. E\u011fer bu operasyonlardan biri ba\u015far\u0131s\u0131z olursa, t\u00fcm i\u015flem geri al\u0131nmal\u0131 (rollback) ve veritaban\u0131 tutarl\u0131 bir durumda b\u0131rak\u0131lmal\u0131d\u0131r. Spring'in <code>@Transactional<\/code> anotasyonu, bu karma\u015f\u0131k i\u015flem y\u00f6netimini inan\u0131lmaz derecede basitle\u015ftirir.<\/p>\n<p>Bir metoda veya s\u0131n\u0131fa <code>@Transactional<\/code> ekledi\u011finizde, Spring bu metot \u00e7a\u011fr\u0131s\u0131n\u0131 bir veritaban\u0131 i\u015flemi i\u00e7ine sarar. Metot ba\u015far\u0131yla tamamlan\u0131rsa, i\u015flem commit edilir. Metot i\u00e7inde bir hata (istisna) olu\u015fursa, i\u015flem otomatik olarak geri al\u0131n\u0131r (rollback edilir).<\/p>\n<pre><code>\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\n@Service \/\/ Bu s\u0131n\u0131f\u0131n bir i\u015f mant\u0131\u011f\u0131 bile\u015feni oldu\u011funu belirtir\npublic class KullaniciService {\n\n    private final KullaniciRepository kullaniciRepository;\n\n    public KullaniciService(KullaniciRepository kullaniciRepository) {\n        this.kullaniciRepository = kullaniciRepository;\n    }\n\n    @Transactional \/\/ Bu metot bir i\u015flem kapsam\u0131nda \u00e7al\u0131\u015f\u0131r\n    public Kullanici yeniKullaniciKaydet(Kullanici kullanici) {\n        \/\/ \u0130\u015f mant\u0131\u011f\u0131 ve birden fazla veritaban\u0131 operasyonu burada olabilir\n        \/\/ \u00d6rne\u011fin, kullan\u0131c\u0131n\u0131n e-posta adresini kontrol et\n        if (kullaniciRepository.findByEmail(kullanici.getEmail()).isPresent()) {\n            throw new IllegalArgumentException(\"Bu e-posta adresi zaten kullan\u0131l\u0131yor.\");\n        }\n        Kullanici kaydedilenKullanici = kullaniciRepository.save(kullanici);\n        System.out.println(\"Kullan\u0131c\u0131 kaydedildi: \" + kaydedilenKullanici.getAdSoyad());\n        \/\/ Ba\u015fka bir i\u015flem\n        \/\/ logService.logActivity(\"Yeni kullan\u0131c\u0131 eklendi: \" + kullanici.getEmail());\n        return kaydedilenKullanici;\n    }\n\n    @Transactional(readOnly = true) \/\/ Sadece okuma i\u015flemleri i\u00e7in, performans\u0131 art\u0131rabilir\n    public Kullanici kullaniciyiBul(Long id) {\n        return kullaniciRepository.findById(id)\n                .orElseThrow(() -> new RuntimeException(\"Kullan\u0131c\u0131 bulunamad\u0131.\"));\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, <code>yeniKullaniciKaydet<\/code> metoduna <code>@Transactional<\/code> ekleyerek, bu metodun bir veritaban\u0131 i\u015flemi i\u00e7inde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flad\u0131k. E\u011fer e-posta zaten kullan\u0131l\u0131yorsa bir istisna f\u0131rlat\u0131l\u0131r ve i\u015flem otomatik olarak geri al\u0131n\u0131r, yani yeni kullan\u0131c\u0131 veritaban\u0131na kaydedilmez. Bu, veritaban\u0131n\u0131n tutarl\u0131l\u0131\u011f\u0131n\u0131 korur. <code>readOnly = true<\/code> parametresi, i\u015flemin sadece okuma ama\u00e7l\u0131 oldu\u011funu belirterek performans\u0131 art\u0131rabilir.<\/p>\n<div class=\"expert-tip\">\n        <strong>Uzman \u0130pucu:<\/strong> <code>@Transactional<\/code> anotasyonunu kullan\u0131rken dikkatli olun. B\u00fcy\u00fck metotlar\u0131 tek bir i\u015fleme sarmak performans\u0131 d\u00fc\u015f\u00fcrebilir ve kilitlenme (deadlock) riskini art\u0131rabilir. \u0130\u015flemleri m\u00fcmk\u00fcn oldu\u011funca k\u00fc\u00e7\u00fck ve hedefe y\u00f6nelik tutmaya \u00e7al\u0131\u015f\u0131n. \u0130\u015flemleri servis katman\u0131nda y\u00f6netmek en iyi uygulamad\u0131r.\n    <\/div>\n<p>Spring Data JPA ve <code>@Transactional<\/code>, veritaban\u0131 etkile\u015fimlerini Spring uygulamalar\u0131nda basit, g\u00fc\u00e7l\u00fc ve g\u00fcvenli hale getiren vazge\u00e7ilmez anotasyonlard\u0131r. Bu ara\u00e7lar\u0131 do\u011fru kullanarak, sa\u011flam ve \u00f6l\u00e7eklenebilir veri eri\u015fim katmanlar\u0131 olu\u015fturabilirsiniz.<\/p>\n<h2 id=\"web-uygulamalari-ve-rest-api-gelistirme-restcontroller-ve-digerleri\">Web Uygulamalar\u0131 ve REST API Geli\u015ftirme: <code>@RestController<\/code> ve Di\u011ferleri<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn modern uygulamalar\u0131n\u0131n \u00e7o\u011fu, istemcilerle (web taray\u0131c\u0131lar\u0131, mobil uygulamalar veya di\u011fer servisler) ileti\u015fim kurmak i\u00e7in RESTful API'ler kullan\u0131r. Spring Framework, \u00f6zellikle Spring Boot ile birlikte, REST API'leri geli\u015ftirmeyi inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r. Bu kolayl\u0131\u011f\u0131n merkezinde yine anotasyonlar bulunur. Bu b\u00f6l\u00fcmde, Spring MVC'nin web anotasyonlar\u0131n\u0131 kullanarak nas\u0131l g\u00fc\u00e7l\u00fc ve esnek REST API'ler olu\u015fturaca\u011f\u0131m\u0131z\u0131 inceleyece\u011fiz.<\/p>\n<h3 id=\"restcontroller-ile-api-tanimlama-ve-route-yonetimi\"><code>@RestController<\/code> ile API Tan\u0131mlama ve Route Y\u00f6netimi<\/h3>\n<p>Spring MVC'de, web isteklerini i\u015fleyen s\u0131n\u0131flara \"Controller\" (kontrolc\u00fc) denir. Bir s\u0131n\u0131f\u0131 bir kontrolc\u00fc olarak i\u015faretlemek i\u00e7in <code>@Controller<\/code> anotasyonunu kullan\u0131r\u0131z. Ancak, e\u011fer bir RESTful API geli\u015ftiriyorsak ve metodlar\u0131m\u0131z\u0131n do\u011frudan JSON veya XML gibi veri formatlar\u0131nda yan\u0131t d\u00f6nd\u00fcrmesini istiyorsak, <code>@ResponseBody<\/code> anotasyonunu her metot i\u00e7in ayr\u0131 ayr\u0131 kullanmam\u0131z gerekir. Spring bu iki anotasyonu birle\u015ftirerek <code>@RestController<\/code>'\u0131 sunar. <code>@RestController<\/code> ile i\u015faretlenen bir s\u0131n\u0131f, hem bir kontrolc\u00fc oldu\u011funu hem de metodlar\u0131n\u0131n d\u00f6n\u00fc\u015f de\u011ferlerinin do\u011frudan HTTP yan\u0131t g\u00f6vdesine yaz\u0131lmas\u0131 gerekti\u011fini belirtir.<\/p>\n<p>Bir iste\u011fi belirli bir metoda y\u00f6nlendirmek (mapping) i\u00e7in <code>@RequestMapping<\/code> anotasyonu kullan\u0131l\u0131r. Bu anotasyon, s\u0131n\u0131f d\u00fczeyinde veya metot d\u00fczeyinde kullan\u0131labilir. \u00d6rne\u011fin, t\u00fcm API endpoint'lerinin <code>\/api<\/code> ile ba\u015flamas\u0131n\u0131 sa\u011flamak i\u00e7in s\u0131n\u0131f d\u00fczeyinde <code>@RequestMapping(\"\/api\")<\/code> kullanabiliriz. Ancak, daha spesifik HTTP metotlar\u0131na (GET, POST, PUT, DELETE) \u00f6zel anotasyonlar olan <code>@GetMapping<\/code>, <code>@PostMapping<\/code>, <code>@PutMapping<\/code>, <code>@DeleteMapping<\/code> ve <code>@PatchMapping<\/code> daha yayg\u0131n ve okunabilir bir yakla\u015f\u0131md\u0131r.<\/p>\n<pre><code>\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\n\n\/\/ \u00d6rnek bir Model s\u0131n\u0131f\u0131\nclass Gorev {\n    private Long id;\n    private String baslik;\n    private boolean tamamlandi;\n\n    public Gorev(Long id, String baslik, boolean tamamlandi) {\n        this.id = id;\n        this.baslik = baslik;\n        this.tamamlandi = tamamlandi;\n    }\n\n    \/\/ Getter ve Setter'lar...\n    public Long getId() { return id; }\n    public void setId(Long id) { this.id = id; }\n    public String getBaslik() { return baslik; }\n    public void setBaslik(String baslik) { this.baslik = baslik; }\n    public boolean isTamamlandi() { return tamamlandi; }\n    public void setTamamlandi(boolean tamamlandi) { this.tamamlandi = tamamlandi; }\n}\n\n@RestController \/\/ RESTful servisler i\u00e7in kontrolc\u00fc\n@RequestMapping(\"\/api\/gorevler\") \/\/ T\u00fcm metodlar \/api\/gorevler ile ba\u015flar\npublic class GorevController {\n\n    private List<Gorev> gorevler = new ArrayList<>();\n    private Long nextId = 1L;\n\n    public GorevController() {\n        gorevler.add(new Gorev(nextId++, \"Spring Anotasyonlar\u0131 \u00d6\u011fren\", false));\n        gorevler.add(new Gorev(nextId++, \"Makaleyi Yazmay\u0131 Bitir\", false));\n    }\n\n    @GetMapping \/\/ T\u00fcm g\u00f6revleri getir (GET \/api\/gorevler)\n    public List<Gorev> getAllGorevler() {\n        return gorevler;\n    }\n\n    @GetMapping(\"\/{id}\") \/\/ Belirli bir g\u00f6revi ID'ye g\u00f6re getir (GET \/api\/gorevler\/{id})\n    public ResponseEntity<Gorev> getGorevById(@PathVariable Long id) {\n        Optional<Gorev> gorev = gorevler.stream()\n                                    .filter(g -> g.getId().equals(id))\n                                    .findFirst();\n        return gorev.map(g -> new ResponseEntity<>(g, HttpStatus.OK))\n                    .orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));\n    }\n\n    @PostMapping \/\/ Yeni g\u00f6rev ekle (POST \/api\/gorevler)\n    public ResponseEntity<Gorev> createGorev(@RequestBody Gorev yeniGorev) {\n        yeniGorev.setId(nextId++);\n        gorevler.add(yeniGorev);\n        return new ResponseEntity<>(yeniGorev, HttpStatus.CREATED);\n    }\n\n    @PutMapping(\"\/{id}\") \/\/ G\u00f6revi g\u00fcncelle (PUT \/api\/gorevler\/{id})\n    public ResponseEntity<Gorev> updateGorev(@PathVariable Long id, @RequestBody Gorev guncelGorev) {\n        Optional<Gorev> existingGorev = gorevler.stream()\n                                            .filter(g -> g.getId().equals(id))\n                                            .findFirst();\n        if (existingGorev.isPresent()) {\n            Gorev gorev = existingGorev.get();\n            gorev.setBaslik(guncelGorev.getBaslik());\n            gorev.setTamamlandi(guncelGuncelGorev.isTamamlandi());\n            return new ResponseEntity<>(gorev, HttpStatus.OK);\n        }\n        return new ResponseEntity<>(HttpStatus.NOT_FOUND);\n    }\n\n    @DeleteMapping(\"\/{id}\") \/\/ G\u00f6revi sil (DELETE \/api\/gorevler\/{id})\n    public ResponseEntity<Void> deleteGorev(@PathVariable Long id) {\n        boolean removed = gorevler.removeIf(gorev -> gorev.getId().equals(id));\n        return removed ? new ResponseEntity<>(HttpStatus.NO_CONTENT) : new ResponseEntity<>(HttpStatus.NOT_FOUND);\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, bir \"G\u00f6rev Y\u00f6netimi\" API'si olu\u015fturduk. <code>@GetMapping<\/code>, <code>@PostMapping<\/code>, <code>@PutMapping<\/code>, <code>@DeleteMapping<\/code> anotasyonlar\u0131, HTTP metodlar\u0131na g\u00f6re istekleri do\u011fru metotlara y\u00f6nlendirir. Peki, bu metotlara gelen verileri nas\u0131l al\u0131r\u0131z?<\/p>\n<h3 id=\"istek-verilerini-isleme-requestbody-requestparam-ve-pathvariable\">\u0130stek Verilerini \u0130\u015fleme: <code>@RequestBody<\/code>, <code>@RequestParam<\/code> ve <code>@PathVariable<\/code><\/h3>\n<ul>\n<li><code>@PathVariable<\/code>: Bir URI \u015fablonundan (URL yolundan) gelen de\u011fi\u015fkenleri metoda ba\u011flamak i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, <code>\/gorevler\/{id}<\/code> adresindeki <code>{id}<\/code> de\u011ferini bir metot parametresine almak i\u00e7in <code>@PathVariable Long id<\/code> kullan\u0131r\u0131z.<\/li>\n<li><code>@RequestParam<\/code>: Bir HTTP iste\u011finin URL sorgu parametrelerini (\u00f6rne\u011fin, <code>\/urunler?kategori=elektronik<\/code>) metot parametrelerine ba\u011flamak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><code>@RequestBody<\/code>: HTTP iste\u011finin g\u00f6vdesindeki verileri (genellikle JSON veya XML format\u0131nda) bir Java nesnesine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r. \u00d6zellikle POST ve PUT isteklerinde, istemciden g\u00f6nderilen karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 (\u00f6rne\u011fin, yeni bir g\u00f6rev nesnesi) almak i\u00e7in vazge\u00e7ilmezdir. Spring, bu d\u00f6n\u00fc\u015f\u00fcm\u00fc otomatik olarak yapar (\u00f6rne\u011fin Jackson k\u00fct\u00fcphanesi ile JSON'dan Java objesine).<\/li>\n<\/ul>\n<p>\u00d6rnek kodumuzda <code>@PathVariable Long id<\/code> ve <code>@RequestBody Gorev yeniGorev<\/code> kullan\u0131mlar\u0131 bu anotasyonlar\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6stermektedir. <code>ResponseEntity<\/code> s\u0131n\u0131f\u0131 ise, HTTP yan\u0131t kodunu (200 OK, 201 Created, 404 Not Found vb.) ve iste\u011fe ba\u011fl\u0131 olarak yan\u0131t g\u00f6vdesini (veri) kontrol etmemizi sa\u011flar, bu da daha profesyonel ve standartlara uygun API'ler geli\u015ftirmek i\u00e7in \u00f6nemlidir.<\/p>\n<div class=\"expert-tip\">\n        <strong>Uzman \u0130pucu:<\/strong> REST API'ler geli\u015ftirirken, HTTP durum kodlar\u0131n\u0131 (Status Codes) do\u011fru kullanmaya \u00f6zen g\u00f6sterin (\u00f6rne\u011fin 200 OK, 201 Created, 204 No Content, 400 Bad Request, 404 Not Found, 500 Internal Server Error). Bu, API'nizin anla\u015f\u0131labilirli\u011fini ve istemciler taraf\u0131ndan kolayca kullan\u0131labilirli\u011fini art\u0131r\u0131r. Ayr\u0131ca, mobil uyumlu front-end uygulamalar\u0131n\u0131z bu durum kodlar\u0131na g\u00f6re dinamik olarak tepki verebilir.\n    <\/div>\n<p>Bu anotasyonlar\u0131 kullanarak, Spring Boot ile kolayca karma\u015f\u0131k ve g\u00fc\u00e7l\u00fc REST API'ler olu\u015fturabilir, b\u00f6ylece web ve mobil uygulamalar\u0131n\u0131z i\u00e7in sa\u011flam bir arka u\u00e7 sa\u011flayabilirsiniz. Spring'in sa\u011flad\u0131\u011f\u0131 bu kolayl\u0131klar sayesinde, geli\u015ftiriciler i\u015f mant\u0131\u011f\u0131na odaklanabilir ve API'lerini h\u0131zl\u0131ca hayata ge\u00e7irebilirler.<\/p>\n<h2 id=\"performans-ve-guvenlik-icin-ipuclari-ileri-duzey-anotasyon-kullanimi\">Performans ve G\u00fcvenlik \u0130\u00e7in \u0130pu\u00e7lar\u0131: \u0130leri D\u00fczey Anotasyon Kullan\u0131m\u0131<\/h2>\n<p>Spring anotasyonlar\u0131 sadece temel IoC ve web geli\u015ftirmesi i\u00e7in de\u011fil, ayn\u0131 zamanda uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rmak, g\u00f6revleri otomatikle\u015ftirmek ve g\u00fcvenli\u011fini sa\u011flamak i\u00e7in de g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Bu b\u00f6l\u00fcmde, daha deneyimli kullan\u0131c\u0131lar i\u00e7in pratik ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131 sunan ileri d\u00fczey anotasyon kullan\u0131mlar\u0131n\u0131 ke\u015ffedece\u011fiz.<\/p>\n<h3 id=\"onbellekleme-ile-performansi-artirma-cacheable-cacheput-cacheevict\">\u00d6nbellekleme ile Performans\u0131 Art\u0131rma: <code>@Cacheable<\/code>, <code>@CachePut<\/code>, <code>@CacheEvict<\/code><\/h3>\n<p>Veritaban\u0131 veya uzak servis \u00e7a\u011fr\u0131lar\u0131 gibi pahal\u0131 operasyonlar\u0131n sonu\u00e7lar\u0131n\u0131 \u00f6nbelle\u011fe almak, uygulaman\u0131z\u0131n performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Spring, deklaratif \u00f6nbellekleme yeteneklerini anotasyonlar arac\u0131l\u0131\u011f\u0131yla sunar. \u00d6nbellekleme i\u00e7in Spring'in bir \u00f6nbellek sa\u011flay\u0131c\u0131s\u0131 ile (\u00f6rne\u011fin Ehcache, Caffeine veya Redis) entegre olmas\u0131 gerekir.<\/p>\n<ul>\n<li><code>@Cacheable(\"cacheAdi\")<\/code>: Bir metodun sonucunu \u00f6nbelle\u011fe al\u0131r. Metot tekrar ayn\u0131 arg\u00fcmanlarla \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, metodun kendisi \u00e7al\u0131\u015ft\u0131r\u0131lmaz, bunun yerine \u00f6nbellekteki de\u011fer d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/li>\n<li><code>@CachePut(\"cacheAdi\")<\/code>: Metodu her zaman \u00e7al\u0131\u015ft\u0131r\u0131r ancak sonucunu \u00f6nbelle\u011fe g\u00fcnceller. \u00d6zellikle bir nesne g\u00fcncellendi\u011finde \u00f6nbelle\u011fi de senkronize etmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<li><code>@CacheEvict(\"cacheAdi\")<\/code>: \u00d6nbellekteki bir veya daha fazla giri\u015fi kald\u0131r\u0131r. \u00d6rne\u011fin, bir nesne silindi\u011finde ilgili \u00f6nbellek giri\u015fini temizlemek i\u00e7in kullan\u0131labilir. <code>allEntries=true<\/code> ile t\u00fcm \u00f6nbelle\u011fi temizleyebilirsiniz.<\/li>\n<\/ul>\n<pre><code>\nimport org.springframework.cache.annotation.CacheEvict;\nimport org.springframework.cache.annotation.CachePut;\nimport org.springframework.cache.annotation.Cacheable;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class UrunService {\n\n    \/\/ ... repository ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ...\n\n    @Cacheable(\"urunler\") \/\/ urunler ad\u0131nda \u00f6nbelle\u011fe al\n    public Urun findUrunById(Long id) {\n        System.out.println(\"Veritaban\u0131ndan \u00fcr\u00fcn \u00e7ekiliyor: \" + id);\n        \/\/ Ger\u00e7ek veritaban\u0131 \u00e7a\u011fr\u0131s\u0131\n        \/\/ return urunRepository.findById(id).orElse(null);\n        return new Urun(id, \"\u00d6rnek \u00dcr\u00fcn \" + id, 100.0); \/\/ Sim\u00fclasyon\n    }\n\n    @CachePut(value = \"urunler\", key = \"#urun.id\") \/\/ \u00dcr\u00fcn\u00fc g\u00fcncelle ve \u00f6nbelle\u011fi yenile\n    public Urun updateUrun(Urun urun) {\n        System.out.println(\"\u00dcr\u00fcn g\u00fcncelleniyor: \" + urun.getId());\n        \/\/ Ger\u00e7ek veritaban\u0131 g\u00fcncellemesi\n        return urun;\n    }\n\n    @CacheEvict(\"urunler\") \/\/ \u00dcr\u00fcn\u00fc sil ve \u00f6nbellekten kald\u0131r\n    public void deleteUrun(Long id) {\n        System.out.println(\"\u00dcr\u00fcn siliniyor: \" + id);\n        \/\/ Ger\u00e7ek veritaban\u0131 silme i\u015flemi\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu anotasyonlar\u0131 kullanabilmek i\u00e7in <code>@EnableCaching<\/code> anotasyonunu Spring Boot uygulaman\u0131z\u0131n ana s\u0131n\u0131f\u0131na veya bir konfig\u00fcrasyon s\u0131n\u0131f\u0131na eklemeniz gerekti\u011fini unutmay\u0131n.<\/p>\n<h3 id=\"gorev-zamanlama-scheduled-ile-otomasyon\">G\u00f6rev Zamanlama: <code>@Scheduled<\/code> ile Otomasyon<\/h3>\n<p>Periyodik olarak belirli g\u00f6revleri (\u00f6rne\u011fin, rapor olu\u015fturma, veritaban\u0131 bak\u0131m\u0131, e-posta g\u00f6nderme) \u00e7al\u0131\u015ft\u0131rman\u0131z gerekebilir. Spring'in <code>@Scheduled<\/code> anotasyonu, cron ifadeleri veya sabit zaman aral\u0131klar\u0131yla metotlar\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r.<\/p>\n<pre><code>\nimport org.springframework.scheduling.annotation.Scheduled;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class GorevZamanlayici {\n\n    @Scheduled(fixedRate = 5000) \/\/ Her 5 saniyede bir \u00e7al\u0131\u015f\u0131r\n    public void periyodikGorev() {\n        System.out.println(\"Periyodik g\u00f6rev \u00e7al\u0131\u015f\u0131yor: \" + System.currentTimeMillis() \/ 1000);\n    }\n\n    @Scheduled(cron = \"0 0 1 * * ?\") \/\/ Her g\u00fcn gece 01:00'de \u00e7al\u0131\u015f\u0131r\n    public void gunlukRaporOlustur() {\n        System.out.println(\"G\u00fcnl\u00fck rapor olu\u015fturuluyor...\");\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><code>@EnableScheduling<\/code> anotasyonunu uygulaman\u0131z\u0131n ana s\u0131n\u0131f\u0131na veya bir konfig\u00fcrasyon s\u0131n\u0131f\u0131na ekleyerek zamanlama \u00f6zelli\u011fini etkinle\u015ftirmeniz gerekir.<\/p>\n<h3 id=\"guvenlik-kontrolu-secured-ve-preauthorize\">G\u00fcvenlik Kontrol\u00fc: <code>@Secured<\/code> ve <code>@PreAuthorize<\/code><\/h3>\n<p>Spring Security ile entegre edildi\u011finde, metot d\u00fczeyinde yetkilendirme kontrol\u00fc i\u00e7in anotasyonlar\u0131 kullanabilirsiniz. Bu, hassas operasyonlar\u0131n sadece belirli rollere veya yetkilere sahip kullan\u0131c\u0131lar taraf\u0131ndan eri\u015filebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<ul>\n<li><code>@Secured({\"ROLE_ADMIN\", \"ROLE_EDITOR\"})<\/code>: Belirtilen rollerden herhangi birine sahip kullan\u0131c\u0131lar\u0131n metoda eri\u015fmesine izin verir.<\/li>\n<li><code>@PreAuthorize(\"hasRole('ADMIN') or hasPermission('EDIT_PRODUCT')\")<\/code>: Spring Expression Language (SpEL) kullanarak daha karma\u015f\u0131k yetkilendirme ifadeleri yazman\u0131z\u0131 sa\u011flar. Metot \u00e7a\u011fr\u0131lmadan \u00f6nce yetkilendirme kontrol\u00fc yap\u0131l\u0131r.<\/li>\n<\/ul>\n<pre><code>\nimport org.springframework.security.access.annotation.Secured;\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class YonetimService {\n\n    @Secured(\"ROLE_ADMIN\")\n    public String sistemAyarlariniGuncelle() {\n        return \"Sistem ayarlar\u0131 g\u00fcncellendi (Admin yetkili).\";\n    }\n\n    @PreAuthorize(\"hasRole('ADMIN') or #kullaniciId == authentication.principal.id\")\n    public String kullaniciProfiliniDuzenle(Long kullaniciId) {\n        return \"Kullan\u0131c\u0131 \" + kullaniciId + \" profili d\u00fczenlendi.\";\n    }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu anotasyonlar\u0131 kullanabilmek i\u00e7in Spring Security'yi projenize eklemeli ve <code>@EnableMethodSecurity<\/code> (veya eski versiyonlarda <code>@EnableGlobalMethodSecurity<\/code>) anotasyonunu bir konfig\u00fcrasyon s\u0131n\u0131f\u0131na eklemeniz gerekmektedir.<\/p>\n<div class=\"expert-tip\">\n        <strong>Uzman \u0130pucu:<\/strong> Geli\u015ftirdi\u011finiz API'lerin farkl\u0131 cihaz t\u00fcrleri (mobil, tablet, masa\u00fcst\u00fc) taraf\u0131ndan t\u00fcketilece\u011fini unutmay\u0131n. Spring'in anotasyon bazl\u0131 yap\u0131s\u0131, arka ucu sade ve g\u00fc\u00e7l\u00fc tutarak, client-side responsivite i\u00e7in esnek bir temel sa\u011flar. REST API'leriniz, frontend taraf\u0131nda medya sorgular\u0131 ve esnek layout'lar ile mobil uyumlulu\u011fu destekleyebilir.\n    <\/div>\n<p>Bu ileri d\u00fczey anotasyonlar, Spring uygulamalar\u0131n\u0131z\u0131n sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda performansl\u0131, otomatik ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flar. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, kodunuzun karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131rken uygulaman\u0131z\u0131n yeteneklerini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131rlar.<\/p>\n<h2 id=\"sonuc\">Sonu\u00e7<\/h2>\n<p>Bu makalede, Spring anotasyonlar\u0131n\u0131n modern Java uygulama geli\u015ftirmedeki vazge\u00e7ilmez rol\u00fcn\u00fc kapsaml\u0131 bir \u015fekilde inceledik. Temel yap\u0131land\u0131rmadan ba\u011f\u0131ml\u0131l\u0131k enjeksiyonuna, veritaban\u0131 etkile\u015fimlerinden web uygulamas\u0131 ve REST API geli\u015ftirmeye, hatta performans\u0131 art\u0131rma ve g\u00fcvenli\u011fi sa\u011flama gibi ileri d\u00fczey konulara kadar bir\u00e7ok alanda anotasyonlar\u0131n ne kadar g\u00fc\u00e7l\u00fc ve esnek ara\u00e7lar oldu\u011funu g\u00f6rd\u00fck. Spring anotasyonlar\u0131, kod karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131rken geli\u015ftirici verimlili\u011fini art\u0131ran, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir uygulamalar olu\u015fturman\u0131n anahtar\u0131d\u0131r. Bu rehberin, Spring d\u00fcnyas\u0131na yeni ad\u0131m atanlar i\u00e7in sa\u011flam bir temel olu\u015fturdu\u011funu ve anotasyonlar\u0131n g\u00fcc\u00fcn\u00fc tam anlam\u0131yla kavraman\u0131z\u0131 sa\u011flad\u0131\u011f\u0131n\u0131 umuyoruz. Art\u0131k Spring uygulamalar\u0131n\u0131z\u0131 \u00e7ok daha bilin\u00e7li ve etkili bir \u015fekilde geli\u015ftirmeye haz\u0131rs\u0131n\u0131z!<\/p>\n<h2 id=\"sikca-sorulan-sorular\">S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<ul>\n<li>\n            <strong>S: T\u00fcm Spring anotasyonlar\u0131n\u0131 ezberlemek zorunda m\u0131y\u0131m?<\/strong><\/p>\n<p>C: Hay\u0131r, kesinlikle gerek yok! Temel anotasyonlar\u0131 (<code>@Component<\/code>, <code>@Service<\/code>, <code>@Repository<\/code>, <code>@Controller<\/code>, <code>@Autowired<\/code>, <code>@SpringBootApplication<\/code>) anlamak ve s\u0131k\u00e7a kullan\u0131lan di\u011ferlerini (<code>@GetMapping<\/code>, <code>@PostMapping<\/code>, <code>@Transactional<\/code>) tan\u0131mak yeterlidir. \u0130htiya\u00e7 duyduk\u00e7a di\u011ferlerini ke\u015ffedebilirsiniz. Spring belgeleri ve topluluk kaynaklar\u0131 her zaman yan\u0131n\u0131zda olacakt\u0131r.<\/p>\n<\/li>\n<li>\n            <strong>S: <code>@Component<\/code> ile <code>@Service<\/code>, <code>@Repository<\/code> ve <code>@Controller<\/code> aras\u0131ndaki fark nedir?<\/strong><\/p>\n<p>C: <code>@Component<\/code> genel bir Spring bile\u015fenini i\u015faretler. Di\u011ferleri ise <code>@Component<\/code>'\u0131n \u00f6zelle\u015fmi\u015f versiyonlar\u0131d\u0131r ve semantik bir anlam ta\u015f\u0131rlar. \u00d6rne\u011fin, <code>@Service<\/code> i\u015f mant\u0131\u011f\u0131 katman\u0131ndaki bile\u015fenleri, <code>@Repository<\/code> veri eri\u015fim katman\u0131ndaki bile\u015fenleri, <code>@Controller<\/code> ise web iste\u011fi i\u015fleme katman\u0131ndaki bile\u015fenleri belirtir. Bu semantik ayr\u0131m, kodunuzun okunabilirli\u011fini art\u0131r\u0131r ve Spring'in \u00f6zel yeteneklerini (\u00f6rne\u011fin, <code>@Repository<\/code> i\u00e7in istisna \u00e7evirisi) etkinle\u015ftirir.<\/p>\n<\/li>\n<li>\n            <strong>S: <code>@Autowired<\/code> yerine <code>new<\/code> anahtar kelimesini kullanabilir miyim?<\/strong><\/p>\n<p>C: Genellikle hay\u0131r. <code>new<\/code> anahtar kelimesi ile olu\u015fturdu\u011funuz nesneler, Spring konteyneri taraf\u0131ndan y\u00f6netilmez. Bu da o nesnenin ba\u011f\u0131ml\u0131l\u0131k enjeksiyonundan, ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netiminden veya Spring'in di\u011fer \u00f6zelliklerinden faydalanamamas\u0131na neden olur. <code>@Autowired<\/code> kullanmak, Spring'in IoC prensibini takip etmenizi ve gev\u015fek ba\u011fl\u0131, test edilebilir bile\u015fenler olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n            <strong>S: Spring anotasyonlar\u0131 uygulaman\u0131n mobil uyumlulu\u011funu nas\u0131l etkiler?<\/strong><\/p>\n<p>C: Spring anotasyonlar\u0131 do\u011frudan bir uygulaman\u0131n frontend'indeki mobil uyumlulu\u011fu etkilemez. Bunlar daha \u00e7ok backend (sunucu taraf\u0131) geli\u015ftirme ile ilgilidir. Ancak, <code>@RestController<\/code> gibi anotasyonlar sayesinde olu\u015fturdu\u011funuz REST API'ler, mobil uygulamalar veya responsive web tasar\u0131mlar\u0131 i\u00e7in veri kayna\u011f\u0131 g\u00f6revi g\u00f6r\u00fcr. G\u00fc\u00e7l\u00fc ve iyi tasarlanm\u0131\u015f bir Spring backend, mobil uyumlu frontend'lerin sorunsuz \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli veriyi ve hizmetleri sa\u011flar. Frontend'deki mobil uyumluluk (responsive tasar\u0131m) genellikle CSS medya sorgular\u0131, esnek layout'lar ve JavaScript arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern Java uygulamalar\u0131 geli\u015ftirirken, karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131n\u0131n labirentinde kaybolmak yerine, kodunuzu daha okunabilir, y\u00f6netilebilir ve g\u00fc\u00e7l\u00fc hale getiren&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31178","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz<\/title>\n<meta name=\"description\" content=\"Modern Java uygulamalar\u0131 geli\u015ftirirken, karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131n\u0131n labirentinde kaybolmak yerine, kodunuzu daha okunabilir, y\u00f6netilebilir ve g\u00fc\u00e7l\u00fc hale getiren sihirli bir dokunu\u015f ar\u0131yor musunuz? Spring Framework&#039;\u00fcn kalbinde yer alan anotasyonlar, i\u015fte tam da bu noktada devreye giriyor. Bu kapsaml\u0131 rehberde, Spring anotasyonlar\u0131n\u0131n g\u00fcc\u00fcn\u00fc ve yeni ba\u015flayanlar i\u00e7in ad\u0131m ad\u0131m nas\u0131l ustala\u015f\u0131laca\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Art\u0131k Spring uygulamalar\u0131 geli\u015ftirmek sadece bir yap\u0131land\u0131rma kabusu olmaktan \u00e7\u0131k\u0131p, keyifli bir deneyime d\u00f6n\u00fc\u015febilir!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz\" \/>\n<meta property=\"og:description\" content=\"Modern Java uygulamalar\u0131 geli\u015ftirirken, karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131n\u0131n labirentinde kaybolmak yerine, kodunuzu daha okunabilir, y\u00f6netilebilir ve g\u00fc\u00e7l\u00fc hale getiren sihirli bir dokunu\u015f ar\u0131yor musunuz? Spring Framework&#039;\u00fcn kalbinde yer alan anotasyonlar, i\u015fte tam da bu noktada devreye giriyor. Bu kapsaml\u0131 rehberde, Spring anotasyonlar\u0131n\u0131n g\u00fcc\u00fcn\u00fc ve yeni ba\u015flayanlar i\u00e7in ad\u0131m ad\u0131m nas\u0131l ustala\u015f\u0131laca\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Art\u0131k Spring uygulamalar\u0131 geli\u015ftirmek sadece bir yap\u0131land\u0131rma kabusu olmaktan \u00e7\u0131k\u0131p, keyifli bir deneyime d\u00f6n\u00fc\u015febilir!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-06T19:02:24+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz\",\"datePublished\":\"2025-10-06T19:02:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/\"},\"wordCount\":3925,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/\",\"name\":\"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-06T19:02:24+00:00\",\"description\":\"Modern Java uygulamalar\u0131 geli\u015ftirirken, karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131n\u0131n labirentinde kaybolmak yerine, kodunuzu daha okunabilir, y\u00f6netilebilir ve g\u00fc\u00e7l\u00fc hale getiren sihirli bir dokunu\u015f ar\u0131yor musunuz? Spring Framework'\u00fcn kalbinde yer alan anotasyonlar, i\u015fte tam da bu noktada devreye giriyor. Bu kapsaml\u0131 rehberde, Spring anotasyonlar\u0131n\u0131n g\u00fcc\u00fcn\u00fc ve yeni ba\u015flayanlar i\u00e7in ad\u0131m ad\u0131m nas\u0131l ustala\u015f\u0131laca\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Art\u0131k Spring uygulamalar\u0131 geli\u015ftirmek sadece bir yap\u0131land\u0131rma kabusu olmaktan \u00e7\u0131k\u0131p, keyifli bir deneyime d\u00f6n\u00fc\u015febilir!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz","description":"Modern Java uygulamalar\u0131 geli\u015ftirirken, karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131n\u0131n labirentinde kaybolmak yerine, kodunuzu daha okunabilir, y\u00f6netilebilir ve g\u00fc\u00e7l\u00fc hale getiren sihirli bir dokunu\u015f ar\u0131yor musunuz? Spring Framework'\u00fcn kalbinde yer alan anotasyonlar, i\u015fte tam da bu noktada devreye giriyor. Bu kapsaml\u0131 rehberde, Spring anotasyonlar\u0131n\u0131n g\u00fcc\u00fcn\u00fc ve yeni ba\u015flayanlar i\u00e7in ad\u0131m ad\u0131m nas\u0131l ustala\u015f\u0131laca\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Art\u0131k Spring uygulamalar\u0131 geli\u015ftirmek sadece bir yap\u0131land\u0131rma kabusu olmaktan \u00e7\u0131k\u0131p, keyifli bir deneyime d\u00f6n\u00fc\u015febilir!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/","og_locale":"tr_TR","og_type":"article","og_title":"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz","og_description":"Modern Java uygulamalar\u0131 geli\u015ftirirken, karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131n\u0131n labirentinde kaybolmak yerine, kodunuzu daha okunabilir, y\u00f6netilebilir ve g\u00fc\u00e7l\u00fc hale getiren sihirli bir dokunu\u015f ar\u0131yor musunuz? Spring Framework'\u00fcn kalbinde yer alan anotasyonlar, i\u015fte tam da bu noktada devreye giriyor. Bu kapsaml\u0131 rehberde, Spring anotasyonlar\u0131n\u0131n g\u00fcc\u00fcn\u00fc ve yeni ba\u015flayanlar i\u00e7in ad\u0131m ad\u0131m nas\u0131l ustala\u015f\u0131laca\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Art\u0131k Spring uygulamalar\u0131 geli\u015ftirmek sadece bir yap\u0131land\u0131rma kabusu olmaktan \u00e7\u0131k\u0131p, keyifli bir deneyime d\u00f6n\u00fc\u015febilir!","og_url":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-06T19:02:24+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz","datePublished":"2025-10-06T19:02:24+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/"},"wordCount":3925,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/","url":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/","name":"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-06T19:02:24+00:00","description":"Modern Java uygulamalar\u0131 geli\u015ftirirken, karma\u015f\u0131k konfig\u00fcrasyon dosyalar\u0131n\u0131n labirentinde kaybolmak yerine, kodunuzu daha okunabilir, y\u00f6netilebilir ve g\u00fc\u00e7l\u00fc hale getiren sihirli bir dokunu\u015f ar\u0131yor musunuz? Spring Framework'\u00fcn kalbinde yer alan anotasyonlar, i\u015fte tam da bu noktada devreye giriyor. Bu kapsaml\u0131 rehberde, Spring anotasyonlar\u0131n\u0131n g\u00fcc\u00fcn\u00fc ve yeni ba\u015flayanlar i\u00e7in ad\u0131m ad\u0131m nas\u0131l ustala\u015f\u0131laca\u011f\u0131n\u0131 ke\u015ffedece\u011fiz. Art\u0131k Spring uygulamalar\u0131 geli\u015ftirmek sadece bir yap\u0131land\u0131rma kabusu olmaktan \u00e7\u0131k\u0131p, keyifli bir deneyime d\u00f6n\u00fc\u015febilir!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/spring-anotasyonlari-rehberi-yeni-baslayanlar-icin-kapsamli-kilavuz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring Anotasyonlar\u0131 Rehberi: Yeni Ba\u015flayanlar \u0130\u00e7in Kapsaml\u0131 K\u0131lavuz"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31178","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31178"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31178\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31178"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31178"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31178"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}