如何在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处理。