Java, Spring Framework Tight Coupling – Loose Coupling

Coupling (bağlaşım, bağlama) kurgusu: [code lang=”java”] class MyClass01 { public void do() {} } class MyClass02 { private MyClass01 myClass01; public MyClass02() { myClass01 = new MyClass01(); } do02() { myClass01.do(); } } class MyClassTest02 { public static void main(String[] args) { MyClass02 myClass02 = new MyClass02(); myClass02.do02(); } } [/code] Yukarıdaki gibi bir yapıda myClass02 instance’ı oluşturularak ilerlenmektedir ve bu instance kendi içinde MyClass01 instance’ına ihtiyaç duymaktadır yani bağımlıdır. MyClass02 sınıfı myClass01 olmadan çalışamayacaktır. Bunun gibi her gerekli olan sınıfta myClass01 instance’ını oluşturmanız gerekmektedir. Java Interface (arayüz) sınıfları ekleyerek Loose Coupling (oynak/gevşek bağlaşım), Decoupling (bağlaşımı kesme) kurgusu ile ilerleme: [code lang=”java”] interface MyInterface11 { do(); } class MyClass12() implements MyInterface11 { @Override do(); } class MyClass13() implements MyInterface11 { @Override do(); } class MyClass14() { MyInterface11 myInterface11; public MyClass14(MyInterface11 myInterface11) { this.MyInterface11 = myInterface11; } public void do14() { myInterface11.do(); } } class MyClass14Test() { public static void main(String[] args) { MyClass12 myClass12 = new MyClass12(); MyClass13 myClass13 = new MyClass13(); MyClass14 myClass14 = new MyClass14(myClass12); myClass14.do14(); // myClass14 = new MyClass14(myClass13); // myClass14.do14(); } } [/code] Burada MyClass14 aslında MyInterface11 tipi beklemektedir ancak biz MyClass12 veya MyClass13 sınıflarını MyInterface11 arayüzünü implemente ettirdiğimiz için MyClass14 contructor’ına bu sınıfları gönderebiliyoruz. Yani sınıf bağımlılığımız olmamış oluyor mevcut sınıfın yerine MyInterface11’i implemente eden başka bir sınıf ekleyip bunu gönderebiliriz. Bu şekilde sınıflar arasındaki bağlaşımı kopartmış olduk. Spring Framework ile Dependency Injection (bağımlılık enjektesi) desteği ile Constructor Injection (yapıcı enjeksiyon) uygulayarak Java Interface (arayüz) sınıfları ekleyerek Loose Coupling (oynak/gevşek bağlaşım) kurgusu ile ilerleme: [code lang=”xml”] <bean id="myClass14BeanId" class="net.ycn.myapp.mymodule.domain.MyClass14"> <constructor-arg ref="myClass12BeanId" /> </bean> <bean id="myClass12BeanId" class="net.ycn.myapp.mymodule.domain.MyClass12" /> [/code] Buradan Spring DI ile Constructor Injection kullanmış olduk ve decoupled bir yapıda işi Spring’e yaptırmış olduk. Herhangi bir sınıf içerisinde ise MyClass14 sınıfının instance’ını elde etmek için setter metodunu yazabilir (veya @Autowired) ve aşağıdaki gibi doğrudan kullanabilirsiniz. Test aşamasında [code lang=”java”] public class MyClass21Test { public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext(spring-context.xml"); // MyClass14 myClass14 = appContext.getBean("myClass14BeanId", MyClass14.class); MyClass14 myClass14 = (MyClass14) appContext.getBean("myClass14BeanId"); myClass14.do14(); } } [/code] veya uygulamanızı ayağa kaldırdığınızda ise ilgili sınıfta ApplicationContext işlemleri yapmanıza gerek kalmaz, bunu sizin yerinize Web-Servlet konteyneri/Uygulama Sunucunuz yapacaktır ve siz sadece MyClass14 sınıfındaki myClass14.do14() metodunu çağırın, sonuç çıktınız myClass12.do()’nun sonucu olacaktır. Daha detaylı bilgi için aşağıdaki bağlantı adreslerini de inceleyebilirsiniz. injavawetrust.com geeksforgeeks.org blog.frankel.ch java4s.com veya farklı bir bakış açısı için ise yegor256.com]]>

Leave a Reply

Your email address will not be published. Required fields are marked *