Spring Boot ve Hibernate Anotasyonları
@SprinBootApplication
Spring
uygulamasının giriş classını belirtir. Bu anotasyonun olduğu classın main
metodunda bulunan SpringApplication.run işlemi ile spring boot uygulamamızın on
yüklemesini yaparız böylece uygulama bağlamı oluşturulacak, beanler
kaydedilecek ve varsayılan olarak gömülü olan tomcat gibi gömülü sunucuyu
başlatılacaktır..
@RequestMapping
@Controller
ile işaretlenen sınıfa gelen HTTP isteklerinin path eşleştirmesini yapar. Bir
sınıf üzerinde @RequestMapping(path="api",method=RequestMethod.GET)
şeklinde kullanılırsa kullanılan sınıfın api şeklinde gelen URL ile ilgili tüm
işleri yapması sağlanır. Metotlar üzerinde de kullanımı vardır. Eğer metot
üzerinde @RequestMapping(path="ilGetir") şeklinde kullanılırsa
ilGetir şeklindeki isteklerde bu metot çalışır.
Diğer RequestMethod türleri ise
GET -> Sorgulama (SELECT)
POST -> Kaydetme (INSERT)
PUT -> Güncelleme(UPDATE)
DELETE -> Silme (DELETE)
ve PATCH -> Verinin bir bölümünü güncelleme metotlarıdır.
@RequestParam
Anotasyonu
Bu anotasyon,
bir metodun çağrılması sırasında gönderilen bir parametreyi almasını sağlar.
Örneğin:
@GetMapping("/film/ara")
public List<Movie> getFilmAdi(@RequestParam(value =
"filmAdi", required = true) String name) {
Burada
getFilmAdi methodu parametre olarak filmAdi adında zorunlu bir değer alır ve bu
değer otomatik olarak name değişkenine
atanır.
}
@GetMapping Anotasyonu
GetMapping
anotasyonu RequestMapping annotasyonunun özelleştirilmiş halidir diyebiliriz.
Örneğin:
@GetMapping(path="getir")
public String illeriGetir(){ }
bu örnekte getMapping olarak işaretlendiği için /getir ile
gelen isteklerde RequestMethod direk
olarak GET alınır ve sonuç getirilir. PostMapping , PutMapping, DeleteMapping
gibi diğer RequestMethod lar içinde özelleştirme yapılıp metot bazında
kullanılarak daha spesifik işlemler yapılabilir.
GetMapping işleminde parametre alarak da işlemler
yapılabilir. Örneğin:
@GetMapping(path="ilGetir/{ilId}")
Public String ilGetir(@PathVariable("ilId") String
kod){
} şeklinde kullanılır.
@Entity Anotasyonu
Veri tabanı
tablosunu ifade eder. Java sınıflarını veri tabanı tablolarına eşler. Entity
anotasyonu ile işaretlenen classların içinde veri tabanı tablo kolonları
bulunur.
@Id Anotasyonu
Kolonun id
kolonu olduğunu belirtir. Her entity sınıfı için gerekli bir anotasyondur.
@GeneratedValue(strategy=GenerationType.AUTO) Anotasyonu
Id kolonunun
artış stratejisini belirtmek için kullanılır. AUTO, IDENTITY, SEQUENCE ve TABLE
olmak üzere4 çeşittir.
IDENTITY -> tablodaki primary key değerinin son kaydını
bir artırıp kullanır.
SEQUENCE -> Değer
artırımı veri tabanında tanımlı bir sequence tanımına göre yapılır. Performans
açısından tercih edilen bir yöntemdir. Ayrıca @SequenceGenerator anotasyonu
kullanarak bunu daha spesifik olarak kullanmak mümkündür. Örneğin
@SequenceGenerator(name="generatorIsmi",sequenceName="tabloAdi",initialValue="başlangıçDeğeri",allocationSize="artışMiktarı")
şeklinde kullanılır.
TABLE -> Sequence desteklenmeyen durumlarda sequence
yerine kullanmak içindir. Çok kullanımı bulunmamaktadır.
@Transient Anotasyonu
Entity ile
işaretlenmiş classta bulunan bir alanın üstünde bu anotasyon varsa veri
tabanında bu alan oluşturulmaz. Örneğin veri tabanında ad ve soyad alanları ayır
ayrı tutuluyor. Biz adSoyad alanında bu iki alanı birleştirip gösteriyorsak
alan tanımının üzerine @Transient koyarak bunun veri tabanı ile bir ilgisi
olmadığını belirtiriz.
@Column Anotasyonu
Üzerine Column
anotasyonu koyulan değişkenin bir tablo kolonu olduğunu belirtir.
@Column(name="Kolon_Adi") şeklinde name değeri verilirse bu değer
veri tabanındaki kolonun tam adını gösterir. Eğer name değeri verilmemişse
değişken adı ile aynı olan bir veri tabanı kolon adı arar.
@Embeddable ve
@Embedded Anotasyonu
class @Entity
olarak değilde @Embeddable olarak işaretlenirse ana tablo olarak değil de üye
tablo içerisinde gömülü olarak tutulacağını belirtiriz ve ana tablo içerisinde
tanımladığımız değişkeni de @Embedded olarak işaretleriz.
@OneToOne Anotasyonu
Join yapılacak
tabloyla olan ilişki türünün bire bir ilişki olduğunu belirtmek için
kullanılır.
@OneToMany Anotasyonu
Join yapılacak
tabloyla olan ilişki türünün bire çok ilişki olduğunu belirtmek için
kullanılır.
@ManyToMany
Anotasyonu
Join yapılacak
tabloyla olan ilişki türünün çoka çok ilişki olduğunu belirtmek için
kullanılır.
@ManyToOne Anotasyonu
Join yapılacak
tabloyla olan ilişki türünün çoka bir ilişki olduğunu belirtmek için
kullanılır.
@JoinColumn(name="addressID")
Anotasyonu
Join yapılacak
tablonun id kolonunu belirtmek için kullanılır.
@Autowired Anotasyonu
Autowired
olarak işaretlenen classların nesneleri otomatik olarak oluşturulup enjekte
edilirler. AutoWired anotasyonu springe bağımlılık enjekte etmesini söyler.
Eğer sadece bir constructor varsa autowired anotasyonu yazmasak ta olur.
@Table Anotasyonu
@Table(name =
Sample_Table) Table anotasyonu classın bir veri tabanı tablosu olduğunu
gösterir name verilmezse class ismiyle tablo ismi aynı olarak değerlendirilir.
name alanına veri tabanındaki tablo adı verilir
@Column Anotasyonu
@Column(name="ID") Column anotasyonu ver tabanı kolonları için
kullanılır name verilmezse kolon adı değişken adı ile aynı olur.
GenerationType olarak AUTO, SEQUENCE,TABLE olarak 3 cesıdı
daha vardır. En çok tercih edileni IDENTITY dir. Ayrıca custom olarak generatıontype
tanımlayabiliriz.
@EnableAutoConfıguration
Anotasyonu
Spring bootun
otomatik yapılandırma desteğini etkinleştirir
@Controller
Anotasyonu
Sınıfın bir MVC
Controller olduğunu belirtir. Kullanıcı istekleri bu sınıf tarafından işlenir
ve isteklere uygun yanıtlar döndürülür.
@Service Anotasyonu
Sınıfın bir servis
sınıfı olduğunu belirtir.
@Repository
Anotasyonu
Sınıfın bir
veri tabanı erişim katmanı olduğunu belirtir. Veri tabanı erişim işlemlerinin
yapıldığı sınıflardır.
@Component Anotasyonu
Sınıfı bir
sprıng bean olarak işaretler ve bağımlılık enjeksiyonu için kullanabilir hale
getirir
@ComponentScan
Anotasyonu
Gecerlı
paketın bileşen taramasını etkinleştirir ve ayrıca alt paketleri recursive
olarak tarar. Componentscan işlemi bu paketin dışında kalanları taramaz. Bu
paket dışındakilerin de taranmasını istiyorsak @SpringBootApplication
anotasyonuna ScanBasePackages olarak array seklinde taranacak paketleri aşağıdaki gibi vermemiz gerekir:
@SpringBootApplication(ScanBasePackages={"com.mndsoftware.utils","com.mndsoftware.models"})
public class aaaaaa{ }
@Qualifier Anotasyonu
İnterface
implementasyonu birden fazla ise veya bir sınıfın örnekleri hafızada birden
fazla ise Spring, IOC yapısında hangi interface ile hangi sınıfı bağlayacağını
bilemeyecektir. Hangi java bean'ını hangi anda kullanmak istediğini daha net
belirlemek için Qualifier kullanılır.
@Autowired
public DemoController(@Qualifier("trackCoach")
Coach theCoach){
myCoach =
theCoach;
}
Burada Spring,
theCoach değerinin hangisine karşılık geldiğini qualifierda bulunan değerden
anlaması sağlanmıştır.
@Primary Anotasyonu
Qualifier
anotasyonunu kullanmadan direk olarak hangi beani kullanacağını belirtir.
Primary anotasyonunu birden fazla classta kullanamazsınız.
@Primary ve
Qualifier anotasyonları beraber kullanılabilir fakat tercih edilmeyen bir
yöntemdir. İkisini beraber kullandığınızda @Qualifier anotasyonu daha yüksek
bir önceliğe sahip olduğu için Primary anotasyonu ezer. Daha spesifik ve
önceliği yüksek olduğu için best practice
olarak @Qualifier anotasyonunu kullanmak daha uygun olur.
@Lazy Anotasyonu
Lazy olarak
işaretlenen classlar çağırılmadığı surece oluşturulmazlar. ihtiyaç olduğunda
oluşturulurlar, Eğer application propertıes dosyası üzerinden Lazy
ınıtıalızatıonu acarsak bu sefer hiçbir class çağırılmadan oluşturulmaz.
@Scope Anotasyonu
Default olarak
scopelar sıngletondır bir örnek oluşturulur ve kullanılır.@Scope anotasyonu ile
scope belirtilir. @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) şeklinde
ConfigurableBeanFactory scopeları verilir. Sigleton haricinde aşağıdaki
scopelar vardır:
Prototype Scope: Her konteyner isteği veya her injection
noktası için yeni bir instance oluşturur.
Request Scope : Sadece web uygulamaları için kullanılır.
Http web isteği sırasında ınstance oluşturur.
Global-Session: global web oturumuna kapsamlandırılmış bir
scope türüdür.
Session Scope: Yalnızca web uygulamaları için session açık
kaldığı sürece kullanılır.
@PostConstruct
Anotasyonu
Uygulama
çalışırken çağırılır ve PostConstruct ile işaretlenen metotlar çalıştırılır.
@PreDestroy
Anotasyonu
Bu anotasyonla
işaretlenen metotları herhangi bir temizleme işlemi için kendi özel mantığımızı işletebiliriz. Uygulama
durmadan önce çalışır
@Bean anotasyonu
Mevcut bir
third party sınıflarını almak ve ardından onu spring uygulamalarımızda
kullanabileceğimiz bir bean olarak sarmak ve kullanmaktır.
@Configuration
anotationu
@Bean ek
anotasyonu ile extra bean kaydedebilir veya diğer yapılandırma sınıflarını
import edebilir.
@PathVariable
Anotasyonu
Bir metodun
çağrılması sırasında gönderilen parametrenin almasını sağlar. Örneğin bir
metodun /il/{kod} adresiyle çağrılması sırasında gönderilen “kod” değişkenini
almak için @PathVariable(“kod”) int id anotasyonunu kullanarak parametreye
erişebiliriz.
@ModelAttribute
Anotasyonu
Bir metodun
çağrılırken gönderilen bir nesneyi almak ve ardından kullanmak istiyorsak
@ModelAttribute(“adres”) Adres adres şeklinde anotasyonunu kullanabilirsiniz.
Bu sayede adres bilgileri direk olarak Adres clasına dönüştürülür ve
kullanılır.
@SessionAttributes
Anotasyonu
Bir sınıfın
oturum verilerini saklamak için kullanılır. Örnek olarak sepeti bilgilerini
sesion süresince tutmak ve sayfalar arası geçişte bile okumak için
@SessionAttributes(“sepet”) şeklinde kullanabiliriz.
@ExceptionHandler
Anotasyonu
Adından da anlaşılacağı üzere
hata yakalamak ve response olarak dödürmek için kullanılır. Custom exception
tanımlayarak alınan hataya göre HttpStatusları doldurup kullanıcıya ResponseEntity türünden exception
gönderirilir.
@ControllerAdvise Anotasyonu
ControllerAdvise anotasyonu AOP(Aspect Oriented Programming)' in gerçek
zamanlı kullanımıdır. Denetleyiciler üzerinde ön işlem ve son işlem yapmak için
kullanabileceğimiz bir AOP dir.
Normal bir
tasarımda istemci rest servisine bir istekte bulunur ve rest servisi isteği
işler ve hata varsa exception fırlatır.
ControllerAdvise kullanarak tasarladığımızda ise resimde görüldüğü gibi
exceptıon handler rest servis dışına taşınır ve ControllerAdvise içine yerleştirilir.
İstemci servise bir istekte bulunur sonra istek işlemesi için ControllerAdvise'a gelir ardından REST
servisimize gelir . Yanlış birsey varsa rest servisin exception fırlatması
yerine exceptionları ControllerAdvise fırlatır bu satede global exception
handling mekanizmasını yapmış oluruz. Dolayısıyla her REST hizmetinde bütün
exception işlemlerini yazmaya gerek kalmaz.
Gönderilen alanın min ve max uzunlugunu ayarlamak için kullanılır. Eğer alan belirlenen değerden uzun yada kısaysa message degerindeki hata mesajı gösterilir.Örneğin
@Min(value=1, message="Girdiğiniz adet 1 den büyük yada eşit olmalıdır")
@Max(value=5, message="Girdiğiniz adet 5 ten küçük yada eşit olmalıdır")
private int adet;
@Pattern Anotasyonu
Doğrulama işlemi için regular expression yazmamızı sağlar. Örneğin eposta alanı üzerine koyulup regular expression yazıldıgında e posta dogrulaması yazılan regular expressiona göre çalışır.
@Pattern(regexp = "[a-z0-9]+@[a-z]+\.[a-z]{2,3}",message = "E posta adresi yanlış")
private String ePosta;
Fetch Type
Eager
Eager anlamı istekli demektir yani bir seferinde bütün veriyi getirir. Eager kullanmanın uygulama performası uzerınde büyük etkisi vardır. Kullanımından kacınmak gerekir illaki kullanılacaksa dikkatlı kullanılmalıdır. Eager kullanımında baglı bütün entitityler getirilir. Küçük bir uygulama ve az bir veriniz varsa sorun yaratmaz ama uygulama ve veriler büyüdükçe performansta ciddi düşüşler yaşanacaktır.
Lazy
Lazy adındanda anlaşılacagı gibi tembel demektir ve sadece istek oldugu zaman veriyi getirir. Lazy loading öncelik olarak ana entitiyi yükler daha sonra bağımlı entitityleri talep üzerinde getirir.
Lazy loading kullanıldığında Hibernate sessionu acık olması gerekır aksi taktirde hata alırsınız.
Eğer ilişki türüne FechType verilmemişse ilişki türüne göre default fetchtype verilir.
Aşağıda ilişki türlerine göre default FetchType ları görebilirsiniz.
@OneToOne FetchType.EAGER
@OneToMany FetchType.LAZY
@ManyToOne FetchType.EAGER
@ManyToMany FetchType.LAZY
Yorumlar
Yorum Gönder