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.
@Repository class A{
@Autowired B b;
public void hi(String name) {
b.hi(name);
}
}
@Repository class B {
public void hi(String name) {
System.out.println("hi " + name);
}
}
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.