IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  reklamver

Etiketlenen Kullanıcılar

1Beğeni(ler)
  • 1 Post By YazılımMimarı

Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 09 Eylül 2013, 12:43   #1
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Servlet ve Spring IOC Kullanımı




Bu yazımda, Java ve özellikle Java EE uygulamalarında sunduğu Dependency Injection, Transaction Management, AOP gibi birçok teknolojiyi basitleştirerek kullanmamıza olanak veren Spring Frameworkü, Java Servletler içerisinde nasıl kullanacağımızı anlatan birkaç önemli ipucuna değineceğim.

Bildiğiniz gibi Spring en temelde, POJO adını verdiğimiz Java classlarını kendi IOC containerı içerisinde yöneterek, uygulama bileşenlerinin bağımlılıklarını (dependencies) kontrol etmemize olanak veriyor. Dependency Injection adını verdiğimiz bu mekanizma sayesinde, sınıfların (servislerin) diğer sınıflara ya da servislere olan bağımlılıkları çok daha yönetilebilir oluyor. Bu yazının konusu Dependency Injection ve bunun sağladığı yararlar ve faydalar olmadığı için bu konuya derinlemesine değinmeyeceğim.

Yazının konusu, Spring’in en temelde sağladığı bu mekanizmayı, Java Servletler içerisinde nasıl kullanabileceğimizi kapsıyor.

Bildiğiniz gibi Java Servletler, bir Servlet Container tarafından instantiate edildiği için, Spring tarafından yönetilemezler. Spring, yönetemediği yani bir Spring Bean olmayan sınıflarda dependency injection gerçekleştiremez.

Peki Spring’in sunduğu bu özellikleri Java servletlerimizde nasıl kullanacağız? İşte bu yazıda servletleri bir Spring bean gibi nasıl kullanabileceğimizi ve bu sayede Spring’in sunduğu teknolojileri nasıl entegre edebileceğimizi gösteren birkaç noktaya değineceğim. Bu sürecin tam 4 farklı yöntemi mevcut ( En azından benim bildiğim).


Örneklere geçmeden önce, öncelikle neyi başarmak istediğimizi gösteren ufak bir senaryo hazırlamak istiyorum.

Öncelikle Spring bean olarak bir business sınıfımız olduğunu varsayalım. Ve bunu da aşağıdaki gibi tanımlayalım. Interface şu şekilde.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
public interface IMyBusiness { public String business(); }

Ve concrete sınıfımız da bu şekilde.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
@[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]ponent public class MyBusiness implements IMyBusiness { public MyBusiness() { } public String business() { return "Very Important thing!"; } }

Yapmak istediğimiz şey ise, yukarıdaki MyBusiness adındaki Spring Bean sınıfımızı, hazırladığımız MyServlet adındaki servlet içerisine @Autowired ile doğrudan inject etmek.

Artık yöntemlerimize geçebiliriz.

1 ) Spring HttpRequestHandler Interface kullanımı.

