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ı