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ı

Çı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.
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.