EJB

EJB 8 – Interceptors

Merhabalar arkadaşlar. EJB Timer Service 1 ve Timer Service 2 yazılarının ardından bu yazıda EJB ile doğrudan alakası olmayan fakat Java EE mekanizması içerisinde yer aldığı için bu yazıda anlatmak istediğim Interceptor kullanımını öğreneceğiz. Interceptor bir metodun tetiklenmesi ile aynı anda başka metodu otomatik olarak çağırmak ve çalıştırmak istediğimizde bu işi yerine getiren mekanizmadır.  Şöyle düşünelim ki birkaç  metot tetiklendiğinde aynı işi yapan bazı blokları olacak. Biz aynı kısımları bir metoda toplayıp Interceptor ile metotlar tetiklendiğinde gerekli işlemleri yine yaptırabiliriz, böylece kod kalabalığından kurtuluruz ve bakımı da kolaylaştırılmış olur. Şimdi örnek kod ile kullanımını öğrenelim. Örneğimiz basit JSF kodları ile entegredir.

index.xhtml Kodu

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>EJB Interceptor Örneği</title>
    </h:head>
    <h:body>
        <h:form>
            <h:commandButton value="EJB Metod 1" actionListener="#{jsfManagedBean.callInterceptorMethod1}"/>
            <h:commandButton value="EJB Metod 2" actionListener="#{jsfManagedBean.callInterceptorMethod2}"/>
        </h:form>
    </h:body>
</html>

Xhtml sayfamız içinde EJB sınıfımız içindeki metotları çağıracak 2 metodumuz yer alıyor.

JsfManagedBean.java

package ejbInterceptor;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ActionEvent;

@ManagedBean
@RequestScoped
public class JsfManagedBean {
    @EJB
    private InterceptorBeanLocal interceptorBeanLocalObject;
    
    public void callInterceptorMethod1(ActionEvent event)
    {
        interceptorBeanLocalObject.ejbMethod1();
    }
    
    public void callInterceptorMethod2(ActionEvent event)
    {
        interceptorBeanLocalObject.ejbMethod2();
    }
}

JSF Managed Bean sınıfımız içinde önceki derslerden hayırlayacağımız üzere @EJB notasyonu ile bağımlılık enjektesi yapıyoruz ve EJB sınıf içindeki metotları çağıracak 2 metot yazıyoruz.

InterceptorEJBBean.java

package ejbInterceptor;

import javax.ejb.Stateless;
import javax.interceptor.Interceptors;

@Interceptors({InterceptorClass.class})
@Stateless
public class InterceptorEJBBean implements InterceptorBeanLocal {

    @Override
    public void ejbMethod1() {
        System.out.println("Ejb Metot 1 Tetiklendi");
    }
    
    @Override
    public void ejbMethod2() {
        System.out.println("Ejb Metot 2 Tetiklendi");
    }
}

InterceptorEJBBean sınıfımızı InterceptorBeanLocal interface’inden implement ettik ve içinde yazılı 2 metodu Override ettik. Burada bu dersi ilgilendiren ve dikkat etmemiz gereken nokta @Interceptors notasyonu. Bu notasyon ile biz bu EJB Bean içinde bir metodun tetiklenmesi ile beraber başka bir sınıf içinde yer alan metodun tetiklenmesini sağlayabiliriz. @Interceptors notasyonu parametre olarak hangi sınıfı bu EJB sınıfı ile parelel koşturacaksak o sınıfı parametre olarak alır. Burada tabii rastgele bir sınıf kullanılamaz. Onun da bir notasyon ile işaretlenmesi lazım.

InterceptorBeanLocal.java

package ejbInterceptor;

import javax.ejb.Local;

@Local
public interface InterceptorBeanLocal {
    public void ejbMethod1();
    public void ejbMethod2();
}

InterceptorClass.java

package ejbInterceptor;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class InterceptorClass {
    @AroundInvoke
    public Object interceptorMethod(InvocationContext context) throws Exception
    {
        System.out.println("Interceptor Metot Tetiklendi!"+context.getMethod().getName());
        return context.proceed();
    }
}

InterceptorClass içinde bu sınıfı ilişkilendirdiğimiz EJB sınıfı içinde metot tetiklendiğinde onunla beraber çalışacak metot hangisi ise onu @AroundInvoke notasyonu ile işaretliyoruz.  Bu notasyon sayesinde farklı metotların yapacağı aynı işler bir araya toplanır ve kod kalabalığı ortadan kalkar. interceptorMethod metodu parametre olarak bir adet InvocationContext nesnesi alıyor. Bu nesne @Interceptors ile işaretlenmiş sınıfdan bir takım bilgileri bu metoda taşır. Dönüş tipi olarak da Object kullanır bu metot.

Ekran Çıktıları

Screen Shot 2015-11-28 at 20.07.50

Proje çalıştığında gelen ekran çıktısı. Şimdi EJB Metod 1 butonuna tıklıyorum.

Screen Shot 2015-11-28 at 20.10.43

Çıktıdan görebildiğimiz gibi EJB sınıfımız içinde metot 1 çağırılma işlemi gerçekleştildiği anda @AroundInvoke notasyonu ile işaretlenmiş metot tetiklendi ve hangi metodun tetiklendiği yazıldı. Şimdi Metot 2 butonuna tıklıyorum.

Screen Shot 2015-11-28 at 20.16.58

Yine aynı şekilde metot devreye girdi ve çağırılan metodun adını verdi.

Bu yazıda Java EE içindeki mekanizmalardan biri olan Interceptor kullanımını öğrenmiş olduk arkadaşlar. Gelecek yazıda görüşmek üzere sağlıcakla kalın arkadaşlar.

Yorum Yap