Springin sunduğu bu interface sayesinde, doğrudan HTTP isteklerini işleyebiliyoruz. Bunun için servlet oluştururken HttpServlet sınıfını extend etmemize de gerek yok. Oluşturduğumuz POJO sınıfı sadece HttpRequestHandler interfacesini implement etmesi yeterli.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
@[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]ponent("javaBlogRequestHandler") public class JavaBlogRequestHandler implements HttpRequestHandler{ @Autowired private IMyBusiness comp; @Override public void handleRequest(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html;charset=UTF-8"); res.getWriter().println("JavaBlogRequestHandler says : " + comp.business()); } }

Servletimizi bu şekilde tanımladıktan sonra artık gelen HTTP isteklerini rahatlıkla işleyebiliriz. Tabi web.xml dosyamıza eklememiz gereken birkaç satır daha var.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
<servlet> <display-name>JavaBlogRequestHandler</display-name> <servlet-name>javaBlogRequestHandler</servlet-name> <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>javaBlogRequestHandler</servlet-name> <url-pattern>/JavaBlogRequestHandler</url-pattern> </servlet-mapping>

Artık basit JavaBlogRequestHandler pojomuz, gelen Http isteklerini işleyebilen ve aynı zamanda bir spring bean olarak Spring’in sunduğu teknolojileri kullanabilen gelişmiş bir sınıfa dönüştü
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.


2 ) processInjectionBasedOnServletContext Yöntemi

Her ne kadar üstteki 1. yöntem en basiti gibi görünse de bazen HttpServlet sınıfını extend eden sınıflarda ya da daha önceden varolan servletlerimizde Spring teknolojilerini kulanmak isteyebiliriz. Bu gibi durumlar için Spring’in SpringBeanAutowiringSupport utility classı ile varolan servletimizi, Spring tarafından farkında olacak şekilde refactor edebiliyoruz.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
@[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]ervlet(name = "JavaBlogServletPlain", urlPatterns = {"/JavaBlogServletPlain"}) public class JavaBlogServletPlain extends HttpServlet { @Autowired private IMyBusiness my; @Override public void init(ServletConfig config) throws ServletException { super.init(config); SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext()); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { res.setContentType("text/html;charset=UTF-8"); res.getWriter().println("JavaBlogServletPlain says : " + my.business()); }

3 ) WebApplicationContext autowireBean() Yöntemi

Yine HttpServlet sınıfını extend ederek oluşturduğumuz servlet sınıflarımızın Spring teknolojilerini kullanmamız için Spring’in WebApplicationContext’ine servletimizi de tanıtmamız gerekiyor. Bunun için yine Spring’in context utility sınıflarını kullanıyoruz.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
@[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]ervlet(name = "JavaBlogServletPlain", urlPatterns = {"/JavaBlogServletPlain"}) public class JavaBlogServletPlain extends HttpServlet { @Autowired private IMyBusiness my; @Override public void init(ServletConfig config) throws ServletException { super.init(config); WebApplicationContext webContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); webContext.getAutowireCapableBeanFactory().autowireBean(this); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { res.setContentType("text/html;charset=UTF-8"); res.getWriter().println("JavaBlogServletPlain says : " + my.business()); } }

4 ) Context içerisinden Business classımızı doğrudan çağırmak.

Yine HttpServlet türü servletlerimiz için, Spring’in Web Application Context içerisinden Business nesnemizi manuel olarak çağırabiliriz. Tabi bu yöntemle servletimize inject edeceğimiz beanleri @Autowired ile deklare edemiyoruz. Bunun yerine Spring contextden, inject etmek istediğimiz Spring Beanleri doğrudan çağırıp referansa atama yapıyoruz.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
@[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]ervlet(name = "JavaBlogServletPlain", urlPatterns = {"/JavaBlogServletPlain"}) public class JavaBlogServletPlain extends HttpServlet { private IMyBusiness my; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { WebApplicationContext webContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); my = webContext.getBean(MyBusiness.class); res.setContentType("text/html;charset=UTF-8"); res.getWriter().println("JavaBlogServletPlain says : " + my.business()); } }

Arkadaşlar bu konu hakkında benim söyleyeceklerim bu kadar. Umarım ihtiyacı olanlara faydalı olur.

Alıntı

 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları eglen sohbet reklamver
Alt 21 Kasım 2013, 21:58   #2
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Cevap: Servlet ve Spring IOC Kullanımı




IOC, Spring'e has bir özellik değildir sadece bir yaklaşımdır. Temelinde ise, bağımlılık zerkeden sınıfların yaratılma safhasının geliştirici tarafından değilde framework tarafından sağlanmasıdır. Bu geliştiriciye mükemmel bir rahatlık sağlar. Çünkü siz bir service'i ayağa kaldırmak istediğinizde bunu new operatör yardımıyla yaparsınız fakat framework size yeni bir instance yaratmadan framework'ün injection yeteneği sayesinde Spring içinde @Autowired(service katmanı için) anotasyonu ile tanımlamanız yeterli olur. Instance'ı ayağa kaldırma olayını framework üstlenmiş olur
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.


Kısaca temelde budur.

 
Alıntı ile Cevapla

Cevapla

Etiketler
ioc, kullanımı, servlet, spring, ve


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
JSP/JSF/Servlet Yeni Başlayanlar için gerekli araç gereçler YazılımMimarı JSF/JSP/Servlet 0 15 Temmuz 2012 14:42