使用限定符自动装配特定的 bean 实例

如果你有多个相同接口的实现,Spring 需要知道它应该自动装入一个类。我将在此示例中使用 Validator 模式。 1

Foo 类:

public class Foo {
     private String name;
     private String emailAddress;
     private String errorMessage;
     /** Getters & Setters omitted **/
}

接口:

public interface FooValidator {
    public Foo validate(Foo foo);
}

名称验证器类:

@Component(value="FooNameValidator")
public class FooNameValidator implements FooValidator {
    @Override
    public Foo validate(Foo foo) {
        //Validation logic goes here.
    }
}

电子邮件验证员类:

@Component(value="FooEmailValidator")
public class FooEmailValidator implements FooValidator {
    @Override
    public Foo validate(Foo foo) {
        //Different validation logic goes here.
    }
}

你现在可以将这些验证器单独自动装配到一个类中。

接口:

public interface FooService {
    public void handleFoo(Foo foo);
}

类:

@Service
public class FooServiceImpl implements FooService {
    /** Autowire validators individually **/
    @Autowired
    /* 
     * Notice how the String value here matches the value 
     * on the @Component annotation? That's how Spring knows which 
     * instance to autowire.
     */
    @Qualifier("FooNameValidator")
    private FooValidator nameValidator;

    @Autowired
    @Qualifier("FooEmailValidator")
    private FooValidator emailValidator;

    @Override
    public void handleFoo(Foo foo) {
        /**You can use just one instance if you need**/
        foo = nameValidator.validate(foo);
    }   
}

值得注意的是,如果在 Spring IoC 容器中有多个接口实现,并且没有指定要与 @Qualifier 注释一起使用哪个接口,Spring 会在尝试启动时抛出异常,因为它不会知道要使用哪个实例。

1:这不是进行这种简单验证的正确方法。这是一个关于自动装配的简单示例。如果你想要一个更简单的验证方法的想法,请查看 Spring 如何使用注释进行验证。