1. 在同一個註入點上使用多個@Qualifiers來進一步區分
你可以使用多個限定註解來進一步區分你的註入目標。
我們定義限定註解SuperFast和StandardFrameRelaySwitchingFlubber來演示這個用法。那樣的話我們就有第二個傳輸器StandardFrameRelaySwitchingFlubber和SuperFast,我們要註入的傳輸器不僅有StandardFrameRelaySwitchingFlubber,還有SuperFast。
首先我們來定義限定註解,如下:
例 1. 定義新的SuperFast限定註解
package org.cdi.advocacy;
…
@Qualifier @Retention(RUNTIME) @Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface SuperFast {
}
例 2. 定義另一個新的StandardFrameRelaySwitchingFlubber限定註解
package org.cdi.advocacy;
…
@Qualifier @Retention(RUNTIME) @Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface StandardFrameRelaySwitchingFlubber {
}
OK,下面的代碼是給SuperFastAtmTransport同時使用@SuperFast和@StandardFrameRelaySwitchingFlubber限定註解。
例 3. SuperFastAtmTransport使用兩個限定註解
package org.cdi.advocacy;
@SuperFast @StandardFrameRelaySwitchingFlubber
public class SuperFastAtmTransport implements ATMTransport {
public void communicateWithBank(byte[] datapacket) {
System.out.println(“communicating with bank via the Super Fast transport ” );
}
}
Ok,我們也給StandardAtmTransport加上StandardFrameRelaySwitchingFlubber限定註解。
例 4. StandardAtmTransport使用一個限定註解
package org.cdi.advocacy;
@StandardFrameRelaySwitchingFlubber @Default
public class StandardAtmTransport implements ATMTransport {
public void communicateWithBank(byte[] datapacket) {
System.out.println(“communicating with bank via Standard transport”);
}
}
接下來,我希望我的自動櫃員機使用SuperFast傳輸並帶有StandardFrameRelaySwitchingFlubber,我必須在註入點同時使用它們,如下:
例 5. AutomatedTellerMachineImpl更改為使用兩個限定註解
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {
@Inject @SuperFast @StandardFrameRelaySwitchingFlubber
private ATMTransport transport;
…
deposit called
communicating with bank via the Super Fast transport
練習:創建一個具有@SuperFast, @StandardFrameRelaySwitchingFlubber 和 @Alternative的傳輸器。然後使用beans.xml激活SuperFast, StandardFrameRelaySwitchingFlubber, Alternative支持。通過CDI Group郵件列表發給我你的解決方案。第一發送的將會張貼在CDI墻壁上。
閱讀者練習:更改註入點限定,隻使用StandardAtmTransport。通過CDI Group郵件列表發給我你的解決方案。第一發送的將會張貼在CDI墻壁上。