在同一個注入點上使用多個@Qualifiers來進一步區分
我們定義限定注解SuperFast和StandardFrameRelaySwitchingFlubber來演示這個用法。那樣的話我們就有第二個傳輸器StandardFrameRelaySwitchingFlubber和SuperFast,我們要注入的傳輸器不僅有StandardFrameRelaySwitchingFlubber,還有SuperFast。
// 定義新的SuperFast限定注解 package org.cdi.advocacy;
...
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface SuperFast {
}
// 定義另一個新的StandardFrameRelaySwitchingFlubber限定注解
package org.cdi.advocacy;
...
@Qualifier @Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface StandardFrameRelaySwitchingFlubber {
}
OK,下面的代碼是給SuperFastAtmTransport同時使用@SuperFast和@StandardFrameRelaySwitchingFlubber限定注解。
// 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限定注解。
// 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,我必須在注入點同時使用它們,如下:
// 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:墻壁上。