在同一个注入点上使用多个@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:墙壁上。