使用限定符自動裝配特定的 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 如何使用註釋進行驗證。