Merhaba arkadaşlar, bu yazımda JSR 250 ve JSR 330 ile Dependeny Injection işlemlerini anlatacağım. @Autowired notasyonuna benzer işlem yapmaktadırlar. JSR 330 notasyonlarını kullanabilmek için aşağıdaki dependency’i pom.xml dosyamıza ekleyelim:
1 2 3 4 5 |
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> |
Şimdi örnek üzerinden konuyu anlamaya çalışalım.
JSR-250
Address.java
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Address { private int no; private String street; public Address() { } public Address(int no, String street) { this.no = no; this.street = street; } // Getters and Setters |
Person.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public class Person { private int id; private String name; private String surname; private Address address; public Person() { } public Person(int id, String name, String surname,Address address) { this.id = id; this.name = name; this.surname = surname; this.address=address; System.out.println("parametreli yapıcı"); } public void print() { System.out.println("Person id =>"+id+" Name =>"+name+" Surname =>"+surname+" Address no =>"+address.getNo()+" street =>"+address.getStreet()); } @PostConstruct public void init() { System.out.println("İnit method.."); } @PreDestroy public void destroy() { System.out.println("Destroy method..."); } public Address getAddress() { return address; } @Resource(name="address2") public void setAddress(Address address) { this.address = address; } // Getters and Setters |
@PostConstructor => Program run edildiğinde ilk çalışan metotdur.(İnit metot)
@PreDestroy => Program sonlandırılmadan çalışan son metotdur.(Destroy metot).
@Resource => @Autowired benzeri işlem görür. Dependency injection işlemi yapar. address nesnemize inject etmek istediğimiz bean idsi ile inject işlemini yapmış olduk.
Application.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<context:annotation-config/> <bean id="address" class="_015_anno_jsr250_di.Address"> <constructor-arg name="no" value="81"/> <constructor-arg name="street" value="Bilinmez Caddesi"/> </bean> <bean id="address2" class="_015_anno_jsr250_di.Address"> <constructor-arg name="no" value="82"/> <constructor-arg name="street" value="Bilinmez2 Caddesi"/> </bean> <bean id="person" class="_015_anno_jsr250_di.Person"></bean> |
<Context:annotation-config> Bizim java sınıflarımızdaki notasyonlarımızı kontrol eder. address ,address2 ve person beanlerimizi oluşturduk.
Test.java
1 2 3 4 5 6 7 8 9 |
public class Test { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("_015_application.xml"); Person person=applicationContext.getBean("person",Person.class); person.print(); ((ClassPathXmlApplicationContext)applicationContext).close(); } } |
ApplicationContext nesnesi oluşturuldu ve application.xml dosyamız yüklendi. Person beani oluşturuldu. Print metodu çalıştırıldı ve ApplicationContext nesnesini kapattık.
Çıktı:
Görüldüğü gibi önce init metodu ve en sonra destroy metodu çalıştırıldı. Burada önemli nokta address2 nesnesinin enject edilmesidir.
JSR-330
Address.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@Named("address") public class Address { @Value("34") private int no; @Value("İstanbul Caddesi") private String street; public Address() { } public Address(int no, String street) { this.no = no; this.street = street; } // Getters and Setters |
@Named => Bean oluşturulur ve bean ismi verir.
@Value => İlk değer ataması yapar.
Person.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
@Named("person") public class Person { @Value("1") private int id; @Value("Furkan") private String name; @Value("KOÇ") private String surname; @Inject private Address address; public Person() { } public Person(int id, String name, String surname, Address address) { this.id = id; this.name = name; this.surname = surname; this.address = address; } public void print() { System.out.println("Person id =>"+id+" name =>"+name+" surname =>"+surname+" Address no =>"+address.getNo()+" street =>"+address.getStreet()); } // Getters and Setters |
@Inject => @Autowired benzeri dependency injection işlemini yapar.
Test.java
1 2 3 4 5 6 7 8 9 10 |
public class Test { public static void main(String[] args) { AbstractApplicationContext applicationContext=new ClassPathXmlApplicationContext("_015_application.xml"); Person person=applicationContext.getBean("person",Person.class); person.print(); applicationContext.close(); } } |
Application.xml
1 |
<context:component-scan base-package="_015_anno_jsr330_di"/> |
Notasyon araması yapar. Base-package aranması gerek paket belirtilir.
Görüldüğü gibi notasyonlarla dependency injection işlemlerini yapmış olduk. Bu yazımı burada bitiriyorum diğer yazılarımda görüşmek üzere….