Załóżmy, że nasza aplikacja chce odnotować w dowolnym miejscu moment operacji na obiekcie użytkownika. Należy w tym celu wstrzyknąć obiekt javax.enterprise.event.Event i wywołać na nim metodę fire(). Jej argumentem, będzie obiekt, który ma podlegać obserwacji.
@Named @RequestScoped public class UserBean{ private Listusers; @Inject Event createUserEvent; @PostConstruct private void init(){ users = new ArrayList (); users.add(new User("Nowak")); users.add(new User("Lis")); } public void addUser(){ User user = new User("Kowalski"); users.add(user); createUserEvent.fire(user); } }
Teraz wystarczy już w dowolnym miejscu aplikacji zaimplementować metodę nasłuchującą, będącą odbiorcą powyższego zdarzenia
@Named @RequestScoped public class UserObserver { public void onCreateUser(@Observes User user){ System.out.println(">> User "+ user.getName() + " has been created"); } }
A co w przypadku gdybyśmy chcieli obserwować kilka różnych zdarzeń na obiekcie User ? Tutaj znowu z pomocą przychodzą kwalifikatory
@Qualifier @Retention(RUNTIME) @Target({METHOD, FIELD, PARAMETER, TYPE}) public @interface CreateUser { }
@Qualifier @Retention(RUNTIME) @Target({METHOD, FIELD, PARAMETER, TYPE}) public @interface DeleteUser { }
Zmodyfikowana klasa obserwująca
import javaspotlight.qualifiers.CreateUser; import javaspotlight.qualifiers.DeleteUser; import javax.enterprise.event.Observes; import javax.faces.bean.RequestScoped; import javax.inject.Named; @Named @RequestScoped public class UserObserver { public void onCreateUser(@Observes @CreateUser User user){ System.out.println(">> User "+ user.getName() + " has been created"); } public void onDeleteUser(@Observes @DeleteUser User user){ System.out.println(">> User "+ user.getName() + " has been deleted"); } }
Sposób inicjacji zdarzeń – oczywiście nie muszą znajdować się one w tej samej klasie
import java.util.ArrayList; import java.util.List; import javaspotlight.qualifiers.CreateUser; import javaspotlight.qualifiers.DeleteUser; import javax.annotation.PostConstruct; import javax.enterprise.event.Event; import javax.faces.bean.RequestScoped; import javax.inject.Inject; import javax.inject.Named; @Named @RequestScoped public class UserBean{ private Listusers; @Inject @CreateUser Event createUserEvent; @Inject @DeleteUser Event deleteUserEvent; @PostConstruct private void init(){ users = new ArrayList (); users.add(new User("Nowak")); users.add(new User("Lis")); } public void addUser(){ User user = new User("Kowalski"); users.add(user); createUserEvent.fire(user); } public void removeUser(){ for(User user : users){ if("Nowak".equals(user.getName())){ deleteUserEvent.fire(user); users.remove(user); } } }