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.




@InitBinder Anotasyonu

        InitBuilder anotasyonu bir pre processor yani ön işlemci olarak çalışır. Gelen her web isteği için ilk olarak burası çalışacaktır. InitBinder anotasyonu koyduğumuz metodda gelen isteği filtreleyebilir yada istek doğrulaması işlemlerini yapabilirsiniz.

@Min ve @Max Annotasyonu

        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

Bu blogdaki popüler yayınlar

CI(Continuous Integration) / CD(Continuous Delivery)

Tasarım Desenleri(Design Patterns) Nedir?