如何在spring中实现动态依赖项注入?

如何在spring中实现动态依赖项注入?,spring,dependency-injection,Spring,Dependency Injection,我们有一个场景,依赖关系应该在运行时确定。下面的示例显示了详细信息: public class OrderProcessor { // The Validator should be determinded based on the version of the service. private Validator orderProcessValidator; public Confirmation process(Order order) { if(

我们有一个场景,依赖关系应该在运行时确定。下面的示例显示了详细信息:

public class OrderProcessor {
    // The Validator should be determinded based on the version of the service. 
    private Validator orderProcessValidator;

    public Confirmation process(Order order) {
        if(orderProcessValidator.validate(order)) {
          // Business logic
        }
    }
}

是否可以使用Spring IOC动态注入
验证器
,或者只能通过工厂模式解决?

我仍然不清楚您的场景,但我假设您的项目中有两个实际的订单类。可能一个在com.foo.api1包中,另一个在com.foo.api2包中。或者一个订单称为Order1,另一个订单称为Order2。我的想法是假设Order的两个“api版本”有两个不同的类

您可以通过使用Spring AOP实现所需的功能:

@Aspect
@Component
public class MyAspect {
    @Autowired
    private Validator1 validator1;
    @Autowired
    private Validator2 validator2;

    @Pointcut("execution(* com.foo.bar.OrderProcessor.process(..))")
    private void myPointcut() {}

    @Around("myPointcut() && args(order)")
    public Object myAroundAdvice(ProceedingJoinPoint pjp, Object order) throws Throwable {
        if (order instanceof Order1) {
            validator1.validate((Order1) order);
        } else
        if (order instanceof Order2) {
            validator2.validate((Order2) order);
        }
        Object retVal = pjp.proceed();
        return retVal;
    }
}

@Component
public class OrderProcessor {
    public void process(Object order) {
        System.out.println("processing order");
    }
}

@Component
public class Validator1 {
    public void validate(Order1 order) {
        System.out.println("validating inside validator 1");
    }
}

@Component
public class Validator2 {
    public void validate(Order2 order) {
        System.out.println("validating inside validator 2");
    }
}

因此,基本上,您正在定义一个方面,该方面应该拦截对OrderProcessor类的调用,并根据它接收到的参数调用一个或另一个验证器。

确定使用哪个验证器的逻辑是什么?(您说的是“服务的版本”,但我在代码中看不到“服务”)所谓版本,我指的是api版本控制。在这个例子中,假设我们有两个版本的“订单”。版本2.0有更多的字段,它需要一个单独的验证器,而版本1.0有更少的字段。在我们的应用程序中,我们已经有2个验证器,但我们需要知道一种机制,如何使用spring在正确的场景中注入正确的验证器。Rest业务逻辑对我们来说是相同的,所以它由相同的OrderProcessor处理。