2014-05-06 2 views
1

У нас есть сценарий, в котором зависимость должна быть определена во время выполнения. Пример показывает деталь ниже:Как добиться динамической инъекции зависимостей весной?

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 
     } 
    } 
} 

Есть возможность вводить Validator динамически с Spring IOC, или может быть решена только с помощью шаблона фабрики?

+1

Какова логика, определяющая, какой валидатор использовать? (вы сказали «версия сервиса», но я не вижу «сервиса» в вашем коде) –

+0

По версии я имею в виду api-версию. В этом примере, скажем, у нас есть две версии «Заказ». версия 2.0 имеет большее количество полей, и для нее требуется отдельный валидатор, чем версия 1.0 с меньшими полями. В нашем приложении у нас уже есть 2 валидатора, но нам нужно знать механизм, как правильно вводить правильный валидатор с использованием весны. Остальная бизнес-логика для нас одинакова, поэтому ее обрабатывает тот же OrderProcessor. – Bharimalla

ответ

0

Это еще немного неясно для меня ваш сценарий, но я предполагаю, что у вас есть два реальных класса заказа в вашем проекте. Возможно, это один из пакетов com.foo.api1, а другой - в пакете com.foo.api2. Или один заказ называется Order1, а другой называется Order2. Идея состоит в том, что я предполагаю, что у вас есть два разных класса для двух «api-версий» Order.

Вы можете добиться того, что вам нужно с помощью 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 и, в зависимости от того, что параметр получает, он вызывает один валидатор или другой.

Смежные вопросы