Spring’de @Repository ve @Autowired nasıl ve hangi amaçla kullanılır? Bu annotationları kullanmadan projemiz çalıştırabilir miyiz? spring uygulaması bunları algılayabilir mi?
Örneğin CrudRepository yu extend ettim bir interface’imde ancak annotation koymazsam olur mu?
//@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long>{
}
![][1]
[1]: https://hasscript.com/?qa=blob&qa_blobid=13338826180763639996
Senin için ufak bir grafik çizdim.
Önce bilmiyorsan context kavramını detaylandırman lazım. Ben kısaca söyleyeyim. Spring uygulaması ayağa kalktığı zaman sınıfına @Component,@Repository, @Service, @Controller annotationlarından biri eklenmişse onu kendi yönetir. Yani sen new diyerek oluşturmazsın. O oluşturur context içine atar orda durur. Yukarıda birkaç tane rastgele yazdım.
Sen new demediğine göre bu değerleri nasıl alacaksın? Burda da @Autowired devreye giriyor. Mesela MemberService sınıfında MemberRepository, EmailRepository ve AddressRepository sınıflarını kullanmak istiyorsun. O zaman kodun aşağıdaki gibi olur.
@Service
class MemberService {
@Autowired MemberRepository members;
@Autowired EmailRepository emails;
@Autowired AddressRepository addresses;
…
}
Artık tek tek sınıfları new diye oluşturmaya gerek kalmayacak. Spring kendisi oluşturup birbirine otomatik bağlar.
> Eğer başına bu annotationlardan eklenmiş bir sınıfı sen yine de
> **new** diyerek oluşturursan sınıfın yönetimini springden sen almış oluyorsun. Onun içindeki @Autowired alanlar çalışmaz. Hepsini kendin
> oluşturman gerekir.
——————
> @Controller, @Service, @Repository, @Component aynıdır birbirinin
> yerine kullanılabilir. @RestRepository aynı değildir.
Birinci sorunun cevabını vereyim. İkincisi için “ilgili soru sor” butonuyla yeni bir soru açarsan daha güzel olur.
Springin sana sunduğu annotationları kullanırsan objelerin hafıza yönetimi springe bırakmış olursun. Bir sınıfın üstüne @Repository yazarsan sınıfı hafızada spring new diyerek oluşturur, daha sonra dependency injection için sınıfın içinde springin yönetmesi gereken başka annotation ile belirlenmiş alan var mı diye bakar. Varsa onları da spring yönetiyor mu diye bakar ve yönetiyorsa sınıfa bağlar, yani değişkene atama yapar. Bi kere bu kısmı iyice oturtman lazım. ORM kısmı spring data ile gelen bir parça oluyor.
Anlamak için şunu yapabilirsin.
Gayet basit A sınıfı B sınıfına muhtaç Hem A hem B sınıfları şu an spring tarafından yönetildiği için sıkıntı olmaz. Ama gider B sınıfından @Repository annotationunu silersen hata alırsın. Çünkü A’yı spring ayağa kaldırırken B Autowired olduğu için dependent (muhtaç) diyecek ve bağlamaya çalışacak. Ama B sınıfında annotation’u kaldırdığın için onu yönetmiyor. Kaldı patladı. Birkaç örnekle daha detaylı anlamaya çalışabilirsin.