如果您具有同一接口的多个实现,则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) { //验证逻辑在这里。 } }
电子邮件验证程序类别:
@Component(value="FooEmailValidator") public class FooEmailValidator implements FooValidator { @Override public Foo validate(Foo foo) { //这里有不同的验证逻辑。 } }
现在,您可以将这些验证器单独或一起自动连接到一个类中。
界面:
public interface FooService { public void handleFoo(Foo foo); }
班级:
@Service public class FooServiceImpl implements FooService { /** Autowire all classes implementing FooValidator interface**/ @Autowired private List<FooValidator> allValidators; @Override public void handleFoo(Foo foo) { /**You can use all instances from the list**/ for(FooValidator validator : allValidators) { foo = validator.validate(foo); } } }
值得注意的是,如果您在Spring IoC容器中有一个以上接口的实现,并且未指定要与@Qualifier注释一起使用的接口,那么Spring在尝试启动时会抛出异常,因为它不知道使用哪个实例。
1:这不是进行这种简单验证的正确方法。这是有关自动装配的简单示例。如果您想要一个更简单的验证方法的想法,请查看Spring如何使用批注进行验证。