官术网_书友最值得收藏!

Enhancing events

CDI 1.1 had an event notification model, which has become popular among developers as it helps with the decoupling of code, following the observer pattern. Version 2.0 builds on this model and adds more enhancements, such as asynchronous event processing along with the ordering of events. To observe an event, the bean simply defines a method that has the @Observes annotation, and a parameter type that is used by CDI to identify the event type (class type), which should be passed to this method:

public void process(@Observes Task task) { }

Further restrictions on which events are passed to the observer method can be applied by using qualifiers at the injection point. Interestingly, the observer can work with generic types as well. Given the following two observers, the container will invoke the appropriate method based on the parameterized type of the event:

public void processTaskList(@Observes List<Task> taskList) { }
public void processTaskIds(@Observes List<Integer> taskIdList) { }

The raising of events is done using the Event interface methods for firing either synchronous or asynchronous events with a payload. The order in which the observers are called is not defined, unless the ordered events approach mentioned later is followed. It’s also possible to change the data in an observer, since the data (or payload) passed is not mandated to be immutable. Here's the relevant portion of the code snippet used for firing an event:

@Inject Event<Task> event;

public void doSomething() {
event.fire( new Task() );
}

The corresponding observer would be as follows:

public void handle(@Observes Task task) {
// can update the task instance
}

With CDI 2 offering asynchronous events and ordered events, let's explore each in more detail.

主站蜘蛛池模板: 铜梁县| SHOW| 灌阳县| 隆昌县| 昌平区| 汾阳市| 长汀县| 陈巴尔虎旗| 吴川市| 鄂托克前旗| 根河市| 志丹县| 北安市| 山丹县| 阳信县| 浙江省| 府谷县| 龙岩市| 吴川市| 额敏县| 海林市| 林周县| 莱西市| 九龙城区| 灌南县| 洞口县| 彭水| 枞阳县| 永胜县| 临夏县| 山阳县| 娄烦县| 扎赉特旗| 兰州市| 泽普县| 龙里县| 禄劝| 台北县| 广安市| 凤台县| 桐乡市|