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

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.

主站蜘蛛池模板: 荣昌县| 宣城市| 庆阳市| 刚察县| 苗栗县| 日土县| 威远县| 抚州市| 开原市| 宣武区| 罗平县| 桐庐县| 西乌| 仁寿县| 阿拉善右旗| 梅河口市| 怀集县| 清苑县| 阳谷县| 巨鹿县| 电白县| 洛浦县| 凤城市| 弋阳县| 阜康市| 鄂伦春自治旗| 安平县| 凉城县| 靖宇县| 韶山市| 临城县| 洞头县| 襄樊市| 余庆县| 开江县| 茶陵县| 夏邑县| 磐安县| 五莲县| 青海省| 长白|